diff --git a/dune/solvers/test/gssteptest.cc b/dune/solvers/test/gssteptest.cc index 4552f71f54fae85bbf0cc6c6052e042f460dadcc..089d7e56ee8e12441044479dbe9c7edfd23d998b 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;