From 9b2904058f5b18c2339622139e5e17dc6b9574e6 Mon Sep 17 00:00:00 2001 From: Michael Innerberger <michael.innerberger@asc.tuwien.ac.at> Date: Wed, 19 Jul 2023 05:03:14 -0400 Subject: [PATCH] Document testing of old vs new MG implementation --- lib/solvers/LowestOrderLocalMg.m | 15 +++++++++++++++ lib/solvers/chooseIterativeSolver.m | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/solvers/LowestOrderLocalMg.m b/lib/solvers/LowestOrderLocalMg.m index cde8fb1..af46146 100644 --- a/lib/solvers/LowestOrderLocalMg.m +++ b/lib/solvers/LowestOrderLocalMg.m @@ -25,6 +25,7 @@ classdef LowestOrderLocalMg < MGSolver freeVertices freeVerticesOld changedPatches + otherSolver end %% event data @@ -55,9 +56,11 @@ classdef LowestOrderLocalMg < MGSolver obj.blf = blf; obj.listenerHandle = mesh.listener('IsAboutToRefine', @obj.getChangedPatches); + obj.otherSolver = OptimalVcycleMultigridSolver(P1JacobiSmoother(fes, blf, P)); end function setupSystemMatrix(obj, A) + obj.otherSolver.setupSystemMatrix(A); obj.nLevels = obj.nLevels + 1; L = obj.nLevels; @@ -76,6 +79,18 @@ classdef LowestOrderLocalMg < MGSolver function setupRhs(obj, b, varargin) setupRhs@MGSolver(obj, b, varargin{:}); + obj.otherSolver.setupRhs(b, varargin{:}); + end + + function step(obj) + obj.otherSolver.applyStoppingCriterion(); + obj.otherSolver.step(); + step@MGSolver(obj); + + assert(all(abs(obj.Cresidual - obj.otherSolver.Cresidual) < 1e-8, 'all')) + assert(all(abs(obj.residualCNorm - obj.otherSolver.residualCNorm.^2) < 1e-8, 'all')) + assert(all(abs(obj.iterationCount - obj.otherSolver.iterationCount) < 1e-8, 'all')) + assert(all(abs(obj.x - obj.otherSolver.x) < 1e-8, 'all')) end % Geometric MultiGrid diff --git a/lib/solvers/chooseIterativeSolver.m b/lib/solvers/chooseIterativeSolver.m index fa30db2..02d735c 100644 --- a/lib/solvers/chooseIterativeSolver.m +++ b/lib/solvers/chooseIterativeSolver.m @@ -53,13 +53,13 @@ switch class switch variant case {"", "lowOrderVcycle"} if order == 1 - solver = OptimalVcycleMultigridSolver(P1JacobiSmoother(fes, blf, P)); + solver = LowestOrderLocalMg(fes, blf, P); else solver = LocalMgLowOrderVcycle(fes, blf); end case "highOrderVcycle" if order == 1 - solver = OptimalVcycleMultigridSolver(P1JacobiSmoother(fes, blf, P)); + solver = LowestOrderLocalMg(fes, blf, P); else solver = LocalMgHighOrderVcycle(fes, blf, P); end -- GitLab