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