From dd0052d725db637f1f2c0562beef2c05b48d99ba Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Wed, 17 Jul 2013 19:04:00 +0200
Subject: [PATCH] [Algorit] Use TNNMG for the initial acceleration

---
 src/mysolver_tmpl.cc   |  6 ++++++
 src/one-body-sample.cc | 40 ++++++++++++++++++++++++++++++----------
 2 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/src/mysolver_tmpl.cc b/src/mysolver_tmpl.cc
index a4e7953f..26ef6cc9 100644
--- a/src/mysolver_tmpl.cc
+++ b/src/mysolver_tmpl.cc
@@ -13,10 +13,12 @@
 #include <dune/istl/bcrsmatrix.hh>
 #include <dune/istl/bvector.hh>
 
+#include <dune/tnnmg/nonlinearities/zerononlinearity.hh>
 #include <dune/tnnmg/problem-classes/convexproblem.hh>
 
 #include <dune/tectonic/globalnonlinearity.hh>
 #include <dune/tectonic/myblockproblem.hh>
+#include <dune/tnnmg/problem-classes/blocknonlineartnnmgproblem.hh>
 
 using SmallVector = Dune::FieldVector<double, DIM>;
 using SmallMatrix = Dune::FieldMatrix<double, DIM, DIM>;
@@ -29,3 +31,7 @@ template class MySolver<
     DIM, MyBlockProblem<ConvexProblem<
              Dune::GlobalNonlinearity<MatrixType, VectorType>, MatrixType>>,
     GridType>;
+template class MySolver<
+    DIM, BlockNonlinearTNNMGProblem<ConvexProblem<
+             ZeroNonlinearity<SmallVector, SmallMatrix>, MatrixType>>,
+    GridType>;
diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 91331810..e2e22ba3 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -64,12 +64,13 @@
 #include <dune/fufem/functionspacebases/p0basis.hh>
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 #include <dune/fufem/sharedpointermap.hh>
-#include <dune/solvers/iterationsteps/blockgsstep.hh>
 #include <dune/solvers/norms/energynorm.hh>
 #include <dune/solvers/norms/sumnorm.hh>
 #include <dune/solvers/solvers/loopsolver.hh>
 #include <dune/solvers/solvers/solver.hh> // Solver::FULL
 #include <dune/tnnmg/problem-classes/convexproblem.hh>
+#include <dune/tnnmg/nonlinearities/zerononlinearity.hh>
+#include <dune/tnnmg/problem-classes/blocknonlineartnnmgproblem.hh>
 
 #include <dune/tectonic/myblockproblem.hh>
 #include <dune/tectonic/globalnonlinearity.hh>
@@ -350,6 +351,12 @@ int main(int argc, char *argv[]) {
     alpha_initial =
         std::log(parset.get<double>("boundary.friction.initial_state"));
 
+    using LinearFactoryType = MySolver<
+        dims, BlockNonlinearTNNMGProblem<ConvexProblem<
+                  ZeroNonlinearity<SmallVector, SmallMatrix>, MatrixType>>,
+        GridType>;
+    ZeroNonlinearity<SmallVector, SmallMatrix> zeroNonlinearity;
+
     VectorType u_initial(finestSize);
     u_initial = 0.0;
 
@@ -378,15 +385,28 @@ int main(int argc, char *argv[]) {
         problem_rhs_initial -= ell;
         problem_rhs_initial *= -1.0;
       }
-      BlockGSStep<MatrixType, VectorType> accelerationSolverStep(
-          M, a_initial, problem_rhs_initial);
-      accelerationSolverStep.ignoreNodes_ = &accelerationDirichletNodes;
-      LoopSolver<VectorType> accelerationSolver(&accelerationSolverStep,
-                                                100000,               // FIXME
-                                                1e-12,                // FIXME
-                                                &MNorm, Solver::FULL, // FIXME
-                                                false); // absolute error
-      accelerationSolver.solve();
+      LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"), // FIXME
+                                            refinements, 1e-12, // FIXME,
+                                            *grid, accelerationDirichletNodes);
+      auto multigridStep = accelerationFactory.getSolver();
+      Solver::VerbosityMode const verbosity =
+          parset.get<bool>("verbose") ? Solver::FULL : Solver::QUIET;
+
+      typename LinearFactoryType::ConvexProblemType myConvexProblem(
+          1.0, M, zeroNonlinearity, problem_rhs_initial, a_initial);
+      typename LinearFactoryType::BlockProblemType initialAccelerationProblem(
+          parset, myConvexProblem);
+
+      multigridStep->setProblem(a_initial, initialAccelerationProblem);
+      LoopSolver<VectorType> initialAccelerationProblemSolver(
+          multigridStep,
+          parset.get<size_t>("solver.tnnmg.maxiterations"), // FIXME
+          1e-12,                                            // FIXME
+          &MNorm,                                           // FIXME
+          verbosity, false);                                // absolute error
+
+      initialAccelerationProblemSolver.preprocess();
+      initialAccelerationProblemSolver.solve();
     }
     // }}}
 
-- 
GitLab