From fd029f162ca7a1d09908b45f7b131ffae28aba36 Mon Sep 17 00:00:00 2001 From: Oliver Sander <oliver.sander@tu-dresden.de> Date: Fri, 7 Mar 2025 14:57:51 +0100 Subject: [PATCH] SurfaceCosseratStressAssembler: Take GFE function type from outside Instead of hard-coding LocalGeodesicFEFunction. --- .../gfe/assemblers/surfacecosseratstressassembler.hh | 8 +++----- src/film-on-substrate-stress-plot.cc | 7 ++++++- test/surfacecosseratstressassemblertest.cc | 12 +++++++++++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/dune/gfe/assemblers/surfacecosseratstressassembler.hh b/dune/gfe/assemblers/surfacecosseratstressassembler.hh index bafe6bf7..56ea6d0b 100644 --- a/dune/gfe/assemblers/surfacecosseratstressassembler.hh +++ b/dune/gfe/assemblers/surfacecosseratstressassembler.hh @@ -6,7 +6,6 @@ #include <dune/fufem/boundarypatch.hh> #include <dune/gfe/linearalgebra.hh> -#include <dune/gfe/functions/localgeodesicfefunction.hh> #include <dune/gfe/spaces/rotation.hh> #include <dune/matrix-vector/transpose.hh> @@ -18,10 +17,11 @@ namespace Dune::GFE \tparam BasisOrderD Basis used for the displacement \tparam BasisOrderR Basis used for the rotation + \tparam LocalGFEFunctionR Geometric FE function for the rotations \tparam TargetSpaceD Target space for the Displacement \tparam TargetSpaceR Target space for the Rotation */ - template <class BasisOrderD, class BasisOrderR, class TargetSpaceD, class TargetSpaceR> + template <class BasisOrderD, class BasisOrderR, class LocalGFEFunctionR, class TargetSpaceD, class TargetSpaceR> class SurfaceCosseratStressAssembler { public: @@ -238,9 +238,7 @@ namespace Dune::GFE for (std::size_t i=0; i<localConfigurationRot.size(); i++) localConfigurationRot[i] = rot[localViewOrderR.index(i)[0]]; //localViewOrderR.index(i) is a multiindex, its first entry is the actual index - const auto scalarBasisR = Functions::subspaceBasis(basisOrderR_,0); - typedef LocalGeodesicFEFunction<decltype(scalarBasisR), TargetSpaceR> LocalGFEFunctionType; - LocalGFEFunctionType localGeodesicFEFunction(lFEOrderR,localConfigurationRot); + LocalGFEFunctionR localGeodesicFEFunction(lFEOrderR,localConfigurationRot); auto evaluateAtPoint = [&](FieldVector<double,3> pointGlobal, FieldVector<double,3> pointLocal3d) -> FieldMatrix<double,dim,dim> { Dune::FieldMatrix<double,dim,dim> nablaTheta; diff --git a/src/film-on-substrate-stress-plot.cc b/src/film-on-substrate-stress-plot.cc index 7ccbee58..2294456c 100644 --- a/src/film-on-substrate-stress-plot.cc +++ b/src/film-on-substrate-stress-plot.cc @@ -43,6 +43,7 @@ #include <dune/gfe/filereader.hh> #include <dune/gfe/assemblers/surfacecosseratstressassembler.hh> +#include <dune/gfe/functions/localgeodesicfefunction.hh> #include <dune/gfe/spaces/rotation.hh> // grid dimension @@ -253,7 +254,11 @@ int main (int argc, char *argv[]) try ///////////////////////////////////////////////////////////// int quadOrder = parameterSet.hasKey("quadOrder") ? parameterSet.get<int>("quadOrder") : 4; - auto stressAssembler = GFE::SurfaceCosseratStressAssembler<decltype(basisOrderD),decltype(basisOrderR), FieldVector<double,dim>, GFE::Rotation<double,dim> > + const Functions::LagrangeBasis<GridView,rotationOrder> scalarBasisR(gridView); + + using LocalGFEFunctionR = GFE::LocalGeodesicFEFunction<decltype(scalarBasisR),GFE::Rotation<double,dim> >; + + auto stressAssembler = GFE::SurfaceCosseratStressAssembler<decltype(basisOrderD),decltype(basisOrderR), LocalGFEFunctionR, FieldVector<double,dim>, GFE::Rotation<double,dim> > (basisOrderD, basisOrderR); diff --git a/test/surfacecosseratstressassemblertest.cc b/test/surfacecosseratstressassemblertest.cc index be51c427..7c7aacfa 100644 --- a/test/surfacecosseratstressassemblertest.cc +++ b/test/surfacecosseratstressassemblertest.cc @@ -31,6 +31,7 @@ #include <dune/gfe/filereader.hh> #include <dune/gfe/assemblers/surfacecosseratstressassembler.hh> +#include <dune/gfe/functions/localgeodesicfefunction.hh> #include <dune/gfe/spaces/rotation.hh> #include <dune/matrix-vector/transpose.hh> @@ -237,7 +238,16 @@ int main (int argc, char *argv[]) ///////////////////////////////////////////////////////////// auto quadOrder = 4; - auto stressAssembler = GFE::SurfaceCosseratStressAssembler<decltype(basisOrderD),decltype(basisOrderR), FieldVector<double,dim>, GFE::Rotation<double,dim> > + + const Functions::LagrangeBasis<GridView,rotationOrder> scalarBasisR(gridView); + + using LocalGFEFunctionR = GFE::LocalGeodesicFEFunction<decltype(scalarBasisR),GFE::Rotation<double,dim> >; + + auto stressAssembler = GFE::SurfaceCosseratStressAssembler<decltype(basisOrderD), + decltype(basisOrderR), + LocalGFEFunctionR, + FieldVector<double,dim>, + GFE::Rotation<double,dim> > (basisOrderD, basisOrderR); std::shared_ptr<Elasticity::LocalDensity<dim,ValueType> > elasticDensity; -- GitLab