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