diff --git a/dune/solvers/test/gssteptest.cc b/dune/solvers/test/gssteptest.cc index ebe7fc662cd6b21923de3b642073ba817bcd6678..763e11d0b30142927df04ed9e032e906949a56ed 100644 --- a/dune/solvers/test/gssteptest.cc +++ b/dune/solvers/test/gssteptest.cc @@ -51,9 +51,8 @@ struct GSTestSuite { using LoopSolver = ::LoopSolver<Vector>; using Step = LinearIterationStep<Matrix, Vector>; - auto solve = [&](Step* step, double stepTol, size_t maxIterations) { - Vector u_copy = p.u; - step->setProblem(p.A, u_copy, p.rhs); + auto solve = [&](Step* step, Vector u_init, double stepTol, size_t maxIterations) { + step->setProblem(p.A, u_init, p.rhs); step->setIgnore(p.ignore); LoopSolver solver(step, maxIterations, stepTol, &p.energyNorm, verbosity, @@ -62,7 +61,7 @@ struct GSTestSuite { solver.preprocess(); solver.solve(); - return u_copy; + return u_init; }; auto analyse = @@ -80,20 +79,20 @@ struct GSTestSuite { }; auto test = [&](Step* step, std::string name) { - auto result = solve(step, 1e-12, 2000); + auto result = solve(step, p.u_ex, 1e-12, 2000); passed &= analyse(result, name, 1e-7); }; auto diffTest = [&](Step* step1, std::string name1, Step* step2, std::string name2, double maxDiff = 0.0) { - auto result1 = solve(step1, 0.0, 5); - auto result2 = solve(step2, 0.0, 5); + auto result1 = solve(step1, p.u_ex, 0.0, 5); + auto result2 = solve(step2, p.u_ex, 0.0, 5); - result1 -= result2; - if (result1.two_norm() > maxDiff) { + auto normDiff = p.energyNorm.diff(result1, result2); + if (normDiff > maxDiff) { passed = false; std::cerr << name1 << " and " << name2 << " differ with norm " - << result1.two_norm() << "." << std::endl; + << normDiff << "." << std::endl; return; } std::cout << Dune::formatString("%*s", -60, name1.c_str()) << " and " @@ -167,13 +166,7 @@ struct GSTestSuite { 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(); + solve(&gsStep, u_copy, 1e-12, 2000); for (size_t i = 0; i < p.u.size(); ++i) for (size_t j = 0; j < blocksize; ++j)