diff --git a/src/fixedpointiterator.cc b/src/fixedpointiterator.cc index 4bc8dee70b45e5dd98d705401d7c52e35424dc62..e08ef8715ca81df6ae30e55b967afe1300e0d0f7 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 1cf9d0ba4b9b2043ebe7f6e63e4cbde5a80654ab..99616319383e8d22bfd4f4aeef37cff36f9dd2e0 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 81f06b4bffa2c386cf00279ae8475da022a3d8de..2d58ea178322d5e34f3c51fb216f97d99468266f 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 93188af419bc08e89d8a423ff866a703aa4d2dd5..550a4f17d70a0f23b807f8e18eea43d5c6b4b3a6 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