diff --git a/dune/gfe/assemblers/cosseratenergystiffness.hh b/dune/gfe/assemblers/cosseratenergystiffness.hh index 08831326982b1b697f3fd8062b650e38e0fd06fb..2bbac9fb0315842dab4755a470ce1fc87b993e4f 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 29c61a41aca5f0e690cd870788bb65f4ece0d114..21203f0d04c279280297f651170778fba9d2f45f 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 83d5212b57058b2e60899892c4b5645384bcac50..f3bddce776cc6d3859801c8a5c4a438311ca8144 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 18a120a5f5806ebb3d0e2686c8247609116dbe66..7fb2f4c3498a99fac4d6d1148b0477d6d8a41f8c 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 98d941b502a7cd2e5e6eafa75aa68ed40793788a..0b50acb93f22ab57064345df1b471a720409425d 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 aab8fd39677b1fc3d2ac2fefd37080142acce5b4..dddf5eb897807911557b145dc16ea8982f60a196 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 dd450369d6a7d723ab5ed4c033825842071507d5..46f84e7b88735f9deb58ada751b857de1ba66c92 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!