From a9104ef4bf1cdf8b4ef1994c565778e9f8fbc520 Mon Sep 17 00:00:00 2001 From: Lisa Julia Nebel <lisa_julia.nebel@tu-dresden.de> Date: Tue, 14 Jul 2020 09:53:40 +0200 Subject: [PATCH] Make the Assembler a template parameter in the RiemannianTRSolver and the RiemannianPNSolver This makes it possible to use other Assemblers --- dune/gfe/riemannianpnsolver.cc | 10 +++++----- dune/gfe/riemannianpnsolver.hh | 7 +++---- dune/gfe/riemanniantrsolver.cc | 10 +++++----- dune/gfe/riemanniantrsolver.hh | 6 +++--- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/dune/gfe/riemannianpnsolver.cc b/dune/gfe/riemannianpnsolver.cc index 0324629b..4937720c 100644 --- a/dune/gfe/riemannianpnsolver.cc +++ b/dune/gfe/riemannianpnsolver.cc @@ -22,10 +22,10 @@ #include <dune/gfe/parallel/vectorcommunicator.hh> #endif -template <class Basis, class TargetSpace> -void RiemannianProximalNewtonSolver<Basis,TargetSpace>:: +template <class Basis, class TargetSpace, class Assembler> +void RiemannianProximalNewtonSolver<Basis,TargetSpace,Assembler>:: setup(const GridType& grid, - const GeodesicFEAssembler<Basis, TargetSpace>* assembler, + const Assembler* assembler, const SolutionType& x, const Dune::BitSetVector<blocksize>& dirichletNodes, double tolerance, @@ -150,8 +150,8 @@ setup(const GridType& grid, } -template <class Basis, class TargetSpace> -void RiemannianProximalNewtonSolver<Basis,TargetSpace>::solve() +template <class Basis, class TargetSpace, class Assembler> +void RiemannianProximalNewtonSolver<Basis,TargetSpace,Assembler>::solve() { int rank = grid_->comm().rank(); diff --git a/dune/gfe/riemannianpnsolver.hh b/dune/gfe/riemannianpnsolver.hh index a1c1aca5..1024a72a 100644 --- a/dune/gfe/riemannianpnsolver.hh +++ b/dune/gfe/riemannianpnsolver.hh @@ -17,7 +17,6 @@ #include <dune/gfe/periodic1dpq1nodalbasis.hh> -#include "geodesicfeassembler.hh" #include "riemanniantrsolver.hh" #include <dune/grid/utility/globalindexset.hh> #include <dune/gfe/parallel/globalmapper.hh> @@ -26,7 +25,7 @@ #include <dune/gfe/parallel/p2mapper.hh> /** \brief Riemannian proximal-newton solver for geodesic finite-element problems */ -template <class Basis, class TargetSpace> +template <class Basis, class TargetSpace, class Assembler = GeodesicFEAssembler<Basis,TargetSpace>> class RiemannianProximalNewtonSolver : public IterativeSolver<std::vector<TargetSpace>, Dune::BitSetVector<TargetSpace::TangentVector::dimension> > @@ -70,7 +69,7 @@ public: /** \brief Set up the solver using a choldmod solver as the inner solver */ void setup(const GridType& grid, - const GeodesicFEAssembler<Basis, TargetSpace>* assembler, + const Assembler* assembler, const SolutionType& x, const Dune::BitSetVector<blocksize>& dirichletNodes, double tolerance, @@ -121,7 +120,7 @@ protected: std::unique_ptr<MatrixType> hessianMatrix_; /** \brief The assembler for the material law */ - const GeodesicFEAssembler<Basis, TargetSpace>* assembler_; + const Assembler* assembler_; /** \brief The solver for the quadratic inner problems */ std::shared_ptr<typename Dune::Solvers::CholmodSolver<MatrixType,CorrectionType>> innerSolver_; diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc index b8604dfc..b45d502d 100644 --- a/dune/gfe/riemanniantrsolver.cc +++ b/dune/gfe/riemanniantrsolver.cc @@ -28,10 +28,10 @@ #include <dune/gfe/parallel/vectorcommunicator.hh> #endif -template <class Basis, class TargetSpace> -void RiemannianTrustRegionSolver<Basis,TargetSpace>:: +template <class Basis, class TargetSpace, class Assembler> +void RiemannianTrustRegionSolver<Basis,TargetSpace,Assembler>:: setup(const GridType& grid, - const GeodesicFEAssembler<Basis, TargetSpace>* assembler, + const Assembler* assembler, const SolutionType& x, const Dune::BitSetVector<blocksize>& dirichletNodes, double tolerance, @@ -306,8 +306,8 @@ setup(const GridType& grid, } -template <class Basis, class TargetSpace> -void RiemannianTrustRegionSolver<Basis,TargetSpace>::solve() +template <class Basis, class TargetSpace, class Assembler> +void RiemannianTrustRegionSolver<Basis,TargetSpace,Assembler>::solve() { int rank = grid_->comm().rank(); diff --git a/dune/gfe/riemanniantrsolver.hh b/dune/gfe/riemanniantrsolver.hh index 70c69ffa..3184c86f 100644 --- a/dune/gfe/riemanniantrsolver.hh +++ b/dune/gfe/riemanniantrsolver.hh @@ -69,7 +69,7 @@ struct MapperFactory<Dune::Functions::LagrangeBasis<GridView,3> > }; /** \brief Riemannian trust-region solver for geodesic finite-element problems */ -template <class Basis, class TargetSpace> +template <class Basis, class TargetSpace, class Assembler = GeodesicFEAssembler<Basis,TargetSpace>> class RiemannianTrustRegionSolver : public IterativeSolver<std::vector<TargetSpace>, Dune::BitSetVector<TargetSpace::TangentVector::dimension> > @@ -115,7 +115,7 @@ public: /** \brief Set up the solver using a monotone multigrid method as the inner solver */ void setup(const GridType& grid, - const GeodesicFEAssembler<Basis, TargetSpace>* assembler, + const Assembler* assembler, const SolutionType& x, const Dune::BitSetVector<blocksize>& dirichletNodes, double tolerance, @@ -188,7 +188,7 @@ protected: std::unique_ptr<MatrixType> hessianMatrix_; /** \brief The assembler for the material law */ - const GeodesicFEAssembler<Basis, TargetSpace>* assembler_; + const Assembler* assembler_; /** \brief The solver for the quadratic inner problems */ std::shared_ptr<Solver> innerSolver_; -- GitLab