From 7eb9358a2bc691e4995a3e1c28740d5a86c19770 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Mon, 11 Jul 2016 22:37:57 +0200 Subject: [PATCH] Tests: Check if ignoreNodes are honoured --- dune/solvers/test/cgsteptest.cc | 30 ++++++++++++++++++++++++++++++ dune/solvers/test/gssteptest.cc | 30 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/dune/solvers/test/cgsteptest.cc b/dune/solvers/test/cgsteptest.cc index cfb69a51..75688f53 100644 --- a/dune/solvers/test/cgsteptest.cc +++ b/dune/solvers/test/cgsteptest.cc @@ -148,6 +148,36 @@ struct CGTestSuite passed &= analyser.analyse(u_copy, testCase); } + + // Test that ignoreNodes are honoured. + { + typename Problem::Vector u_copy = p.u; + for (size_t i = 0; i < p.u.size(); ++i) + if (p.ignore[i].any()) + u_copy[i] += 1.0; + typename Problem::Vector rhs_copy = p.rhs; + + Dune::Solvers::CGStep<typename Problem::Matrix, + typename Problem::Vector> + cgStep(p.A, u_copy, rhs_copy); + cgStep.setIgnore(p.ignore); + ::LoopSolver<typename Problem::Vector> solver( + &cgStep, maxIterations, stepTol, &p.energyNorm, Solver::QUIET, + relativeErrors); + solver.check(); + solver.preprocess(); + solver.solve(); + + for (size_t i = 0; i < p.u.size(); ++i) + if (p.ignore[i].any()) + if (std::abs(u_copy[i] - 1.0 - p.u_ex[i]) > solveTol) { + std::cerr << "### error: ignoredNodes not respected!" + << std::endl; + passed = false; + break; + } + } + return passed; } }; diff --git a/dune/solvers/test/gssteptest.cc b/dune/solvers/test/gssteptest.cc index 2db92139..ebe7fc66 100644 --- a/dune/solvers/test/gssteptest.cc +++ b/dune/solvers/test/gssteptest.cc @@ -156,6 +156,36 @@ struct GSTestSuite { } } + // Test that ignoreNodes are honoured. + { + auto gsStep = Dune::Solvers::BlockGSStepFactory<Matrix, Vector>::create( + Dune::Solvers::BlockGS::LocalSolvers::ldlt(0.0)); + + Vector u_copy = p.u; + for (size_t i = 0; i < p.u.size(); ++i) + for (size_t j = 0; j < blocksize; ++j) + if (p.ignore[i][j]) + u_copy[i][j] += 1.0; + + gsStep.setProblem(p.A, u_copy, p.rhs); + gsStep.setIgnore(p.ignore); + LoopSolver solver(&gsStep, 2000, 1e-8, &p.energyNorm, Solver::QUIET, + relativeErrors); + solver.check(); + solver.preprocess(); + solver.solve(); + + for (size_t i = 0; i < p.u.size(); ++i) + for (size_t j = 0; j < blocksize; ++j) + if (p.ignore[i][j]) + if (std::abs(u_copy[i][j] - 1.0 - p.u_ex[i][j]) > 1e-8) { + std::cerr << "### error: ignoredNodes not respected!" + << std::endl; + passed = false; + break; + } + } + // test projected block GS if (trivialDirichletOnly) // TODO: missing feature in ProjectedBlockGS { -- GitLab