diff --git a/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh b/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh index 12d2b789530bdbeb07227514992cedb4354d9ee9..d7129ef58df34963cb8f0e366c10700e0d1fab62 100644 --- a/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh +++ b/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh @@ -28,16 +28,16 @@ namespace Dune::GFE { //! typedef Dune::FieldMatrix<double, blocksize, blocksize> MatrixBlock; - typedef typename MixedGFEAssembler<Basis, MixedSpace0, MixedSpace1>::MatrixType MatrixType; + typedef typename MixedGFEAssembler<Basis, TargetSpace>::MatrixType MatrixType; protected: - MixedGFEAssembler<Basis, MixedSpace0, MixedSpace1>* mixedAssembler_; + MixedGFEAssembler<Basis, TargetSpace>* mixedAssembler_; public: const ScalarBasis& basis_; /** \brief Constructor for a given grid */ - GeodesicFEAssemblerWrapper(MixedGFEAssembler<Basis, MixedSpace0, MixedSpace1>* mixedAssembler, ScalarBasis& basis) + GeodesicFEAssemblerWrapper(MixedGFEAssembler<Basis, TargetSpace>* mixedAssembler, ScalarBasis& basis) : mixedAssembler_(mixedAssembler), basis_(basis) { diff --git a/dune/gfe/assemblers/mixedgfeassembler.hh b/dune/gfe/assemblers/mixedgfeassembler.hh index 854fd36d8b3167aaf1a5e94733717792649cbe35..a3010a1ec862df81b79df032c74fddc58adf50c6 100644 --- a/dune/gfe/assemblers/mixedgfeassembler.hh +++ b/dune/gfe/assemblers/mixedgfeassembler.hh @@ -14,12 +14,14 @@ /** \brief A global FE assembler for problems involving functions that map into non-Euclidean spaces */ -template <class Basis, class TargetSpace0, class TargetSpace1> +template <class Basis, class TargetSpace> class MixedGFEAssembler { typedef typename Basis::GridView GridView; typedef typename GridView::template Codim<0>::template Partition<Dune::Interior_Partition>::Iterator ElementIterator; - using TargetSpace = Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1>; + + using TargetSpace0 = std::tuple_element_t<0,TargetSpace>; + using TargetSpace1 = std::tuple_element_t<1,TargetSpace>; using LocalStiffness = LocalGeodesicFEStiffness<Basis, TargetSpace>; @@ -86,8 +88,8 @@ public: -template <class Basis, class TargetSpace0, class TargetSpace1> -void MixedGFEAssembler<Basis,TargetSpace0,TargetSpace1>:: +template <class Basis, class TargetSpace> +void MixedGFEAssembler<Basis,TargetSpace>:: getMatrixPattern(Dune::MatrixIndexSet& nb00, Dune::MatrixIndexSet& nb01, Dune::MatrixIndexSet& nb10, @@ -134,8 +136,8 @@ getMatrixPattern(Dune::MatrixIndexSet& nb00, } -template <class Basis, class TargetSpace0, class TargetSpace1> -void MixedGFEAssembler<Basis,TargetSpace0,TargetSpace1>:: +template <class Basis, class TargetSpace> +void MixedGFEAssembler<Basis,TargetSpace>:: assembleGradientAndHessian(const std::vector<TargetSpace0>& configuration0, const std::vector<TargetSpace1>& configuration1, Dune::BlockVector<Dune::FieldVector<double, blocksize0> >& gradient0, @@ -278,8 +280,8 @@ assembleGradientAndHessian(const std::vector<TargetSpace0>& configuration0, } } -template <class Basis, class TargetSpace0, class TargetSpace1> -double MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>:: +template <class Basis, class TargetSpace> +double MixedGFEAssembler<Basis, TargetSpace>:: computeEnergy(const std::vector<TargetSpace0>& configuration0, const std::vector<TargetSpace1>& configuration1) const { diff --git a/dune/gfe/mixedriemannianpnsolver.cc b/dune/gfe/mixedriemannianpnsolver.cc index 588414a00fa5ee5e7a41c09f1fa8141557210b91..167c7d92ac8da258b589ff57b3d0bd39126fd297 100644 --- a/dune/gfe/mixedriemannianpnsolver.cc +++ b/dune/gfe/mixedriemannianpnsolver.cc @@ -12,7 +12,7 @@ template <class MixedBasis, class BitVector> void Dune::GFE::MixedRiemannianProximalNewtonSolver<MixedBasis,Basis0,TargetSpace0,Basis1,TargetSpace1,BitVector>:: setup(const GridType& grid, - const MixedGFEAssembler<MixedBasis, TargetSpace0, TargetSpace1>* assembler, + const MixedGFEAssembler<MixedBasis, TargetSpace>* assembler, const SolutionType& x, const BitVector& dirichletNodes, double tolerance, diff --git a/dune/gfe/mixedriemannianpnsolver.hh b/dune/gfe/mixedriemannianpnsolver.hh index a0314bbd02f5dc22db8807d9e7a3f299f5cfe608..37e24bf19dc07df7a3d605afdfc0dc5fbccde933 100644 --- a/dune/gfe/mixedriemannianpnsolver.hh +++ b/dune/gfe/mixedriemannianpnsolver.hh @@ -31,6 +31,8 @@ namespace Dune::GFE { using GridType = typename MixedBasis::GridView::Grid; + using TargetSpace = ProductManifold<TargetSpace0,TargetSpace1>; + const static int blocksize0 = TargetSpace0::TangentVector::dimension; const static int blocksize1 = TargetSpace1::TangentVector::dimension; @@ -64,7 +66,7 @@ namespace Dune::GFE {} void setup(const GridType& grid, - const MixedGFEAssembler<MixedBasis, TargetSpace0, TargetSpace1>* assembler, + const MixedGFEAssembler<MixedBasis, TargetSpace>* assembler, const SolutionType& x, const BitVector& dirichletNodes, double tolerance, @@ -105,7 +107,7 @@ namespace Dune::GFE std::unique_ptr<MatrixType> hessianMatrix_; /** \brief The assembler for the material law */ - const MixedGFEAssembler<MixedBasis, TargetSpace0, TargetSpace1>* assembler_; + const MixedGFEAssembler<MixedBasis, TargetSpace>* assembler_; /** \brief The solver for the quadratic inner problems */ std::shared_ptr<Solvers::CholmodSolver<MatrixType, CorrectionType, BitVector> > innerSolver_; diff --git a/dune/gfe/mixedriemanniantrsolver.cc b/dune/gfe/mixedriemanniantrsolver.cc index 890be19551821fc1a33ab9c13b4e4b8778916212..770f3c56ae8808ad7b80aeb5ccc59282234144d7 100644 --- a/dune/gfe/mixedriemanniantrsolver.cc +++ b/dune/gfe/mixedriemanniantrsolver.cc @@ -27,7 +27,7 @@ template <class GridType, class Basis1, class TargetSpace1> void MixedRiemannianTrustRegionSolver<GridType,Basis,Basis0,TargetSpace0,Basis1,TargetSpace1>:: setup(const GridType& grid, - const MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>* assembler, + const MixedGFEAssembler<Basis, TargetSpace>* assembler, const Basis0& tmpBasis0, const Basis1& tmpBasis1, const SolutionType& x, diff --git a/dune/gfe/mixedriemanniantrsolver.hh b/dune/gfe/mixedriemanniantrsolver.hh index 9740d09af53367be2f0ba8df0c9337b236d1406b..2c17bbcb033f1214d5ea4181e7f454517c365ad8 100644 --- a/dune/gfe/mixedriemanniantrsolver.hh +++ b/dune/gfe/mixedriemanniantrsolver.hh @@ -20,6 +20,7 @@ #include <dune/solvers/iterationsteps/mmgstep.hh> #include <dune/gfe/assemblers/mixedgfeassembler.hh> +#include <dune/gfe/spaces/productmanifold.hh> /** \brief Riemannian trust-region solver for geodesic finite-element problems */ template <class GridType, @@ -34,6 +35,8 @@ class MixedRiemannianTrustRegionSolver const static int gridDim = GridType::dimension; + using TargetSpace = Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1>; + // Centralize the field type here typedef double field_type; @@ -73,7 +76,7 @@ public: /** \brief Set up the solver using a monotone multigrid method as the inner solver */ void setup(const GridType& grid, - const MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>* assembler, + const MixedGFEAssembler<Basis, TargetSpace>* assembler, const Basis0& basis0, const Basis1& basis1, const SolutionType& x, @@ -152,7 +155,7 @@ protected: std::unique_ptr<MatrixType> hessianMatrix_; /** \brief The assembler for the material law */ - const MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>* assembler_; + const MixedGFEAssembler<Basis, TargetSpace>* assembler_; /** \brief TEMPORARY: The two separate matrices */ std::unique_ptr<Basis0> basis0_; diff --git a/src/cosserat-continuum.cc b/src/cosserat-continuum.cc index 440bb93890d49ff49280d86b5b0a176b8e39e6cc..09da40393ab3b483d5bc3a6ad18af4994576f064 100644 --- a/src/cosserat-continuum.cc +++ b/src/cosserat-continuum.cc @@ -503,9 +503,7 @@ int main (int argc, char *argv[]) try LocalGeodesicFEADOLCStiffness<CompositeBasis,TargetSpace> localGFEADOLCStiffness(&localCosseratEnergy, adolcScalarMode); - MixedGFEAssembler<CompositeBasis, - RealTuple<double,3>, - Rotation<double,3> > mixedAssembler(compositeBasis, localGFEADOLCStiffness); + MixedGFEAssembler<CompositeBasis,TargetSpace> mixedAssembler(compositeBasis, localGFEADOLCStiffness); #if MIXED_SPACE if (parameterSet.get<std::string>("solvertype", "trustRegion") == "trustRegion") { @@ -637,9 +635,7 @@ int main (int argc, char *argv[]) try localGFEStiffness = std::make_shared<StiffnessType>(&localCosseratEnergy, adolcScalarMode); #endif - MixedGFEAssembler<CompositeBasis, - RealTuple<double,3>, - Rotation<double,3> > mixedAssembler(compositeBasis, localGFEStiffness); + MixedGFEAssembler<CompositeBasis,TargetSpace> mixedAssembler(compositeBasis, localGFEStiffness); #if MIXED_SPACE MixedRiemannianTrustRegionSolver<GridType, CompositeBasis, diff --git a/src/film-on-substrate.cc b/src/film-on-substrate.cc index 7ae51bf0fc8f5df310a9445de3c7fe5a2e87e67b..efd0f302a09243de149e066ac50389464756fbe5 100644 --- a/src/film-on-substrate.cc +++ b/src/film-on-substrate.cc @@ -537,9 +537,7 @@ int main (int argc, char *argv[]) try sumEnergy.addLocalEnergy(surfaceCosseratEnergy); LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(&sumEnergy); - MixedGFEAssembler<CompositeBasis, - RealTuple<double,dim>, - Rotation<double,dim> > mixedAssembler(compositeBasis, localGFEADOLCStiffness); + MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, localGFEADOLCStiffness); //////////////////////////////////////////////////////// // Set Dirichlet values diff --git a/src/simofoxshell.cc b/src/simofoxshell.cc index 4b5d52f9f008b705d08fae85a2ccbf714a570c24..f67062dd6a8f300514493519f97dcb83421315ae 100644 --- a/src/simofoxshell.cc +++ b/src/simofoxshell.cc @@ -325,8 +325,7 @@ int main(int argc, char *argv[]) try LocalGeodesicFEADOLCStiffness<decltype(compositeBasis), TargetSpace> localGFEADOLCStiffness(&simoFoxEnergyADOLCLocalStiffness); - MixedGFEAssembler<decltype(compositeBasis), - RealTuple<double,3>, UnitVector<double,3> > assembler(compositeBasis, localGFEADOLCStiffness); + MixedGFEAssembler<decltype(compositeBasis),TargetSpace> assembler(compositeBasis, localGFEADOLCStiffness); //////////////////////////////////////////////////////// // Set Dirichlet values //////////////////////////////////////////////////////// diff --git a/test/cosseratcontinuumtest.cc b/test/cosseratcontinuumtest.cc index 9fb4c175ae84cf9e1687980a962c85c79b2e3743..e741625d63bed19b394a09c102f246df6ab01a0a 100644 --- a/test/cosseratcontinuumtest.cc +++ b/test/cosseratcontinuumtest.cc @@ -217,9 +217,7 @@ int main (int argc, char *argv[]) sumEnergy.addLocalEnergy(neumannEnergy); LocalGeodesicFEADOLCStiffness<CompositeBasis,RigidBodyMotion> localGFEADOLCStiffness(&sumEnergy); - MixedGFEAssembler<CompositeBasis, - RealTuple<double,dim>, - Rotation<double,dim> > mixedAssembler(compositeBasis, localGFEADOLCStiffness); + MixedGFEAssembler<CompositeBasis,RigidBodyMotion> mixedAssembler(compositeBasis, localGFEADOLCStiffness); MixedRiemannianTrustRegionSolver<GridType, CompositeBasis, diff --git a/test/filmonsubstratetest.cc b/test/filmonsubstratetest.cc index b39e1b92a5ba1856d344b6ac7c9f0648cdd1a90a..9b543291648d950ac2fc8e628f11d89d77ac9c32 100644 --- a/test/filmonsubstratetest.cc +++ b/test/filmonsubstratetest.cc @@ -364,9 +364,7 @@ int main (int argc, char *argv[]) sumEnergy.addLocalEnergy(surfaceCosseratEnergy); LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(&sumEnergy); - MixedGFEAssembler<CompositeBasis, - RealTuple<double,dim>, - Rotation<double,dim> > mixedAssembler(compositeBasis, localGFEADOLCStiffness); + MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, localGFEADOLCStiffness); //////////////////////////////////////////////////////// // Set Dirichlet values diff --git a/test/geodesicfeassemblerwrappertest.cc b/test/geodesicfeassemblerwrappertest.cc index cc32fdc27789c7281cdfd71815050485a9d8602b..9b6cf7a7b86b47e35035debf59538a2e9ae5a6dc 100644 --- a/test/geodesicfeassemblerwrappertest.cc +++ b/test/geodesicfeassemblerwrappertest.cc @@ -141,9 +141,7 @@ int main (int argc, char *argv[]) nullptr); LocalGeodesicFEADOLCStiffness<CompositeBasis, GFE::ProductManifold<RealTuple<double,dim>,Rotation<double,dim> > > mixedLocalGFEADOLCStiffness(&cosseratEnergy); - MixedGFEAssembler<CompositeBasis, - RealTuple<double,dim>, - Rotation<double,dim> > mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness); + MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness); using DeformationFEBasis = Functions::LagrangeBasis<GridView,displacementOrder>; DeformationFEBasis deformationFEBasis(gridView); diff --git a/test/mixedriemannianpnsolvertest.cc b/test/mixedriemannianpnsolvertest.cc index c8a178c473d836cdc2facb275cef31931f82e98a..89ddeb07e3c28c2e934efedb95ac1391bf5cb0f5 100644 --- a/test/mixedriemannianpnsolvertest.cc +++ b/test/mixedriemannianpnsolvertest.cc @@ -172,9 +172,7 @@ int main (int argc, char *argv[]) LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> mixedLocalGFEADOLCStiffness(&cosseratEnergy); - MixedGFEAssembler<CompositeBasis, - RealTuple<double,dim>, - Rotation<double,dim> > mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness); + MixedGFEAssembler<CompositeBasis, RBM> mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness); using GFEAssemblerWrapper = GFE::GeodesicFEAssemblerWrapper<CompositeBasis, DeformationFEBasis, RBM, RealTuple<double, dim>, Rotation<double,dim> >; GFEAssemblerWrapper assembler(&mixedAssembler, deformationFEBasis);