diff --git a/dune/gfe/riemanniantrsolver.hh b/dune/gfe/riemanniantrsolver.hh index 501254bc93e35ad3c62cd43411b884b22eb9a6ba..1880f8a4a30fb61517ea8f173d1d8bcf09aa2b0d 100644 --- a/dune/gfe/riemanniantrsolver.hh +++ b/dune/gfe/riemanniantrsolver.hh @@ -22,6 +22,34 @@ #include <dune/gfe/parallel/globalp1mapper.hh> #include <dune/gfe/parallel/globalp2mapper.hh> +/** \brief Assign GlobalMapper and LocalMapper types to a dune-fufem FunctionSpaceBasis */ +template <typename Basis> +struct MapperFactory +{}; + +/** \brief Specialization for P1NodalBasis */ +template <typename GridView, typename field_type> +struct MapperFactory<P1NodalBasis<GridView,field_type> > +{ + typedef Dune::GlobalP1Mapper<GridView> GlobalMapper; + typedef Dune::MultipleCodimMultipleGeomTypeMapper<GridView, Dune::MCMGVertexLayout> LocalMapper; +}; + +/** \brief Specialization for P2NodalBasis */ +template <typename GridView, typename field_type> +struct MapperFactory<P2NodalBasis<GridView,field_type> > +{ + typedef Dune::GlobalP2Mapper<GridView> GlobalMapper; + typedef P2BasisMapper<GridView> LocalMapper; +}; + +/** \brief Specialization for P3NodalBasis */ +template <typename GridView, typename field_type> +struct MapperFactory<P3NodalBasis<GridView,field_type> > +{ + // Error: we don't currently have a global P3 mapper +}; + /** \brief Riemannian trust-region solver for geodesic finite-element problems */ template <class GridType, class TargetSpace> class RiemannianTrustRegionSolver @@ -41,18 +69,15 @@ class RiemannianTrustRegionSolver typedef std::vector<TargetSpace> SolutionType; #ifdef THIRD_ORDER - // Error: we don't currently have a global P3 mapper -#error RiemannianTrustRegionSolver cannot currently be used for third-order spaces typedef P3NodalBasis<typename GridType::LeafGridView,double> BasisType; #elif defined SECOND_ORDER typedef P2NodalBasis<typename GridType::LeafGridView,double> BasisType; - typedef Dune::GlobalP2Mapper<typename GridType::LeafGridView> GlobalMapper; - typedef P2BasisMapper<typename GridType::LeafGridView> LocalMapper; #else typedef P1NodalBasis<typename GridType::LeafGridView,double> BasisType; - typedef Dune::GlobalP1Mapper<typename GridType::LeafGridView> GlobalMapper; - typedef Dune::MultipleCodimMultipleGeomTypeMapper<typename GridType::LeafGridView, Dune::MCMGVertexLayout> LocalMapper; #endif + typedef typename MapperFactory<BasisType>::GlobalMapper GlobalMapper; + typedef typename MapperFactory<BasisType>::LocalMapper LocalMapper; + public: