From 076741b290e6d7d8b545e3a6fc80d06369f7b07b Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Wed, 1 May 2024 20:06:07 +0200
Subject: [PATCH] LocalGFEADOLCStiffness: Take energy as shared_ptr

---
 .../localgeodesicfeadolcstiffness.hh          |  4 ++--
 src/cosserat-continuum.cc                     | 22 +++++++++----------
 src/film-on-substrate.cc                      | 10 ++++-----
 src/gradient-flow.cc                          |  2 +-
 src/harmonicmaps.cc                           |  2 +-
 src/rod3d.cc                                  |  2 +-
 src/simofoxshell.cc                           | 13 ++++++-----
 test/cosseratcontinuumtest.cc                 |  8 +++----
 test/cosseratrodtest.cc                       |  2 +-
 test/filmonsubstratetest.cc                   | 10 ++++-----
 test/geodesicfeassemblerwrappertest.cc        | 10 ++++-----
 test/harmonicmaptest.cc                       |  2 +-
 test/localadolcstiffnesstest.cc               |  5 ++---
 test/mixedriemannianpnsolvertest.cc           | 10 ++++-----
 14 files changed, 52 insertions(+), 50 deletions(-)

diff --git a/dune/gfe/assemblers/localgeodesicfeadolcstiffness.hh b/dune/gfe/assemblers/localgeodesicfeadolcstiffness.hh
index 594c0c50..7b16b831 100644
--- a/dune/gfe/assemblers/localgeodesicfeadolcstiffness.hh
+++ b/dune/gfe/assemblers/localgeodesicfeadolcstiffness.hh
@@ -35,7 +35,7 @@ public:
   //! Dimension of a tangent space
   constexpr static int blocksize = TargetSpace::TangentVector::dimension;
 
-  LocalGeodesicFEADOLCStiffness(const Dune::GFE::LocalEnergy<Basis, ATargetSpace>* energy, bool adolcScalarMode = false)
+  LocalGeodesicFEADOLCStiffness(std::shared_ptr<const Dune::GFE::LocalEnergy<Basis, ATargetSpace> > energy, bool adolcScalarMode = false)
     : localEnergy_(energy),
     adolcScalarMode_(adolcScalarMode)
   {}
@@ -72,7 +72,7 @@ public:
                                           std::vector<double>& localGradient,
                                           typename Dune::GFE::Impl::LocalStiffnessTypes<TargetSpace>::CompositeHessian& localHessian) const override;
 
-  const Dune::GFE::LocalEnergy<Basis, ATargetSpace>* localEnergy_;
+  std::shared_ptr<const Dune::GFE::LocalEnergy<Basis, ATargetSpace> > localEnergy_;
   const bool adolcScalarMode_;
 };
 
diff --git a/src/cosserat-continuum.cc b/src/cosserat-continuum.cc
index be69022f..328f10fe 100644
--- a/src/cosserat-continuum.cc
+++ b/src/cosserat-continuum.cc
@@ -496,12 +496,12 @@ int main (int argc, char *argv[]) try
         x[_1][i].set(dOV[i]);
 
     if (dim==dimworld) {
-      CosseratEnergyLocalStiffness<CompositeBasis, 3,adouble> localCosseratEnergy(materialParameters,
-                                                                                  &neumannBoundary,
-                                                                                  neumannFunction,
-                                                                                  volumeLoad);
+      auto localCosseratEnergy = std::make_shared<CosseratEnergyLocalStiffness<CompositeBasis, 3,adouble> > (materialParameters,
+                                                                                                             &neumannBoundary,
+                                                                                                             neumannFunction,
+                                                                                                             volumeLoad);
 
-      LocalGeodesicFEADOLCStiffness<CompositeBasis,TargetSpace> localGFEADOLCStiffness(&localCosseratEnergy,
+      LocalGeodesicFEADOLCStiffness<CompositeBasis,TargetSpace> localGFEADOLCStiffness(localCosseratEnergy,
                                                                                        adolcScalarMode);
       MixedGFEAssembler<CompositeBasis,TargetSpace> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 #if MIXED_SPACE
@@ -627,13 +627,13 @@ int main (int argc, char *argv[]) try
       std::shared_ptr<StiffnessType> localGFEStiffness;
 
 #if HAVE_DUNE_CURVEDGEOMETRY && WORLD_DIM == 3 && GRID_DIM == 2
-      NonplanarCosseratShellEnergy<CompositeBasis, 3, adouble, decltype(creator)> localCosseratEnergy(materialParameters,
-                                                                                                      &creator,
-                                                                                                      &neumannBoundary,
-                                                                                                      neumannFunction,
-                                                                                                      volumeLoad);
+      auto localCosseratEnergy = std::make_shared<NonplanarCosseratShellEnergy<CompositeBasis, 3, adouble, decltype(creator)> >(materialParameters,
+                                                                                                                                &creator,
+                                                                                                                                &neumannBoundary,
+                                                                                                                                neumannFunction,
+                                                                                                                                volumeLoad);
 
-      localGFEStiffness = std::make_shared<StiffnessType>(&localCosseratEnergy, adolcScalarMode);
+      localGFEStiffness = std::make_shared<StiffnessType>(localCosseratEnergy, adolcScalarMode);
 #endif
       MixedGFEAssembler<CompositeBasis,TargetSpace> mixedAssembler(compositeBasis, localGFEStiffness);
 #if MIXED_SPACE
diff --git a/src/film-on-substrate.cc b/src/film-on-substrate.cc
index 1e6cc7b1..42a04ae6 100644
--- a/src/film-on-substrate.cc
+++ b/src/film-on-substrate.cc
@@ -531,12 +531,12 @@ int main (int argc, char *argv[]) try
 
     using RBM = GFE::ProductManifold<RealTuple<double, dim>,Rotation<double,dim> >;
 
-    GFE::SumEnergy<CompositeBasis, RealTuple<ValueType,targetDim>, Rotation<ValueType,targetDim> > sumEnergy;
-    sumEnergy.addLocalEnergy(neumannEnergy);
-    sumEnergy.addLocalEnergy(elasticEnergy);
-    sumEnergy.addLocalEnergy(surfaceCosseratEnergy);
+    auto sumEnergy = std::make_shared<GFE::SumEnergy<CompositeBasis, RealTuple<ValueType,targetDim>, Rotation<ValueType,targetDim> > >();
+    sumEnergy->addLocalEnergy(neumannEnergy);
+    sumEnergy->addLocalEnergy(elasticEnergy);
+    sumEnergy->addLocalEnergy(surfaceCosseratEnergy);
 
-    LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(&sumEnergy);
+    LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(sumEnergy);
     MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 
     ////////////////////////////////////////////////////////
diff --git a/src/gradient-flow.cc b/src/gradient-flow.cc
index c55aed10..68f9a929 100644
--- a/src/gradient-flow.cc
+++ b/src/gradient-flow.cc
@@ -218,7 +218,7 @@ int main (int argc, char *argv[]) try
 
   auto sumEnergy = std::make_shared< WeightedSumEnergy<FEBasis, ATargetSpace> >(addends, weights);
 
-  LocalGeodesicFEADOLCStiffness<FEBasis,TargetSpace> localGFEADOLCStiffness(sumEnergy.get());
+  LocalGeodesicFEADOLCStiffness<FEBasis,TargetSpace> localGFEADOLCStiffness(sumEnergy);
 
   GeodesicFEAssembler<FEBasis,TargetSpace> assembler(feBasis, localGFEADOLCStiffness);
 
diff --git a/src/harmonicmaps.cc b/src/harmonicmaps.cc
index 35a50711..16f5d886 100644
--- a/src/harmonicmaps.cc
+++ b/src/harmonicmaps.cc
@@ -300,7 +300,7 @@ int main (int argc, char *argv[])
     DUNE_THROW(Exception, "Unknown interpolation method " << parameterSet["interpolationMethod"] << " requested!");
 
   // Compute local tangent problems by applying ADOL-C directly to the energy on the element
-  LocalGeodesicFEADOLCStiffness<FEBasis,TargetSpace> localGFEADOLCStiffness(localEnergy.get());
+  LocalGeodesicFEADOLCStiffness<FEBasis,TargetSpace> localGFEADOLCStiffness(localEnergy);
 
   GeodesicFEAssembler<FEBasis,TargetSpace> assembler(feBasis, localGFEADOLCStiffness);
 
diff --git a/src/rod3d.cc b/src/rod3d.cc
index c5a23311..68cb905f 100644
--- a/src/rod3d.cc
+++ b/src/rod3d.cc
@@ -206,7 +206,7 @@ int main (int argc, char *argv[]) try
     DUNE_THROW(Exception, "Unknown interpolation method " << parameterSet["interpolationMethod"] << " requested!");
 
   LocalGeodesicFEADOLCStiffness<ScalarBasis,
-      TargetSpace> localStiffness(localRodEnergy.get());
+      TargetSpace> localStiffness(localRodEnergy);
 
   GeodesicFEAssembler<ScalarBasis,TargetSpace> rodAssembler(gridView, localStiffness);
 
diff --git a/src/simofoxshell.cc b/src/simofoxshell.cc
index 389a0c16..dc0d6e5d 100644
--- a/src/simofoxshell.cc
+++ b/src/simofoxshell.cc
@@ -315,15 +315,18 @@ int main(int argc, char *argv[]) try
     }
 
     // Assembler using ADOL-C
-    Dune::GFE::SimoFoxEnergyLocalStiffness<decltype(compositeBasis), LocalFEFunction,adouble> simoFoxEnergyADOLCLocalStiffness(materialParameters,
-                                                                                                                               &neumannBoundary,
-                                                                                                                               neumannFunction,
-                                                                                                                               nullptr, x0);
+    auto simoFoxEnergyLocalStiffness
+      = std::make_shared<GFE::SimoFoxEnergyLocalStiffness<decltype(compositeBasis),
+        LocalFEFunction,
+        adouble> > (materialParameters,
+                    &neumannBoundary,
+                    neumannFunction,
+                    nullptr, x0);
 
     using TargetSpace = Dune::GFE::ProductManifold<RealTuple<double,3>,UnitVector<double,3> >;
 
     LocalGeodesicFEADOLCStiffness<decltype(compositeBasis),
-        TargetSpace> localGFEADOLCStiffness(&simoFoxEnergyADOLCLocalStiffness);
+        TargetSpace> localGFEADOLCStiffness(simoFoxEnergyLocalStiffness);
 
     MixedGFEAssembler<decltype(compositeBasis),TargetSpace> assembler(compositeBasis, localGFEADOLCStiffness);
     ////////////////////////////////////////////////////////
diff --git a/test/cosseratcontinuumtest.cc b/test/cosseratcontinuumtest.cc
index e741625d..97783cd8 100644
--- a/test/cosseratcontinuumtest.cc
+++ b/test/cosseratcontinuumtest.cc
@@ -202,7 +202,7 @@ int main (int argc, char *argv[])
   using RigidBodyMotion = GFE::ProductManifold<RealTuple<double,dim>,Rotation<double,dim> >;
   using ARigidBodyMotion = GFE::ProductManifold<RealTuple<adouble,dim>,Rotation<adouble,dim> >;
 
-  GFE::SumEnergy<CompositeBasis, RealTuple<adouble,dim>,Rotation<adouble,dim> > sumEnergy;
+  auto sumEnergy = std::make_shared<GFE::SumEnergy<CompositeBasis, RealTuple<adouble,dim>,Rotation<adouble,dim> > >();
   auto neumannEnergy = std::make_shared<GFE::NeumannEnergy<CompositeBasis, RealTuple<adouble,dim>, Rotation<adouble,dim> > >(neumannBoundary,neumannFunction);
 
   // Select which type of geometric interpolation to use
@@ -213,10 +213,10 @@ int main (int argc, char *argv[])
 
   auto bulkCosseratDensity = std::make_shared<GFE::BulkCosseratDensity<FieldVector<double,dim>,adouble> >(parameters);
   auto bulkCosseratEnergy = std::make_shared<GFE::LocalIntegralEnergy<CompositeBasis, LocalInterpolationRule, ARigidBodyMotion> >(bulkCosseratDensity);
-  sumEnergy.addLocalEnergy(bulkCosseratEnergy);
-  sumEnergy.addLocalEnergy(neumannEnergy);
+  sumEnergy->addLocalEnergy(bulkCosseratEnergy);
+  sumEnergy->addLocalEnergy(neumannEnergy);
 
-  LocalGeodesicFEADOLCStiffness<CompositeBasis,RigidBodyMotion> localGFEADOLCStiffness(&sumEnergy);
+  LocalGeodesicFEADOLCStiffness<CompositeBasis,RigidBodyMotion> localGFEADOLCStiffness(sumEnergy);
   MixedGFEAssembler<CompositeBasis,RigidBodyMotion> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 
   MixedRiemannianTrustRegionSolver<GridType,
diff --git a/test/cosseratrodtest.cc b/test/cosseratrodtest.cc
index c853cd38..e0892889 100644
--- a/test/cosseratrodtest.cc
+++ b/test/cosseratrodtest.cc
@@ -158,7 +158,7 @@ int main (int argc, char *argv[]) try
     DUNE_THROW(Exception, "Unknown interpolation method " << interpolationMethod << " requested!");
 
   LocalGeodesicFEADOLCStiffness<ScalarBasis,
-      TargetSpace> localStiffness(localRodEnergy.get());
+      TargetSpace> localStiffness(localRodEnergy);
 
   GeodesicFEAssembler<ScalarBasis,TargetSpace> rodAssembler(gridView, localStiffness);
 
diff --git a/test/filmonsubstratetest.cc b/test/filmonsubstratetest.cc
index 8255ca56..af4228c1 100644
--- a/test/filmonsubstratetest.cc
+++ b/test/filmonsubstratetest.cc
@@ -358,12 +358,12 @@ int main (int argc, char *argv[])
 
   using RBM = GFE::ProductManifold<RealTuple<double, dim>,Rotation<double,dim> >;
 
-  GFE::SumEnergy<CompositeBasis, RealTuple<ValueType,targetDim>, Rotation<ValueType,targetDim> > sumEnergy;
-  sumEnergy.addLocalEnergy(neumannEnergy);
-  sumEnergy.addLocalEnergy(elasticEnergy);
-  sumEnergy.addLocalEnergy(surfaceCosseratEnergy);
+  auto sumEnergy = std::make_shared<GFE::SumEnergy<CompositeBasis, RealTuple<ValueType,targetDim>, Rotation<ValueType,targetDim> > >();
+  sumEnergy->addLocalEnergy(neumannEnergy);
+  sumEnergy->addLocalEnergy(elasticEnergy);
+  sumEnergy->addLocalEnergy(surfaceCosseratEnergy);
 
-  LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(&sumEnergy);
+  LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(sumEnergy);
   MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 
   ////////////////////////////////////////////////////////
diff --git a/test/geodesicfeassemblerwrappertest.cc b/test/geodesicfeassemblerwrappertest.cc
index 94f8a7ae..e929da0f 100644
--- a/test/geodesicfeassemblerwrappertest.cc
+++ b/test/geodesicfeassemblerwrappertest.cc
@@ -135,12 +135,12 @@ int main (int argc, char *argv[])
                            return values_;
                          };
 
-  CosseratEnergyLocalStiffness<decltype(compositeBasis), dim,adouble> cosseratEnergy(parameters,
-                                                                                     &neumannBoundary,
-                                                                                     neumannFunction,
-                                                                                     nullptr);
+  auto cosseratEnergy = std::make_shared<CosseratEnergyLocalStiffness<decltype(compositeBasis), dim,adouble> >(parameters,
+                                                                                                               &neumannBoundary,
+                                                                                                               neumannFunction,
+                                                                                                               nullptr);
   LocalGeodesicFEADOLCStiffness<CompositeBasis,
-      GFE::ProductManifold<RealTuple<double,dim>,Rotation<double,dim> > > mixedLocalGFEADOLCStiffness(&cosseratEnergy);
+      GFE::ProductManifold<RealTuple<double,dim>,Rotation<double,dim> > > mixedLocalGFEADOLCStiffness(cosseratEnergy);
   MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness);
 
   using DeformationFEBasis = Functions::LagrangeBasis<GridView,displacementOrder>;
diff --git a/test/harmonicmaptest.cc b/test/harmonicmaptest.cc
index 5dcefa47..3b9474b8 100644
--- a/test/harmonicmaptest.cc
+++ b/test/harmonicmaptest.cc
@@ -164,7 +164,7 @@ int main (int argc, char *argv[])
 
   std::shared_ptr<GFE::LocalEnergy<FEBasis,ATargetSpace> > localEnergy = std::make_shared<GFE::LocalIntegralEnergy<FEBasis, InterpolationRule, ATargetSpace> >(harmonicDensity);
 
