diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index 2f7787defe183a2184c44fea29fef43b43aa3a40..1126c4f34b7c7fa508fd26b02290c32c943a28c5 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -59,6 +59,7 @@ #include <dune/fufem/functionspacebases/p0basis.hh> #include <dune/fufem/functionspacebases/p1nodalbasis.hh> #include <dune/fufem/sharedpointermap.hh> +#include <dune/solvers/iterationsteps/truncatedblockgsstep.hh> #include <dune/solvers/norms/energynorm.hh> #include <dune/solvers/norms/sumnorm.hh> #include <dune/solvers/solvers/loopsolver.hh> @@ -342,9 +343,33 @@ int main(int argc, char *argv[]) { u_initial = 0.0; VectorType v_initial(finestSize); v_initial = 0.0; - // FIXME: This only happens to be correct + + // From here on: calculate the initial acceleration VectorType a_initial(finestSize); a_initial = 0.0; + { + // We solve Au + Ma + Psi(v) = ell, thus Ma = - (Au + Psi(v) - ell) + VectorType problem_rhs_initial(finestSize); + { + problem_rhs_initial = 0.0; + Arithmetic::addProduct(problem_rhs_initial, stiffnessMatrix, u_initial); + myGlobalNonlinearity->updateState(alpha_initial); + // NOTE: We assume differentiability of Psi at v0 here! + myGlobalNonlinearity->addGradient(v_initial, problem_rhs_initial); + createRHS(0.0, ell); + problem_rhs_initial -= ell; + problem_rhs_initial *= -1.0; + } + TruncatedBlockGSStep<MatrixType, VectorType> accelerationSolverStep( + massMatrix, a_initial, problem_rhs_initial); + accelerationSolverStep.ignoreNodes_ = &ignoreNodes; + LoopSolver<VectorType> accelerationSolver( + &accelerationSolverStep, 100000, // FIXME + 1e-12, // FIXME + &massMatrixNorm, Solver::FULL, // FIXME + false); // absolute error + accelerationSolver.solve(); + } // }}} // Set up TNNMG solver