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

[Extend] Give each solver its own parameters

The solvers for u0/a0 and v now each have parameters tolerance,
maximumIterations, verbosity
parent c25e7794
No related branches found
No related tags found
No related merge requests found
...@@ -363,19 +363,19 @@ int main(int argc, char *argv[]) { ...@@ -363,19 +363,19 @@ int main(int argc, char *argv[]) {
refinements, *grid, refinements, *grid,
displacementDirichletNodes); displacementDirichletNodes);
auto multigridStep = displacementFactory.getSolver(); auto multigridStep = displacementFactory.getSolver();
auto const verbosity = parset.get<Solver::VerbosityMode>("io.verbosity");
typename LinearFactoryType::ConvexProblemType myConvexProblem( typename LinearFactoryType::ConvexProblemType myConvexProblem(
1.0, A, zeroNonlinearity, ell, u_initial); 1.0, A, zeroNonlinearity, ell, u_initial);
typename LinearFactoryType::BlockProblemType initialDisplacementProblem( typename LinearFactoryType::BlockProblemType initialDisplacementProblem(
parset, myConvexProblem); parset, myConvexProblem);
Dune::ParameterTree const &localParset = parset.sub("u0.solver");
multigridStep->setProblem(u_initial, initialDisplacementProblem); multigridStep->setProblem(u_initial, initialDisplacementProblem);
LoopSolver<VectorType> initialDisplacementProblemSolver( LoopSolver<VectorType> initialDisplacementProblemSolver(
multigridStep, multigridStep, localParset.get<size_t>("maximumIterations"),
parset.get<size_t>("solver.tnnmg.maxiterations"), // FIXME localParset.get<double>("tolerance"), &ANorm,
1e-12, // FIXME localParset.get<Solver::VerbosityMode>("verbosity"),
&ANorm, verbosity, false); // absolute error false); // absolute error
initialDisplacementProblemSolver.preprocess(); initialDisplacementProblemSolver.preprocess();
initialDisplacementProblemSolver.solve(); initialDisplacementProblemSolver.solve();
...@@ -411,23 +411,23 @@ int main(int argc, char *argv[]) { ...@@ -411,23 +411,23 @@ int main(int argc, char *argv[]) {
// instead of multiplying M by (1.0 - wc), we divide the RHS // instead of multiplying M by (1.0 - wc), we divide the RHS
accelerationRHS *= -1.0 / (1.0 - wc); accelerationRHS *= -1.0 / (1.0 - wc);
} }
LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"), LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"), // FIXME
refinements, *grid, refinements, *grid,
accelerationDirichletNodes); accelerationDirichletNodes);
auto multigridStep = accelerationFactory.getSolver(); auto multigridStep = accelerationFactory.getSolver();
auto const verbosity = parset.get<Solver::VerbosityMode>("io.verbosity");
typename LinearFactoryType::ConvexProblemType myConvexProblem( typename LinearFactoryType::ConvexProblemType myConvexProblem(
1.0, M, zeroNonlinearity, accelerationRHS, a_initial); 1.0, M, zeroNonlinearity, accelerationRHS, a_initial);
typename LinearFactoryType::BlockProblemType initialAccelerationProblem( typename LinearFactoryType::BlockProblemType initialAccelerationProblem(
parset, myConvexProblem); parset, myConvexProblem);
Dune::ParameterTree const &localParset = parset.sub("a0.solver");
multigridStep->setProblem(a_initial, initialAccelerationProblem); multigridStep->setProblem(a_initial, initialAccelerationProblem);
LoopSolver<VectorType> initialAccelerationProblemSolver( LoopSolver<VectorType> initialAccelerationProblemSolver(
multigridStep, multigridStep, localParset.get<size_t>("maximumIterations"),
parset.get<size_t>("solver.tnnmg.maxiterations"), // FIXME localParset.get<double>("tolerance"), &MNorm,
1e-12, // FIXME localParset.get<Solver::VerbosityMode>("verbosity"),
&MNorm, verbosity, false); // absolute error false); // absolute error
initialAccelerationProblemSolver.preprocess(); initialAccelerationProblemSolver.preprocess();
initialAccelerationProblemSolver.solve(); initialAccelerationProblemSolver.solve();
...@@ -435,7 +435,6 @@ int main(int argc, char *argv[]) { ...@@ -435,7 +435,6 @@ int main(int argc, char *argv[]) {
// }}} // }}}
// Set up TNNMG solver // Set up TNNMG solver
auto const solverTolerance = parset.get<double>("solver.tolerance");
using NonlinearFactoryType = SolverFactory< using NonlinearFactoryType = SolverFactory<
dims, dims,
MyBlockProblem<ConvexProblem< MyBlockProblem<ConvexProblem<
...@@ -444,7 +443,6 @@ int main(int argc, char *argv[]) { ...@@ -444,7 +443,6 @@ int main(int argc, char *argv[]) {
NonlinearFactoryType factory(parset.sub("solver.tnnmg"), refinements, *grid, NonlinearFactoryType factory(parset.sub("solver.tnnmg"), refinements, *grid,
velocityDirichletNodes); velocityDirichletNodes);
auto multigridStep = factory.getSolver(); auto multigridStep = factory.getSolver();
auto const verbosity = parset.get<Solver::VerbosityMode>("io.verbosity");
{ {
std::fstream coordinateWriter("coordinates", std::fstream::out); std::fstream coordinateWriter("coordinates", std::fstream::out);
...@@ -481,6 +479,11 @@ int main(int argc, char *argv[]) { ...@@ -481,6 +479,11 @@ int main(int argc, char *argv[]) {
auto const requiredReduction = auto const requiredReduction =
parset.get<double>("solver.requiredReduction"); parset.get<double>("solver.requiredReduction");
auto const printProgress = parset.get<bool>("io.printProgress"); auto const printProgress = parset.get<bool>("io.printProgress");
auto const verbosity =
parset.get<Solver::VerbosityMode>("v.solver.verbosity");
auto const maximumIterations =
parset.get<size_t>("v.solver.maximumIterations");
auto const tolerance = parset.get<double>("v.solver.tolerance");
for (size_t run = 1; run <= timesteps; ++run) { for (size_t run = 1; run <= timesteps; ++run) {
VectorType u; VectorType u;
double lastCorrection; double lastCorrection;
...@@ -500,8 +503,8 @@ int main(int argc, char *argv[]) { ...@@ -500,8 +503,8 @@ int main(int argc, char *argv[]) {
velocityMatrix); velocityMatrix);
LoopSolver<VectorType> velocityProblemSolver( LoopSolver<VectorType> velocityProblemSolver(
multigridStep, parset.get<size_t>("solver.tnnmg.maxiterations"), multigridStep, maximumIterations, tolerance, &AMNorm, verbosity,
solverTolerance, &AMNorm, verbosity, false); // absolute error false); // absolute error
size_t iterationCounter; size_t iterationCounter;
auto solveVelocityProblem = [&](VectorType &_velocityIterate, auto solveVelocityProblem = [&](VectorType &_velocityIterate,
......
# -*- mode:conf -*- # -*- mode:conf -*-
[io] [io]
verbosity = quiet
printProgress = false printProgress = false
enableTimer = false enableTimer = false
writeVTK = false writeVTK = false
...@@ -32,6 +31,21 @@ scheme = newmark ...@@ -32,6 +31,21 @@ scheme = newmark
[grid] [grid]
refinements = 4 refinements = 4
[u0.solver]
tolerance = 1e-10
maximumIterations = 100000
verbosity = quiet
[a0.solver]
tolerance = 1e-10
maximumIterations = 100000
verbosity = quiet
[v.solver]
tolerance = 1e-10
maximumIterations = 100000
verbosity = quiet
[solver] [solver]
tolerance = 1e-10 tolerance = 1e-10
damping = 0.5 damping = 0.5
......
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