-  LocalGeodesicFEADOLCStiffness<FEBasis,TargetSpace> localGFEADOLCStiffness(localEnergy.get());
+  LocalGeodesicFEADOLCStiffness<FEBasis,TargetSpace> localGFEADOLCStiffness(localEnergy);
 
   GeodesicFEAssembler<FEBasis,TargetSpace> assembler(feBasis, localGFEADOLCStiffness);
 
diff --git a/test/localadolcstiffnesstest.cc b/test/localadolcstiffnesstest.cc
index 10ca626b..9557f652 100644
--- a/test/localadolcstiffnesstest.cc
+++ b/test/localadolcstiffnesstest.cc
@@ -175,11 +175,10 @@ int main (int argc, char *argv[]) try
   ///////////////////////////////////////////////////////////////////////
 
   // Assembler using ADOL-C
-  CosseratEnergyLocalStiffness<FEBasis, 3,adouble>
-  cosseratEnergyADOLCLocalStiffness(materialParameters, nullptr, nullptr, nullptr);
+  auto cosseratLocalEnergy = std::make_shared<CosseratEnergyLocalStiffness<FEBasis, 3,adouble> >(materialParameters, nullptr, nullptr, nullptr);
 
   LocalGeodesicFEADOLCStiffness<FEBasis,
