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