public static void Run(string meshPath, string finiteElementType, double accuracy) { var totalTimer = StartMeasuringTaskTime("Total"); var readInputTimer = StartMeasuringTaskTime("Read input files"); var mesh = Mesh.ReadFromFile($"{meshPath}.mesh"); ShowMeshParameters(mesh); StopAndShowTaskTime(readInputTimer); var calculationTimer = StartMeasuringTaskTime("Calculation"); var feSpace = CreateFiniteElementSpace(finiteElementType, mesh); var g = new LambdaVectorField(v => 0); var conditions = new Dictionary <int, IVectorField>() { [1] = g, [2] = g, [3] = g, [4] = g }; int stepCount = 20; double t = 0, dt = 1.0 / stepCount; var bilinearForm = new BilinearForm( (u, v, du, dv) => dt * Vector2.Dot(du, dv) + u * v); var solver = new ConjugateGradient(accuracy); IVectorField previous = new LambdaVectorField((x, y) => Sin(PI * x) * Sin(PI * y)); for (int i = 0; i < stepCount; i++) { t += dt; Func <Vector2, double> f = v => (1 + 2 * PI * PI) * Exp(t) * Sin(PI * v.x) * Sin(PI * v.y); var rhs = new LambdaVectorField(v => previous.GetValueAt(v, 0) + dt * f(v)); var laplaceEquation = new Problem(feSpace, conditions, bilinearForm, rhs, solver); previous = laplaceEquation.Solve(); } StopAndShowTaskTime(calculationTimer); var errorCalculationTimer = StartMeasuringTaskTime("Error calculation"); var solution = (FiniteElementVectorField)previous; Func <double, double, double> uExact = (x, y) => Exp(t) * Sin(PI * x) * Sin(PI * y); var error = CalculateError(feSpace, uExact, solution); Console.WriteLine($"L2 Error = {error}"); StopAndShowTaskTime(errorCalculationTimer); var outputTimer = StartMeasuringTaskTime("Output"); InOut.WriteSolutionToFile($"{meshPath}.sol", mesh, solution); StopAndShowTaskTime(outputTimer); StopAndShowTaskTime(totalTimer); }
public static void Run(string meshPath, string finiteElementType, double accuracy) { var totalTimer = StartMeasuringTaskTime("Total"); var readInputTimer = StartMeasuringTaskTime("Read input files"); var mesh = Mesh.ReadFromFile($"{meshPath}.mesh"); ShowMeshParameters(mesh); StopAndShowTaskTime(readInputTimer); var calculationTimer = StartMeasuringTaskTime("Calculation"); var feSpace = CreateFiniteElementSpace(finiteElementType, mesh); var g = new LambdaVectorField(v => 0); var conditions = new Dictionary <int, IVectorField>() { [1] = g, [2] = g, [3] = g, [4] = g }; var bilinearForm = new BilinearForm( (u, v, du, dv) => Vector2.Dot(du, dv) + u * v); var rhs = new LambdaVectorField((x, y) => (1 + 2 * PI * PI) * Sin(PI * x) * Sin(PI * y)); var solver = new ConjugateGradient(accuracy); var poisson = new Problem(feSpace, conditions, bilinearForm, rhs, solver); var solution = poisson.Solve(); StopAndShowTaskTime(calculationTimer); var errorCalculationTimer = StartMeasuringTaskTime("Error calculation"); Func <double, double, double> uExact = (x, y) => Sin(PI * x) * Sin(PI * y); var error = CalculateError(feSpace, uExact, solution); Console.WriteLine($"L2 Error = {error}"); StopAndShowTaskTime(errorCalculationTimer); var outputTimer = StartMeasuringTaskTime("Output"); InOut.WriteSolutionToFile($"{meshPath}.sol", mesh, solution); StopAndShowTaskTime(outputTimer); StopAndShowTaskTime(totalTimer); }