From 0f1f50c630dc6c8007d202ec4ec18f1cf89c5b1f Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Wed, 18 Mar 2015 11:10:49 +0000 Subject: [PATCH] LocalGeodesicFEStiffness now gets a basis, instead of GridView and a LocalFiniteElement Conceptually cleaner, and makes for simpler code. Most importantly, we will want to pass the Basis::LocalView to the local assemblers. For that we need the actual basis, not just the grid view and local finite element. [[Imported from SVN: r10082]] --- dune/gfe/chiralskyrmionenergy.hh | 14 ++++++------ dune/gfe/geodesicfeassembler.hh | 6 ++---- dune/gfe/harmonicenergystiffness.hh | 14 ++++++------ dune/gfe/localgeodesicfeadolcstiffness.hh | 26 ++++++++++++----------- dune/gfe/localgeodesicfestiffness.hh | 14 ++++++------ src/harmonicmaps.cc | 10 ++++----- 6 files changed, 44 insertions(+), 40 deletions(-) diff --git a/dune/gfe/chiralskyrmionenergy.hh b/dune/gfe/chiralskyrmionenergy.hh index 99ee3ca9..943e16ab 100644 --- a/dune/gfe/chiralskyrmionenergy.hh +++ b/dune/gfe/chiralskyrmionenergy.hh @@ -16,13 +16,15 @@ namespace GFE { * The energy is discussed in: * - Christof Melcher, "Chiral skyrmions in the plane", Proc. of the Royal Society, online DOI DOI: 10.1098/rspa.2014.0394 */ -template<class GridView, class LocalFiniteElement, class field_type> +template<class Basis, class field_type> class ChiralSkyrmionEnergy -: public LocalGeodesicFEStiffness<GridView,LocalFiniteElement,UnitVector<field_type,3> > +: public LocalGeodesicFEStiffness<Basis,UnitVector<field_type,3> > { // various useful types typedef UnitVector<field_type,3> TargetSpace; - typedef typename GridView::Grid::ctype DT; + typedef typename Basis::GridView GridView; + typedef typename Basis::LocalView::Tree::FiniteElement LocalFiniteElement; + typedef typename GridView::ctype DT; typedef typename TargetSpace::ctype RT; typedef typename GridView::template Codim<0>::Entity Entity; @@ -49,9 +51,9 @@ public: field_type kappa_; }; -template <class GridView, class LocalFiniteElement, class field_type> -typename ChiralSkyrmionEnergy<GridView, LocalFiniteElement, field_type>::RT -ChiralSkyrmionEnergy<GridView, LocalFiniteElement, field_type>:: +template <class Basis, class field_type> +typename ChiralSkyrmionEnergy<Basis, field_type>::RT +ChiralSkyrmionEnergy<Basis, field_type>:: energy(const Entity& element, const LocalFiniteElement& localFiniteElement, const std::vector<TargetSpace>& localConfiguration) const diff --git a/dune/gfe/geodesicfeassembler.hh b/dune/gfe/geodesicfeassembler.hh index 8528b911..42e67c44 100644 --- a/dune/gfe/geodesicfeassembler.hh +++ b/dune/gfe/geodesicfeassembler.hh @@ -32,15 +32,13 @@ public: protected: - LocalGeodesicFEStiffness<GridView, - typename Basis::LocalView::Tree::FiniteElement, - TargetSpace>* localStiffness_; + LocalGeodesicFEStiffness<Basis,TargetSpace>* localStiffness_; public: /** \brief Constructor for a given grid */ GeodesicFEAssembler(const Basis& basis, - LocalGeodesicFEStiffness<GridView,typename Basis::LocalView::Tree::FiniteElement, TargetSpace>* localStiffness) + LocalGeodesicFEStiffness<Basis, TargetSpace>* localStiffness) : basis_(basis), basisIndexSet_(basis_.indexSet()), localStiffness_(localStiffness) diff --git a/dune/gfe/harmonicenergystiffness.hh b/dune/gfe/harmonicenergystiffness.hh index bd913400..17097318 100644 --- a/dune/gfe/harmonicenergystiffness.hh +++ b/dune/gfe/harmonicenergystiffness.hh @@ -7,12 +7,14 @@ #include "localgeodesicfestiffness.hh" #include "localgeodesicfefunction.hh" -template<class GridView, class LocalFiniteElement, class TargetSpace> +template<class Basis, class TargetSpace> class HarmonicEnergyLocalStiffness - : public LocalGeodesicFEStiffness<GridView,LocalFiniteElement,TargetSpace> + : public LocalGeodesicFEStiffness<Basis,TargetSpace> { // grid types - typedef typename GridView::Grid::ctype DT; + typedef typename Basis::GridView GridView; + typedef typename Basis::LocalView::Tree::FiniteElement LocalFiniteElement; + typedef typename GridView::ctype DT; typedef typename TargetSpace::ctype RT; typedef typename GridView::template Codim<0>::Entity Entity; @@ -31,9 +33,9 @@ public: }; -template <class GridView, class LocalFiniteElement, class TargetSpace> -typename HarmonicEnergyLocalStiffness<GridView, LocalFiniteElement, TargetSpace>::RT -HarmonicEnergyLocalStiffness<GridView, LocalFiniteElement, TargetSpace>:: +template <class Basis, class TargetSpace> +typename HarmonicEnergyLocalStiffness<Basis, TargetSpace>::RT +HarmonicEnergyLocalStiffness<Basis, TargetSpace>:: energy(const Entity& element, const LocalFiniteElement& localFiniteElement, const std::vector<TargetSpace>& localSolution) const diff --git a/dune/gfe/localgeodesicfeadolcstiffness.hh b/dune/gfe/localgeodesicfeadolcstiffness.hh index f31251cf..412a0948 100644 --- a/dune/gfe/localgeodesicfeadolcstiffness.hh +++ b/dune/gfe/localgeodesicfeadolcstiffness.hh @@ -18,12 +18,14 @@ /** \brief Assembles energy gradient and Hessian with ADOL-C (automatic differentiation) */ -template<class GridView, class LocalFiniteElement, class TargetSpace> +template<class Basis, class TargetSpace> class LocalGeodesicFEADOLCStiffness - : public LocalGeodesicFEStiffness<GridView,LocalFiniteElement,TargetSpace> + : public LocalGeodesicFEStiffness<Basis,TargetSpace> { // grid types - typedef typename GridView::Grid::ctype DT; + typedef typename Basis::GridView GridView; + typedef typename Basis::LocalView::Tree::FiniteElement LocalFiniteElement; + typedef typename GridView::ctype DT; typedef typename TargetSpace::ctype RT; typedef typename GridView::template Codim<0>::Entity Entity; @@ -40,7 +42,7 @@ public: //! Dimension of the embedding space enum { embeddedBlocksize = TargetSpace::EmbeddedTangentVector::dimension }; - LocalGeodesicFEADOLCStiffness(const LocalGeodesicFEStiffness<GridView, LocalFiniteElement, ATargetSpace>* energy) + LocalGeodesicFEADOLCStiffness(const LocalGeodesicFEStiffness<Basis, ATargetSpace>* energy) : localEnergy_(energy) {} @@ -67,14 +69,14 @@ public: const std::vector<TargetSpace>& localSolution, std::vector<typename TargetSpace::TangentVector>& localGradient); - const LocalGeodesicFEStiffness<GridView, LocalFiniteElement, ATargetSpace>* localEnergy_; + const LocalGeodesicFEStiffness<Basis, ATargetSpace>* localEnergy_; }; -template <class GridView, class LocalFiniteElement, class TargetSpace> -typename LocalGeodesicFEADOLCStiffness<GridView, LocalFiniteElement, TargetSpace>::RT -LocalGeodesicFEADOLCStiffness<GridView, LocalFiniteElement, TargetSpace>:: +template <class Basis, class TargetSpace> +typename LocalGeodesicFEADOLCStiffness<Basis, TargetSpace>::RT +LocalGeodesicFEADOLCStiffness<Basis, TargetSpace>:: energy(const Entity& element, const LocalFiniteElement& localFiniteElement, const std::vector<TargetSpace>& localSolution) const @@ -122,8 +124,8 @@ energy(const Entity& element, } -template <class GridView, class LocalFiniteElement, class TargetSpace> -void LocalGeodesicFEADOLCStiffness<GridView, LocalFiniteElement, TargetSpace>:: +template <class Basis, class TargetSpace> +void LocalGeodesicFEADOLCStiffness<Basis, TargetSpace>:: assembleGradient(const Entity& element, const LocalFiniteElement& localFiniteElement, const std::vector<TargetSpace>& localSolution, @@ -170,8 +172,8 @@ assembleGradient(const Entity& element, // To compute the Hessian we need to compute the gradient anyway, so we may // as well return it. This saves assembly time. // /////////////////////////////////////////////////////////// -template <class GridType, class LocalFiniteElement, class TargetSpace> -void LocalGeodesicFEADOLCStiffness<GridType, LocalFiniteElement, TargetSpace>:: +template <class Basis, class TargetSpace> +void LocalGeodesicFEADOLCStiffness<Basis, TargetSpace>:: assembleGradientAndHessian(const Entity& element, const LocalFiniteElement& localFiniteElement, const std::vector<TargetSpace>& localSolution, diff --git a/dune/gfe/localgeodesicfestiffness.hh b/dune/gfe/localgeodesicfestiffness.hh index a49e84ce..ed782db1 100644 --- a/dune/gfe/localgeodesicfestiffness.hh +++ b/dune/gfe/localgeodesicfestiffness.hh @@ -7,11 +7,13 @@ #include <dune/istl/matrix.hh> -template<class GridView, class LocalFiniteElement, class TargetSpace> +template<class Basis, class TargetSpace> class LocalGeodesicFEStiffness { // grid types - typedef typename GridView::Grid::ctype DT; + typedef typename Basis::GridView GridView; + typedef typename Basis::LocalView::Tree::FiniteElement LocalFiniteElement; + typedef typename GridView::ctype DT; typedef typename TargetSpace::ctype RT; typedef typename GridView::template Codim<0>::Entity Entity; @@ -63,8 +65,8 @@ public: }; -template <class GridView, class LocalFiniteElement, class TargetSpace> -void LocalGeodesicFEStiffness<GridView, LocalFiniteElement, TargetSpace>:: +template <class Basis, class TargetSpace> +void LocalGeodesicFEStiffness<Basis, TargetSpace>:: assembleGradient(const Entity& element, const LocalFiniteElement& localFiniteElement, const std::vector<TargetSpace>& localSolution, @@ -77,8 +79,8 @@ assembleGradient(const Entity& element, // /////////////////////////////////////////////////////////// // Compute gradient by finite-difference approximation // /////////////////////////////////////////////////////////// -template <class GridType, class LocalFiniteElement, class TargetSpace> -void LocalGeodesicFEStiffness<GridType, LocalFiniteElement, TargetSpace>:: +template <class Basis, class TargetSpace> +void LocalGeodesicFEStiffness<Basis, TargetSpace>:: assembleGradientAndHessian(const Entity& element, const LocalFiniteElement& localFiniteElement, const std::vector<TargetSpace>& localSolution, diff --git a/src/harmonicmaps.cc b/src/harmonicmaps.cc index 101bc482..69f64917 100644 --- a/src/harmonicmaps.cc +++ b/src/harmonicmaps.cc @@ -177,25 +177,23 @@ int main (int argc, char *argv[]) try // Assembler using ADOL-C typedef TargetSpace::rebind<adouble>::other ATargetSpace; - std::shared_ptr<LocalGeodesicFEStiffness<GridType::LeafGridView,FEBasis::LocalView::Tree::FiniteElement,ATargetSpace> > localEnergy; + std::shared_ptr<LocalGeodesicFEStiffness<FEBasis,ATargetSpace> > localEnergy; std::string energy = parameterSet.get<std::string>("energy"); if (energy == "harmonic") { - localEnergy.reset(new HarmonicEnergyLocalStiffness<GridType::LeafGridView, FEBasis::LocalView::Tree::FiniteElement, ATargetSpace>); + localEnergy.reset(new HarmonicEnergyLocalStiffness<FEBasis, ATargetSpace>); } else if (energy == "chiral_skyrmion") { - localEnergy.reset(new GFE::ChiralSkyrmionEnergy<GridType::LeafGridView, FEBasis::LocalView::Tree::FiniteElement, adouble>(parameterSet.sub("energyParameters"))); + localEnergy.reset(new GFE::ChiralSkyrmionEnergy<FEBasis, adouble>(parameterSet.sub("energyParameters"))); } else DUNE_THROW(Exception, "Unknown energy type '" << energy << "'"); - LocalGeodesicFEADOLCStiffness<GridType::LeafGridView, - FEBasis::LocalView::Tree::FiniteElement, - TargetSpace> localGFEADOLCStiffness(localEnergy.get()); + LocalGeodesicFEADOLCStiffness<FEBasis,TargetSpace> localGFEADOLCStiffness(localEnergy.get()); GeodesicFEAssembler<FEBasis,TargetSpace> assembler(feBasis, &localGFEADOLCStiffness); -- GitLab