From e370fa6f59d155a6562a0032ac70397d97266be7 Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Tue, 30 Jan 2024 16:11:41 +0100
Subject: [PATCH] Make MixedLocalGeodesicFEStiffness accept a ProductManifold

... rather than two separate spaces.  This is one step towards
getting rid of it altogether.
---
 dune/gfe/assemblers/cosseratenergystiffness.hh       | 4 +---
 dune/gfe/assemblers/mixedgfeassembler.hh             | 6 ++----
 dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh | 9 ++++++++-
 dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh   | 9 +++++----
 dune/gfe/assemblers/nonplanarcosseratshellenergy.hh  | 4 +---
 dune/gfe/assemblers/simofoxenergy.hh                 | 4 ++--
 dune/gfe/assemblers/sumenergy.hh                     | 2 +-
 7 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/dune/gfe/assemblers/cosseratenergystiffness.hh b/dune/gfe/assemblers/cosseratenergystiffness.hh
index 088313269..2bbac9fb0 100644
--- a/dune/gfe/assemblers/cosseratenergystiffness.hh
+++ b/dune/gfe/assemblers/cosseratenergystiffness.hh
@@ -72,9 +72,7 @@ public:
 template<class Basis, int dim, class field_type=double>
 class CosseratEnergyLocalStiffness
   : public Dune::GFE::LocalEnergy<Basis,Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >,
-    public MixedLocalGeodesicFEStiffness<Basis,
-        RealTuple<field_type,dim>,
-        Rotation<field_type,dim> >
+    public MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >
 {
   // grid types
   typedef typename Basis::GridView GridView;
diff --git a/dune/gfe/assemblers/mixedgfeassembler.hh b/dune/gfe/assemblers/mixedgfeassembler.hh
index 29c61a41a..21203f0d0 100644
--- a/dune/gfe/assemblers/mixedgfeassembler.hh
+++ b/dune/gfe/assemblers/mixedgfeassembler.hh
@@ -36,15 +36,13 @@ public:
       Dune::MultiTypeBlockVector<MatrixBlock10,MatrixBlock11> > MatrixType;
   const Basis basis_;
 
-  MixedLocalGeodesicFEStiffness<Basis,
-      TargetSpace0,
-      TargetSpace1>* localStiffness_;
+  MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1> >* localStiffness_;
 
 public:
 
   /** \brief Constructor for a given grid */
   MixedGFEAssembler(const Basis& basis,
-                    MixedLocalGeodesicFEStiffness<Basis, TargetSpace0, TargetSpace1>* localStiffness)
+                    MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<TargetSpace0, TargetSpace1> >* localStiffness)
     : basis_(basis),
     localStiffness_(localStiffness)
   {}
diff --git a/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh b/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
index 83d5212b5..f3bddce77 100644
--- a/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
+++ b/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
@@ -5,9 +5,16 @@
 #include <dune/istl/matrix.hh>
 
 