-      TargetSpace> localGFEADOLCStiffness(&cosseratEnergyADOLCLocalStiffness);
+      TargetSpace> localGFEADOLCStiffness(cosseratLocalEnergy);
 
   // Assembler using finite differences
   CosseratEnergyLocalStiffness<FEBasis, 3,FDType>
diff --git a/test/mixedriemannianpnsolvertest.cc b/test/mixedriemannianpnsolvertest.cc
index 201bed5a..593991aa 100644
--- a/test/mixedriemannianpnsolvertest.cc
+++ b/test/mixedriemannianpnsolvertest.cc
@@ -163,14 +163,14 @@ int main (int argc, char *argv[])
                            return values_;
                          };
 
-  CosseratEnergyLocalStiffness<decltype(compositeBasis), dim, ValueType> cosseratEnergy(parameters,
-                                                                                        &neumannBoundary,
-                                                                                        neumannFunction,
-                                                                                        nullptr);
+  auto cosseratEnergy = std::make_shared<CosseratEnergyLocalStiffness<decltype(compositeBasis), dim, ValueType> >(parameters,
+                                                                                                                  &neumannBoundary,
+                                                                                                                  neumannFunction,
+                                                                                                                  nullptr);
 
   using RBM = GFE::ProductManifold<RealTuple<double,dim>, Rotation<double, dim> >;
 
-  LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> mixedLocalGFEADOLCStiffness(&cosseratEnergy);
+  LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> mixedLocalGFEADOLCStiffness(cosseratEnergy);
 
   MixedGFEAssembler<CompositeBasis, RBM> mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness);
 
-- 
GitLab