From a8067f1f7fc480a9264b833e6754e7cb1bb2b491 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Sun, 21 Jul 2013 21:35:41 +0200
Subject: [PATCH] [Extend]  Give each solver its own parameters

The solvers for u0/a0 and v now each have parameters tolerance,
maximumIterations, verbosity
---
 src/one-body-sample.cc     | 33 ++++++++++++++++++---------------
 src/one-body-sample.parset | 16 +++++++++++++++-
 2 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index a15db2f8..8f1d7ab4 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -363,19 +363,19 @@ int main(int argc, char *argv[]) {
                                             refinements, *grid,
                                             displacementDirichletNodes);
       auto multigridStep = displacementFactory.getSolver();
-      auto const verbosity = parset.get<Solver::VerbosityMode>("io.verbosity");
 
       typename LinearFactoryType::ConvexProblemType myConvexProblem(
           1.0, A, zeroNonlinearity, ell, u_initial);
       typename LinearFactoryType::BlockProblemType initialDisplacementProblem(
           parset, myConvexProblem);
 
+      Dune::ParameterTree const &localParset = parset.sub("u0.solver");
       multigridStep->setProblem(u_initial, initialDisplacementProblem);
       LoopSolver<VectorType> initialDisplacementProblemSolver(
-          multigridStep,
-          parset.get<size_t>("solver.tnnmg.maxiterations"), // FIXME
-          1e-12,                                            // FIXME
-          &ANorm, verbosity, false);                        // absolute error
+          multigridStep, localParset.get<size_t>("maximumIterations"),
+          localParset.get<double>("tolerance"), &ANorm,
+          localParset.get<Solver::VerbosityMode>("verbosity"),
+          false); // absolute error
 
       initialDisplacementProblemSolver.preprocess();
       initialDisplacementProblemSolver.solve();
@@ -411,23 +411,23 @@ int main(int argc, char *argv[]) {
         // instead of multiplying M by (1.0 - wc), we divide the RHS
         accelerationRHS *= -1.0 / (1.0 - wc);
       }
-      LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"),
+      LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"), // FIXME
                                             refinements, *grid,
                                             accelerationDirichletNodes);
       auto multigridStep = accelerationFactory.getSolver();
-      auto const verbosity = parset.get<Solver::VerbosityMode>("io.verbosity");
 
       typename LinearFactoryType::ConvexProblemType myConvexProblem(
           1.0, M, zeroNonlinearity, accelerationRHS, a_initial);
       typename LinearFactoryType::BlockProblemType initialAccelerationProblem(
           parset, myConvexProblem);
 
+      Dune::ParameterTree const &localParset = parset.sub("a0.solver");
       multigridStep->setProblem(a_initial, initialAccelerationProblem);
       LoopSolver<VectorType> initialAccelerationProblemSolver(
-          multigridStep,
-          parset.get<size_t>("solver.tnnmg.maxiterations"), // FIXME
-          1e-12,                                            // FIXME
-          &MNorm, verbosity, false);                        // absolute error
+          multigridStep, localParset.get<size_t>("maximumIterations"),
+          localParset.get<double>("tolerance"), &MNorm,
+          localParset.get<Solver::VerbosityMode>("verbosity"),
+          false); // absolute error
 
       initialAccelerationProblemSolver.preprocess();
       initialAccelerationProblemSolver.solve();
@@ -435,7 +435,6 @@ int main(int argc, char *argv[]) {
     // }}}
 
     // Set up TNNMG solver
-    auto const solverTolerance = parset.get<double>("solver.tolerance");
     using NonlinearFactoryType = SolverFactory<
         dims,
         MyBlockProblem<ConvexProblem<
@@ -444,7 +443,6 @@ int main(int argc, char *argv[]) {
     NonlinearFactoryType factory(parset.sub("solver.tnnmg"), refinements, *grid,
                                  velocityDirichletNodes);
     auto multigridStep = factory.getSolver();
-    auto const verbosity = parset.get<Solver::VerbosityMode>("io.verbosity");
 
     {
       std::fstream coordinateWriter("coordinates", std::fstream::out);
@@ -481,6 +479,11 @@ int main(int argc, char *argv[]) {
     auto const requiredReduction =
         parset.get<double>("solver.requiredReduction");
     auto const printProgress = parset.get<bool>("io.printProgress");
+    auto const verbosity =
+        parset.get<Solver::VerbosityMode>("v.solver.verbosity");
+    auto const maximumIterations =
+        parset.get<size_t>("v.solver.maximumIterations");
+    auto const tolerance = parset.get<double>("v.solver.tolerance");
     for (size_t run = 1; run <= timesteps; ++run) {
       VectorType u;
       double lastCorrection;
@@ -500,8 +503,8 @@ int main(int argc, char *argv[]) {
                                 velocityMatrix);
 
       LoopSolver<VectorType> velocityProblemSolver(
-          multigridStep, parset.get<size_t>("solver.tnnmg.maxiterations"),
-          solverTolerance, &AMNorm, verbosity, false); // absolute error
+          multigridStep, maximumIterations, tolerance, &AMNorm, verbosity,
+          false); // absolute error
 
       size_t iterationCounter;
       auto solveVelocityProblem = [&](VectorType &_velocityIterate,
diff --git a/src/one-body-sample.parset b/src/one-body-sample.parset
index 2f7e9abc..680ec3a8 100644
--- a/src/one-body-sample.parset
+++ b/src/one-body-sample.parset
@@ -1,6 +1,5 @@
 # -*- mode:conf -*-
 [io]
-verbosity     = quiet
 printProgress = false
 enableTimer   = false
 writeVTK      = false
@@ -32,6 +31,21 @@ scheme = newmark
 [grid]
 refinements = 4
 
+[u0.solver]
+tolerance         = 1e-10
+maximumIterations = 100000
+verbosity         = quiet
+
+[a0.solver]
+tolerance         = 1e-10
+maximumIterations = 100000
+verbosity         = quiet
+
+[v.solver]
+tolerance         = 1e-10
+maximumIterations = 100000
+verbosity         = quiet
+
 [solver]
 tolerance         = 1e-10
 damping           = 0.5
-- 
GitLab