From 674a7dc6450ff054d3300a83b06b8d4f3895c6b9 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Fri, 13 Dec 2013 02:34:54 +0100 Subject: [PATCH] [Cleanup] Add solveLinearProblem(), move declarations --- src/one-body-sample.cc | 75 +++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 45 deletions(-) diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index a9931a85..bf5e5d32 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -247,9 +247,6 @@ int main(int argc, char *argv[]) { Vector gravityFunctional; myAssembler.assembleBodyForce(gravity, density, zenith, gravityFunctional); - auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity( - frictionalBoundary, frictionData); - // Problem formulation: right-hand side auto const createRHS = [&](double _relativeTime, Vector &_ell) { myAssembler.assembleNeumann(neumannBoundary, _ell, neumannFunction, @@ -263,6 +260,9 @@ int main(int argc, char *argv[]) { ScalarVector alpha_initial(fineVertexCount); alpha_initial = std::log(parset.get<double>("boundary.friction.initialState")); + auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity( + frictionalBoundary, frictionData); + myGlobalNonlinearity->updateLogState(alpha_initial); using LinearFactory = SolverFactory< dims, BlockNonlinearTNNMGProblem<ConvexProblem< @@ -270,31 +270,35 @@ int main(int argc, char *argv[]) { Grid>; ZeroNonlinearity<SmallVector, SmallMatrix> zeroNonlinearity; - // Solve the stationary problem - Vector u_initial(fineVertexCount); - u_initial = 0.0; - { - LinearFactory displacementFactory(parset.sub("solver.tnnmg"), // FIXME - refinements, *grid, - displacementDirichletNodes); - auto multigridStep = displacementFactory.getSolver(); + // TODO: clean up once generic lambdas arrive + auto const solveLinearProblem = [&]( + Dune::BitSetVector<dims> const &_dirichletNodes, Matrix const &_matrix, + Vector const &_rhs, Vector &_x, EnergyNorm<Matrix, Vector> _norm, + Dune::ParameterTree const &_localParset) { + LinearFactory factory(parset.sub("solver.tnnmg"), // FIXME + refinements, *grid, _dirichletNodes); typename LinearFactory::ConvexProblem convexProblem( - 1.0, A, zeroNonlinearity, ell, u_initial); - typename LinearFactory::BlockProblem initialDisplacementProblem( - parset, convexProblem); - - auto const &localParset = parset.sub("u0.solver"); - multigridStep->setProblem(u_initial, initialDisplacementProblem); - LoopSolver<Vector> initialDisplacementProblemSolver( - multigridStep, localParset.get<size_t>("maximumIterations"), - localParset.get<double>("tolerance"), &ANorm, - localParset.get<Solver::VerbosityMode>("verbosity"), + 1.0, _matrix, zeroNonlinearity, _rhs, _x); + typename LinearFactory::BlockProblem problem(parset, convexProblem); + + auto multigridStep = factory.getSolver(); + multigridStep->setProblem(_x, problem); + LoopSolver<Vector> solver( + multigridStep, _localParset.get<size_t>("maximumIterations"), + _localParset.get<double>("tolerance"), &_norm, + _localParset.get<Solver::VerbosityMode>("verbosity"), false); // absolute error - initialDisplacementProblemSolver.preprocess(); - initialDisplacementProblemSolver.solve(); - } + solver.preprocess(); + solver.solve(); + }; + + // Solve the stationary problem + Vector u_initial(fineVertexCount); + u_initial = 0.0; + solveLinearProblem(displacementDirichletNodes, A, ell, u_initial, ANorm, + parset.sub("u0.solver")); Vector v_initial(fineVertexCount); v_initial = 0.0; { @@ -317,32 +321,13 @@ int main(int argc, char *argv[]) { accelerationRHS = 0.0; Arithmetic::addProduct(accelerationRHS, A, u_initial); Arithmetic::addProduct(accelerationRHS, C, v_initial); - myGlobalNonlinearity->updateLogState(alpha_initial); // NOTE: We assume differentiability of Psi at v0 here! myGlobalNonlinearity->addGradient(v_initial, accelerationRHS); accelerationRHS -= ell; accelerationRHS *= -1.0; } - LinearFactory accelerationFactory(parset.sub("solver.tnnmg"), // FIXME - refinements, *grid, - accelerationDirichletNodes); - auto multigridStep = accelerationFactory.getSolver(); - - typename LinearFactory::ConvexProblem convexProblem( - 1.0, M, zeroNonlinearity, accelerationRHS, a_initial); - typename LinearFactory::BlockProblem initialAccelerationProblem( - parset, convexProblem); - - auto const &localParset = parset.sub("a0.solver"); - multigridStep->setProblem(a_initial, initialAccelerationProblem); - LoopSolver<Vector> initialAccelerationProblemSolver( - multigridStep, localParset.get<size_t>("maximumIterations"), - localParset.get<double>("tolerance"), &MNorm, - localParset.get<Solver::VerbosityMode>("verbosity"), - false); // absolute error - - initialAccelerationProblemSolver.preprocess(); - initialAccelerationProblemSolver.solve(); + solveLinearProblem(accelerationDirichletNodes, M, accelerationRHS, + a_initial, MNorm, parset.sub("a0.solver")); } // }}} FrictionWriter<Dune::BitSetVector<1>> writer(frictionData, frictionalNodes); -- GitLab