diff --git a/dune/gfe/chiralskyrmionenergy.hh b/dune/gfe/chiralskyrmionenergy.hh index 7faae8f1dd0e3b62636b966881ca85c948de7ffe..bff58bb4e2e2ccca0746d588fad8d94d78f1a191 100644 --- a/dune/gfe/chiralskyrmionenergy.hh +++ b/dune/gfe/chiralskyrmionenergy.hh @@ -5,7 +5,6 @@ #include <dune/geometry/quadraturerules.hh> #include <dune/gfe/localgeodesicfestiffness.hh> -#include <dune/gfe/localgeodesicfefunction.hh> namespace Dune { @@ -16,7 +15,7 @@ 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 Basis, class field_type> +template<class Basis, class LocalInterpolationRule, class field_type> class ChiralSkyrmionEnergy : public LocalGeodesicFEStiffness<Basis,UnitVector<field_type,3> > { @@ -49,9 +48,9 @@ public: field_type kappa_; }; -template <class Basis, class field_type> -typename ChiralSkyrmionEnergy<Basis, field_type>::RT -ChiralSkyrmionEnergy<Basis, field_type>:: +template <class Basis, class LocalInterpolationRule, class field_type> +typename ChiralSkyrmionEnergy<Basis, LocalInterpolationRule, field_type>::RT +ChiralSkyrmionEnergy<Basis, LocalInterpolationRule, field_type>:: energy(const typename Basis::LocalView& localView, const std::vector<TargetSpace>& localConfiguration) const { @@ -61,8 +60,7 @@ energy(const typename Basis::LocalView& localView, const auto element = localView.element(); const auto& localFiniteElement = localView.tree().finiteElement(); - typedef LocalGeodesicFEFunction<gridDim, double, decltype(localFiniteElement), TargetSpace> LocalGFEFunctionType; - LocalGFEFunctionType localGeodesicFEFunction(localFiniteElement,localConfiguration); + LocalInterpolationRule localInterpolationRule(localFiniteElement,localConfiguration); int quadOrder = (element.type().isSimplex()) ? (localFiniteElement.localBasis().order()-1) * 2 : localFiniteElement.localBasis().order() * 2 * gridDim; @@ -84,13 +82,13 @@ energy(const typename Basis::LocalView& localView, double weight = quad[pt].weight() * integrationElement; // The value of the function - auto value = localGeodesicFEFunction.evaluate(quadPos); + auto value = localInterpolationRule.evaluate(quadPos); // The derivative of the local function defined on the reference element - typename LocalGFEFunctionType::DerivativeType referenceDerivative = localGeodesicFEFunction.evaluateDerivative(quadPos,value); + typename LocalInterpolationRule::DerivativeType referenceDerivative = localInterpolationRule.evaluateDerivative(quadPos,value); // The derivative of the function defined on the actual element - typename LocalGFEFunctionType::DerivativeType derivative(0); + typename LocalInterpolationRule::DerivativeType derivative(0); for (size_t comp=0; comp<referenceDerivative.N(); comp++) jacobianInverseTransposed.umv(referenceDerivative[comp], derivative[comp]); diff --git a/dune/gfe/harmonicenergystiffness.hh b/dune/gfe/harmonicenergystiffness.hh index cc287bc902988ef711e6a31ddb9900f85eb37a6b..b39d882f2b8bc6d4382185039925a83891061b6d 100644 --- a/dune/gfe/harmonicenergystiffness.hh +++ b/dune/gfe/harmonicenergystiffness.hh @@ -5,9 +5,8 @@ #include <dune/geometry/quadraturerules.hh> #include "localgeodesicfestiffness.hh" -#include "localgeodesicfefunction.hh" -template<class Basis, class TargetSpace> +template<class Basis, class LocalInterpolationRule, class TargetSpace> class HarmonicEnergyLocalStiffness : public LocalGeodesicFEStiffness<Basis,TargetSpace> { @@ -27,17 +26,16 @@ public: }; -template <class Basis, class TargetSpace> -typename HarmonicEnergyLocalStiffness<Basis, TargetSpace>::RT -HarmonicEnergyLocalStiffness<Basis, TargetSpace>:: +template <class Basis, class LocalInterpolationRule, class TargetSpace> +typename HarmonicEnergyLocalStiffness<Basis, LocalInterpolationRule, TargetSpace>::RT +HarmonicEnergyLocalStiffness<Basis, LocalInterpolationRule, TargetSpace>:: energy(const typename Basis::LocalView& localView, const std::vector<TargetSpace>& localSolution) const { RT energy = 0; const auto& localFiniteElement = localView.tree().finiteElement(); - typedef LocalGeodesicFEFunction<gridDim, double, decltype(localFiniteElement), TargetSpace> LocalGFEFunctionType; - LocalGFEFunctionType localGeodesicFEFunction(localFiniteElement,localSolution); + LocalInterpolationRule localInterpolationRule(localFiniteElement,localSolution); int quadOrder = (localFiniteElement.type().isSimplex()) ? (localFiniteElement.localBasis().order()-1) * 2 : localFiniteElement.localBasis().order() * 2 * gridDim; @@ -58,10 +56,10 @@ energy(const typename Basis::LocalView& localView, double weight = quad[pt].weight() * integrationElement; // The derivative of the local function defined on the reference element - auto referenceDerivative = localGeodesicFEFunction.evaluateDerivative(quadPos); + auto referenceDerivative = localInterpolationRule.evaluateDerivative(quadPos); // The derivative of the function defined on the actual element - typename LocalGFEFunctionType::DerivativeType derivative(0); + typename LocalInterpolationRule::DerivativeType derivative(0); for (size_t comp=0; comp<referenceDerivative.N(); comp++) jacobianInverseTransposed.umv(referenceDerivative[comp], derivative[comp]); diff --git a/src/harmonicmaps.cc b/src/harmonicmaps.cc index ce16c9a75bf8f3a5beb3a376bdfd7456e21e8192..eb306a6ef6df07375bc5d8d6d1f0853312d804ca 100644 --- a/src/harmonicmaps.cc +++ b/src/harmonicmaps.cc @@ -35,6 +35,8 @@ #include <dune/gfe/rotation.hh> #include <dune/gfe/unitvector.hh> #include <dune/gfe/realtuple.hh> +#include <dune/gfe/localgeodesicfefunction.hh> +#include <dune/gfe/localprojectedfefunction.hh> #include <dune/gfe/localgeodesicfeadolcstiffness.hh> #include <dune/gfe/harmonicenergystiffness.hh> #include <dune/gfe/chiralskyrmionenergy.hh> @@ -189,20 +191,23 @@ int main (int argc, char *argv[]) try // Create an assembler for the Harmonic Energy Functional // //////////////////////////////////////////////////////////// - // Assembler using ADOL-C typedef TargetSpace::rebind<adouble>::other ATargetSpace; + typedef LocalGeodesicFEFunction<dim, double, FEBasis::LocalView::Tree::FiniteElement, ATargetSpace> LocalInterpolationRule; + //typedef GFE::LocalProjectedFEFunction<dim, double, FEBasis::LocalView::Tree::FiniteElement, ATargetSpace> LocalInterpolationRule; + + // Assembler using ADOL-C std::shared_ptr<LocalGeodesicFEStiffness<FEBasis,ATargetSpace> > localEnergy; std::string energy = parameterSet.get<std::string>("energy"); if (energy == "harmonic") { - localEnergy.reset(new HarmonicEnergyLocalStiffness<FEBasis, ATargetSpace>); + localEnergy.reset(new HarmonicEnergyLocalStiffness<FEBasis, LocalInterpolationRule, ATargetSpace>); } else if (energy == "chiral_skyrmion") { - localEnergy.reset(new GFE::ChiralSkyrmionEnergy<FEBasis, adouble>(parameterSet.sub("energyParameters"))); + localEnergy.reset(new GFE::ChiralSkyrmionEnergy<FEBasis, LocalInterpolationRule, adouble>(parameterSet.sub("energyParameters"))); } else DUNE_THROW(Exception, "Unknown energy type '" << energy << "'");