Skip to content
Snippets Groups Projects
Commit 674a7dc6 authored by Elias Pipping's avatar Elias Pipping
Browse files

[Cleanup] Add solveLinearProblem(), move declarations

parent 0468f826
No related branches found
No related tags found
No related merge requests found
...@@ -247,9 +247,6 @@ int main(int argc, char *argv[]) { ...@@ -247,9 +247,6 @@ int main(int argc, char *argv[]) {
Vector gravityFunctional; Vector gravityFunctional;
myAssembler.assembleBodyForce(gravity, density, zenith, gravityFunctional); myAssembler.assembleBodyForce(gravity, density, zenith, gravityFunctional);
auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity(
frictionalBoundary, frictionData);
// Problem formulation: right-hand side // Problem formulation: right-hand side
auto const createRHS = [&](double _relativeTime, Vector &_ell) { auto const createRHS = [&](double _relativeTime, Vector &_ell) {
myAssembler.assembleNeumann(neumannBoundary, _ell, neumannFunction, myAssembler.assembleNeumann(neumannBoundary, _ell, neumannFunction,
...@@ -263,6 +260,9 @@ int main(int argc, char *argv[]) { ...@@ -263,6 +260,9 @@ int main(int argc, char *argv[]) {
ScalarVector alpha_initial(fineVertexCount); ScalarVector alpha_initial(fineVertexCount);
alpha_initial = alpha_initial =
std::log(parset.get<double>("boundary.friction.initialState")); std::log(parset.get<double>("boundary.friction.initialState"));
auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity(
frictionalBoundary, frictionData);
myGlobalNonlinearity->updateLogState(alpha_initial);
using LinearFactory = SolverFactory< using LinearFactory = SolverFactory<
dims, BlockNonlinearTNNMGProblem<ConvexProblem< dims, BlockNonlinearTNNMGProblem<ConvexProblem<
...@@ -270,31 +270,35 @@ int main(int argc, char *argv[]) { ...@@ -270,31 +270,35 @@ int main(int argc, char *argv[]) {
Grid>; Grid>;
ZeroNonlinearity<SmallVector, SmallMatrix> zeroNonlinearity; ZeroNonlinearity<SmallVector, SmallMatrix> zeroNonlinearity;
// Solve the stationary problem // TODO: clean up once generic lambdas arrive
Vector u_initial(fineVertexCount); auto const solveLinearProblem = [&](
u_initial = 0.0; Dune::BitSetVector<dims> const &_dirichletNodes, Matrix const &_matrix,
{ Vector const &_rhs, Vector &_x, EnergyNorm<Matrix, Vector> _norm,
LinearFactory displacementFactory(parset.sub("solver.tnnmg"), // FIXME Dune::ParameterTree const &_localParset) {
refinements, *grid, LinearFactory factory(parset.sub("solver.tnnmg"), // FIXME
displacementDirichletNodes); refinements, *grid, _dirichletNodes);
auto multigridStep = displacementFactory.getSolver();
typename LinearFactory::ConvexProblem convexProblem( typename LinearFactory::ConvexProblem convexProblem(
1.0, A, zeroNonlinearity, ell, u_initial); 1.0, _matrix, zeroNonlinearity, _rhs, _x);
typename LinearFactory::BlockProblem initialDisplacementProblem( typename LinearFactory::BlockProblem problem(parset, convexProblem);
parset, convexProblem);
auto multigridStep = factory.getSolver();
auto const &localParset = parset.sub("u0.solver"); multigridStep->setProblem(_x, problem);
multigridStep->setProblem(u_initial, initialDisplacementProblem); LoopSolver<Vector> solver(
LoopSolver<Vector> initialDisplacementProblemSolver( multigridStep, _localParset.get<size_t>("maximumIterations"),
multigridStep, localParset.get<size_t>("maximumIterations"), _localParset.get<double>("tolerance"), &_norm,
localParset.get<double>("tolerance"), &ANorm, _localParset.get<Solver::VerbosityMode>("verbosity"),
localParset.get<Solver::VerbosityMode>("verbosity"),
false); // absolute error false); // absolute error
initialDisplacementProblemSolver.preprocess(); solver.preprocess();
initialDisplacementProblemSolver.solve(); 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); Vector v_initial(fineVertexCount);
v_initial = 0.0; v_initial = 0.0;
{ {
...@@ -317,32 +321,13 @@ int main(int argc, char *argv[]) { ...@@ -317,32 +321,13 @@ int main(int argc, char *argv[]) {
accelerationRHS = 0.0; accelerationRHS = 0.0;
Arithmetic::addProduct(accelerationRHS, A, u_initial); Arithmetic::addProduct(accelerationRHS, A, u_initial);
Arithmetic::addProduct(accelerationRHS, C, v_initial); Arithmetic::addProduct(accelerationRHS, C, v_initial);
myGlobalNonlinearity->updateLogState(alpha_initial);
// NOTE: We assume differentiability of Psi at v0 here! // NOTE: We assume differentiability of Psi at v0 here!
myGlobalNonlinearity->addGradient(v_initial, accelerationRHS); myGlobalNonlinearity->addGradient(v_initial, accelerationRHS);
accelerationRHS -= ell; accelerationRHS -= ell;
accelerationRHS *= -1.0; accelerationRHS *= -1.0;
} }
LinearFactory accelerationFactory(parset.sub("solver.tnnmg"), // FIXME solveLinearProblem(accelerationDirichletNodes, M, accelerationRHS,
refinements, *grid, a_initial, MNorm, parset.sub("a0.solver"));
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();
} }
// }}} // }}}
FrictionWriter<Dune::BitSetVector<1>> writer(frictionData, frictionalNodes); FrictionWriter<Dune::BitSetVector<1>> writer(frictionData, frictionalNodes);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment