From 9859588d66bbeca64b11ae2c6e52346da4fdc8d6 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Tue, 4 Nov 2014 16:20:51 +0100
Subject: [PATCH] [Cleanup] multigridStep: Use a shared pointer for the solver

---
 src/fixedpointiterator.cc | 4 ++--
 src/sand-wedge.cc         | 2 +-
 src/solverfactory.cc      | 8 ++++----
 src/solverfactory.hh      | 4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/fixedpointiterator.cc b/src/fixedpointiterator.cc
index 4bc8dee7..e08ef871 100644
--- a/src/fixedpointiterator.cc
+++ b/src/fixedpointiterator.cc
@@ -42,8 +42,8 @@ FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::run(
 
   EnergyNorm<Matrix, Vector> energyNorm(velocityMatrix);
   LoopSolver<Vector> velocityProblemSolver(
-      multigridStep, velocityMaxIterations_, velocityTolerance_, &energyNorm,
-      verbosity_, false); // absolute error
+      multigridStep.get(), velocityMaxIterations_, velocityTolerance_,
+      &energyNorm, verbosity_, false); // absolute error
 
   size_t fixedPointIteration;
   size_t multigridIterations = 0;
diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc
index 1cf9d0ba..99616319 100644
--- a/src/sand-wedge.cc
+++ b/src/sand-wedge.cc
@@ -238,7 +238,7 @@ int main(int argc, char *argv[]) {
       auto multigridStep = factory.getSolver();
       multigridStep->setProblem(_x, problem);
       LoopSolver<Vector> solver(
-          multigridStep, _localParset.get<size_t>("maximumIterations"),
+          multigridStep.get(), _localParset.get<size_t>("maximumIterations"),
           _localParset.get<double>("tolerance"), &_norm,
           _localParset.get<Solver::VerbosityMode>("verbosity"),
           false); // absolute error
diff --git a/src/solverfactory.cc b/src/solverfactory.cc
index 81f06b4b..2d58ea17 100644
--- a/src/solverfactory.cc
+++ b/src/solverfactory.cc
@@ -21,7 +21,8 @@ SolverFactory<dim, BlockProblem, Grid>::SolverFactory(
                        parset.get<double>("linear.tolerance"), &baseEnergyNorm,
                        Solver::QUIET),
       transferOperators(refinements),
-      multigridStep(new Solver(linearIterationStep, nonlinearSmoother)) {
+      multigridStep(
+          std::make_shared<Solver>(linearIterationStep, nonlinearSmoother)) {
   // linear iteration step
   linearIterationStep.setMGType(parset.get<int>("linear.cycle"),
                                 parset.get<int>("linear.pre"),
@@ -47,12 +48,11 @@ template <size_t dim, class BlockProblem, class Grid>
 SolverFactory<dim, BlockProblem, Grid>::~SolverFactory() {
   for (auto &&x : transferOperators)
     delete x;
-
-  delete multigridStep;
 }
 
 template <size_t dim, class BlockProblem, class Grid>
-auto SolverFactory<dim, BlockProblem, Grid>::getSolver() -> Solver * {
+auto SolverFactory<dim, BlockProblem, Grid>::getSolver()
+    -> std::shared_ptr<Solver> {
   return multigridStep;
 }
 
diff --git a/src/solverfactory.hh b/src/solverfactory.hh
index 93188af4..550a4f17 100644
--- a/src/solverfactory.hh
+++ b/src/solverfactory.hh
@@ -35,7 +35,7 @@ class SolverFactory {
 
   ~SolverFactory();
 
-  Solver *getSolver();
+  std::shared_ptr<Solver> getSolver();
 
 private:
   TruncatedBlockGSStep<Matrix, Vector> linearBaseSolverStep;
@@ -46,6 +46,6 @@ class SolverFactory {
   MultigridStep<Matrix, Vector> linearIterationStep;
   std::vector<CompressedMultigridTransfer<Vector> *> transferOperators;
   NonlinearSmoother nonlinearSmoother;
-  Solver *multigridStep;
+  std::shared_ptr<Solver> multigridStep;
 };
 #endif
-- 
GitLab