-template<class Basis, class DeformationTargetSpace, class OrientationTargetSpace>
+/** \brief Abstract base class for second-order energy approximations on one grid element
+ *
+ * \tparam TargetSpace The space we map into.  MUST be a ProductManifold with two factors
+ */
+template<class Basis, class TargetSpace>
 class MixedLocalGeodesicFEStiffness
 {
+  using DeformationTargetSpace = std::decay_t<decltype(std::declval<TargetSpace>()[Dune::Indices::_0])>;
+  using OrientationTargetSpace = std::decay_t<decltype(std::declval<TargetSpace>()[Dune::Indices::_1])>;
+
   // grid types
   typedef typename Basis::GridView GridView;
   typedef typename GridView::ctype DT;
diff --git a/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh b/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
index 18a120a5f..7fb2f4c34 100644
--- a/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
+++ b/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
@@ -13,12 +13,13 @@
 #include <dune/istl/matrix.hh>
 
 #include <dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh>
+#include <dune/gfe/spaces/productmanifold.hh>
 
 /** \brief Assembles energy gradient and Hessian with ADOL-C (automatic differentiation)
  */
 template<class Basis, class TargetSpace0, class TargetSpace1>
 class MixedLocalGFEADOLCStiffness
-  : public MixedLocalGeodesicFEStiffness<Basis,TargetSpace0,TargetSpace1>
+  : public MixedLocalGeodesicFEStiffness<Basis,Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1> >
 {
   // grid types
   typedef typename Basis::GridView GridView;
@@ -43,8 +44,8 @@ public:
   constexpr static int embeddedBlocksize0 = TargetSpace0::EmbeddedTangentVector::dimension;
   constexpr static int embeddedBlocksize1 = TargetSpace1::EmbeddedTangentVector::dimension;
 
-  MixedLocalGFEADOLCStiffness(const MixedLocalGeodesicFEStiffness<Basis, ATargetSpace0,
-      ATargetSpace1>* energy, bool adolcScalarMode = false)
+  MixedLocalGFEADOLCStiffness(const MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<ATargetSpace0,
+      ATargetSpace1> >* energy, bool adolcScalarMode = false)
     : localEnergy_(energy),
     adolcScalarMode_(adolcScalarMode)
   {}
@@ -64,7 +65,7 @@ public:
                                           std::vector<typename TargetSpace0::TangentVector>& localGradient0,
                                           std::vector<typename TargetSpace1::TangentVector>& localGradient1) override;
 
-  const MixedLocalGeodesicFEStiffness<Basis, ATargetSpace0, ATargetSpace1>* localEnergy_;
+  const MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<ATargetSpace0, ATargetSpace1> >* localEnergy_;
   const bool adolcScalarMode_;
 };
 
diff --git a/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh b/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh
index 98d941b50..0b50acb93 100644
--- a/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh
+++ b/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh
@@ -40,9 +40,7 @@
 template<class Basis, int dim, class field_type, class StressFreeStateGridFunction>
 class NonplanarCosseratShellEnergy
   : public Dune::GFE::LocalEnergy<Basis,Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >,
-    public MixedLocalGeodesicFEStiffness<Basis,
-        RealTuple<field_type,dim>,
-        Rotation<field_type,dim> >
+    public MixedLocalGeodesicFEStiffness<Basis,Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >
 {
   // grid types
   typedef typename Basis::GridView GridView;
diff --git a/dune/gfe/assemblers/simofoxenergy.hh b/dune/gfe/assemblers/simofoxenergy.hh
index aab8fd396..dddf5eb89 100644
--- a/dune/gfe/assemblers/simofoxenergy.hh
+++ b/dune/gfe/assemblers/simofoxenergy.hh
@@ -54,8 +54,8 @@ namespace Dune::GFE {
   class SimoFoxEnergyLocalStiffness
     : public Dune::GFE::LocalEnergy<Basis, RealTuple<field_type, 3>,
           UnitVector<field_type, 3> >,                             // inheritance to allow usage with LocalGeodesicFEADOLCStiffness
-      public MixedLocalGeodesicFEStiffness<Basis, RealTuple<field_type, 3>,
-          UnitVector<field_type, 3> >                                    // inheritance to allow usage with MixedGFEAssembler
+      public MixedLocalGeodesicFEStiffness<Basis, ProductManifold<RealTuple<field_type, 3>,
+          UnitVector<field_type, 3> > >                                    // inheritance to allow usage with MixedGFEAssembler
   {
     // grid types
     typedef typename Basis::GridView GridView;
diff --git a/dune/gfe/assemblers/sumenergy.hh b/dune/gfe/assemblers/sumenergy.hh
index dd450369d..46f84e7b8 100644
--- a/dune/gfe/assemblers/sumenergy.hh
+++ b/dune/gfe/assemblers/sumenergy.hh
@@ -18,7 +18,7 @@ namespace Dune::GFE {
   template<class Basis, class ... TargetSpaces>
   class SumEnergy
     : public Dune::GFE::LocalEnergy<Basis, TargetSpaces...>,
-      public MixedLocalGeodesicFEStiffness<Basis, TargetSpaces...>
+      public MixedLocalGeodesicFEStiffness<Basis, ProductManifold<TargetSpaces...> >
       //Inheriting from MixedLocalGeodesicFEStiffness is hack, and will be replaced eventually; once MixedLocalGFEADOLCStiffness
       //will be removed and its functionality will be included in LocalGeodesicFEADOLCStiffness this is not needed anymore!
 
-- 
GitLab