diff --git a/dune/fufem/assemblers/localassemblers/subgridl2functionalassembler.hh b/dune/fufem/assemblers/localassemblers/subgridl2functionalassembler.hh index da0f7cfbf2afebea78fbcb4824a2f79fce4d4b86..4843f60f7e2e8ae73e8610023152e5bb1624e864 100644 --- a/dune/fufem/assemblers/localassemblers/subgridl2functionalassembler.hh +++ b/dune/fufem/assemblers/localassemblers/subgridl2functionalassembler.hh @@ -3,6 +3,7 @@ #ifndef SUBGRID_L2_FUNCTIONAL_ASSEMBLER_HH #define SUBGRID_L2_FUNCTIONAL_ASSEMBLER_HH +#include <boost/variant.hpp> #include <dune/common/function.hh> #include <dune/common/fvector.hh> @@ -55,10 +56,9 @@ class SubgridL2FunctionalAssembler : */ template<typename B, typename C, std::enable_if<std::is_base_of<HostGridFunction, BasisGridFunction<B,C>>::value_type>> SubgridL2FunctionalAssembler(const BasisGridFunction<B, C>& f, const GridType& grid) : - functionQuadKey_(0), + quadKeySource_(f), grid_(grid), - f_(f), - hostBasisGridFunctionInfo_(&f) + f_(f) {} /** \brief constructor @@ -76,10 +76,9 @@ class SubgridL2FunctionalAssembler : * \param fQuadKey A QuadratureRuleKey that specifies how to integrate f */ SubgridL2FunctionalAssembler(const HostGridFunction& f, const GridType& grid, const QuadratureRuleKey& fQuadKey) : - functionQuadKey_(&fQuadKey), + quadKeySource_(fQuadKey), grid_(grid), - f_(f), - hostBasisGridFunctionInfo_(0) + f_(f) { if(dynamic_cast<const HostBasisGridFunctionInfo*>(&f)) Dune::dwarn << "Overriding HostBasis Quadrature rule." << std::endl; @@ -106,10 +105,7 @@ class SubgridL2FunctionalAssembler : // get quadrature rule QuadratureRuleKey quadKey(tFE); quadKey.setGeometryType(element.type()); - if (hostBasisGridFunctionInfo_) - quadKey = quadKey.product(hostBasisGridFunctionInfo_->quadratureRuleKey(*baseHostElement)); - else - quadKey = quadKey.product(*functionQuadKey_); + quadKey = quadKey.product(boost::apply_visitor( QuadKeySourceVisitor(*baseHostElement), quadKeySource_ ) ); const Dune::template QuadratureRule<double, dim>& quad = QuadratureRuleCache<double, dim>::rule(quadKey); // loop over quadrature points @@ -152,10 +148,7 @@ class SubgridL2FunctionalAssembler : // get quadrature rule QuadratureRuleKey quadKey(tFE); quadKey.setGeometryType(hostElement.type()); - if (hostBasisGridFunctionInfo_) - quadKey = quadKey.product(hostBasisGridFunctionInfo_->quadratureRuleKey(hostElement)); - else - quadKey = quadKey.product(*functionQuadKey_); + quadKey = quadKey.product(boost::apply_visitor( QuadKeySourceVisitor(hostElement), quadKeySource_ ) ); const Dune::template QuadratureRule<double, dim>& quad = QuadratureRuleCache<double, dim>::rule(quadKey); @@ -190,10 +183,21 @@ class SubgridL2FunctionalAssembler : } private: - const QuadratureRuleKey* functionQuadKey_; + using QuadKeySource = boost::variant<const QuadratureRuleKey&, const HostBasisGridFunctionInfo&>; + struct QuadKeySourceVisitor : public boost::static_visitor<const QuadratureRuleKey&> + { + QuadKeySourceVisitor(const HostElement& e) : e_(e) {} + + const QuadratureRuleKey& operator()(const QuadratureRuleKey& q) const { return q; } + const QuadratureRuleKey& operator()(const HostBasisGridFunctionInfo& info) const { return info.quadratureRuleKey(e_); } + + private: + const HostElement& e_; + }; + + const QuadKeySource quadKeySource_; const GridType& grid_; const HostGridFunction& f_; - const HostBasisGridFunctionInfo* hostBasisGridFunctionInfo_; }; #endif