Skip to content
Snippets Groups Projects
Commit e87a4d1c authored by Max Kahnt's avatar Max Kahnt
Browse files

Use boost::variant to hold QuadKey in SubGridL2FunctionalAssembler.

parent 6e9f47b6
No related branches found
No related tags found
No related merge requests found
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#ifndef SUBGRID_L2_FUNCTIONAL_ASSEMBLER_HH #ifndef SUBGRID_L2_FUNCTIONAL_ASSEMBLER_HH
#define SUBGRID_L2_FUNCTIONAL_ASSEMBLER_HH #define SUBGRID_L2_FUNCTIONAL_ASSEMBLER_HH
#include <boost/variant.hpp>
#include <dune/common/function.hh> #include <dune/common/function.hh>
#include <dune/common/fvector.hh> #include <dune/common/fvector.hh>
...@@ -55,10 +56,9 @@ class SubgridL2FunctionalAssembler : ...@@ -55,10 +56,9 @@ class SubgridL2FunctionalAssembler :
*/ */
template<typename B, typename C, std::enable_if<std::is_base_of<HostGridFunction, BasisGridFunction<B,C>>::value_type>> 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) : SubgridL2FunctionalAssembler(const BasisGridFunction<B, C>& f, const GridType& grid) :
functionQuadKey_(0), quadKeySource_(f),
grid_(grid), grid_(grid),
f_(f), f_(f)
hostBasisGridFunctionInfo_(&f)
{} {}
/** \brief constructor /** \brief constructor
...@@ -76,10 +76,9 @@ class SubgridL2FunctionalAssembler : ...@@ -76,10 +76,9 @@ class SubgridL2FunctionalAssembler :
* \param fQuadKey A QuadratureRuleKey that specifies how to integrate f * \param fQuadKey A QuadratureRuleKey that specifies how to integrate f
*/ */
SubgridL2FunctionalAssembler(const HostGridFunction& f, const GridType& grid, const QuadratureRuleKey& fQuadKey) : SubgridL2FunctionalAssembler(const HostGridFunction& f, const GridType& grid, const QuadratureRuleKey& fQuadKey) :
functionQuadKey_(&fQuadKey), quadKeySource_(fQuadKey),
grid_(grid), grid_(grid),
f_(f), f_(f)
hostBasisGridFunctionInfo_(0)
{ {
if(dynamic_cast<const HostBasisGridFunctionInfo*>(&f)) if(dynamic_cast<const HostBasisGridFunctionInfo*>(&f))
Dune::dwarn << "Overriding HostBasis Quadrature rule." << std::endl; Dune::dwarn << "Overriding HostBasis Quadrature rule." << std::endl;
...@@ -106,10 +105,7 @@ class SubgridL2FunctionalAssembler : ...@@ -106,10 +105,7 @@ class SubgridL2FunctionalAssembler :
// get quadrature rule // get quadrature rule
QuadratureRuleKey quadKey(tFE); QuadratureRuleKey quadKey(tFE);
quadKey.setGeometryType(element.type()); quadKey.setGeometryType(element.type());
if (hostBasisGridFunctionInfo_) quadKey = quadKey.product(boost::apply_visitor( QuadKeySourceVisitor(*baseHostElement), quadKeySource_ ) );
quadKey = quadKey.product(hostBasisGridFunctionInfo_->quadratureRuleKey(*baseHostElement));
else
quadKey = quadKey.product(*functionQuadKey_);
const Dune::template QuadratureRule<double, dim>& quad = QuadratureRuleCache<double, dim>::rule(quadKey); const Dune::template QuadratureRule<double, dim>& quad = QuadratureRuleCache<double, dim>::rule(quadKey);
// loop over quadrature points // loop over quadrature points
...@@ -152,10 +148,7 @@ class SubgridL2FunctionalAssembler : ...@@ -152,10 +148,7 @@ class SubgridL2FunctionalAssembler :
// get quadrature rule // get quadrature rule
QuadratureRuleKey quadKey(tFE); QuadratureRuleKey quadKey(tFE);
quadKey.setGeometryType(hostElement.type()); quadKey.setGeometryType(hostElement.type());
if (hostBasisGridFunctionInfo_) quadKey = quadKey.product(boost::apply_visitor( QuadKeySourceVisitor(hostElement), quadKeySource_ ) );
quadKey = quadKey.product(hostBasisGridFunctionInfo_->quadratureRuleKey(hostElement));
else
quadKey = quadKey.product(*functionQuadKey_);
const Dune::template QuadratureRule<double, dim>& quad = QuadratureRuleCache<double, dim>::rule(quadKey); const Dune::template QuadratureRule<double, dim>& quad = QuadratureRuleCache<double, dim>::rule(quadKey);
...@@ -190,10 +183,21 @@ class SubgridL2FunctionalAssembler : ...@@ -190,10 +183,21 @@ class SubgridL2FunctionalAssembler :
} }
private: 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 GridType& grid_;
const HostGridFunction& f_; const HostGridFunction& f_;
const HostBasisGridFunctionInfo* hostBasisGridFunctionInfo_;
}; };
#endif #endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment