From 6f61ef51523a2c57976ffc9030dda4bc15f4261b Mon Sep 17 00:00:00 2001
From: Jonathan Youett <youett@math.fu-berlin.de>
Date: Fri, 2 Mar 2018 14:28:14 +0100
Subject: [PATCH] Create baseSolver and error on stack and let the solver take
 over ownership

---
 dune/gfe/riemanniantrsolver.cc | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc
index 70414dd3..41f856ff 100644
--- a/dune/gfe/riemanniantrsolver.cc
+++ b/dune/gfe/riemanniantrsolver.cc
@@ -74,21 +74,15 @@ setup(const GridType& grid,
 
 #ifdef HAVE_IPOPT
     // First create an IPOpt base solver
-    auto  baseSolver = std::make_shared<QuadraticIPOptSolver<MatrixType,CorrectionType> >();
-    baseSolver->setVerbosity(NumProc::QUIET);
-    baseSolver->setTolerance(baseTolerance);
+    QuadraticIPOptSolver<MatrixType,CorrectionType> baseSolver;
+    baseSolver.setSolverParameter(baseTolerance, 100, NumProc::QUIET);
 #else
-    // First create a Gauss-seidel base solver
-    auto baseSolverStep = std::make_shared<TrustRegionGSStep<MatrixType, CorrectionType> >();
-
     // Hack: the two-norm may not scale all that well, but it is fast!
-    auto baseNorm = std::make_shared<TwoNorm<CorrectionType> >();
-
-    auto baseSolver = std::make_shared<::LoopSolver<CorrectionType> >(baseSolverStep,
-                                                                            baseIterations,
-                                                                            baseTolerance,
-                                                                            baseNorm,
-                                                                            Solver::QUIET);
+    ::LoopSolver<CorrectionType> baseSolver(TrustRegionGSStep<MatrixType, CorrectionType>{},
+                                                        baseIterations,
+                                                        baseTolerance,
+                                                        TwoNorm<CorrectionType>{},
+                                                        Solver::QUIET);
 #endif
 #if HAVE_MPI
     // Transfer all Dirichlet data to the master processor
@@ -109,7 +103,7 @@ setup(const GridType& grid,
 
     mmgStep->setMGType(mu, nu1, nu2);
     mmgStep->ignoreNodes_ = globalDirichletNodes;
-    mmgStep->setBaseSolver(baseSolver);
+    mmgStep->setBaseSolver(std::move(baseSolver));
     mmgStep->setSmoother(smoother);
     mmgStep->setObstacleRestrictor(std::make_shared<MandelObstacleRestrictor<CorrectionType> >());
     mmgStep->setVerbosity(Solver::QUIET);
-- 
GitLab