From ae2acb3f6d2e290bb9fa4fa45db9c2aa1d3d2cb9 Mon Sep 17 00:00:00 2001
From: Max Kahnt <max.kahnt@fu-berlin.de>
Date: Mon, 22 Feb 2016 10:47:46 +0100
Subject: [PATCH] Add ProjectedBlockGSStep test.

---
 dune/solvers/test/gssteptest.cc | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/dune/solvers/test/gssteptest.cc b/dune/solvers/test/gssteptest.cc
index 4552f71f..089d7e56 100644
--- a/dune/solvers/test/gssteptest.cc
+++ b/dune/solvers/test/gssteptest.cc
@@ -11,6 +11,7 @@
 
 #include <dune/solvers/solvers/loopsolver.hh>
 #include <dune/solvers/iterationsteps/blockgsstep.hh>
+#include <dune/solvers/iterationsteps/projectedblockgsstep.hh>
 #include <dune/solvers/iterationsteps/semidefiniteblockgsstep.hh>
 
 #include "common.hh"
@@ -55,7 +56,7 @@ struct GSTestSuite
   bool check(const GridType& grid)
   {
     double stepTol    = 1e-12; // termination criterion
-    double solveTol   = 1e-6;  // error in the solution
+    double solveTol   = 1.3e-5;  // error in the solution
     int maxIterations = 10000;
 
     bool passed = true;
@@ -97,6 +98,27 @@ struct GSTestSuite
       test(&gsStep, "BlockGS");
     }
 
+    {
+      size_t size = p.u.size();
+      using GSStep = ProjectedBlockGSStep<Matrix, Vector>;
+      ProjectedBlockGSStep<Matrix, Vector> gsStep;
+      typename GSStep::HasObstacle hasObstacle(size, false);
+      gsStep.hasObstacle_ = &hasObstacle;
+      test(&gsStep, "ProjectedBlockGS w/o obstacle");
+
+      hasObstacle.setAll();
+      std::vector<typename GSStep::Obstacle> obstacles(size);
+      for(size_t i=0; i<size; ++i) {
+        hasObstacle[i] = true;
+        for(size_t j=0; j<Vector::block_type::dimension; ++j) {
+          obstacles[i].lower(j) = j;
+          obstacles[i].upper(j) = j+1;
+        }
+      }
+      gsStep.obstacles_ = &obstacles;
+      test(&gsStep, "ProjectedBlockGS w obstacle");
+    }
+
     for(auto reg : {false, true}) {
       for(auto type : {"direct", "ldlt", "cg"}) {
         Dune::ParameterTree config;
-- 
GitLab