3 #ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
4 #define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
8 #include <dune/common/typetraits.hh>
10 #include <dune/typetree/treecontainer.hh>
66 template<
typename B,
typename V,
67 typename NTRE = HierarchicNodeToRangeMap,
68 typename R =
typename V::value_type>
77 using Coefficient = Dune::AutonomousValue<decltype(std::declval<Vector>()[std::declval<typename Basis::MultiIndex>()])>;
81 using Tree =
typename Basis::LocalView::Tree;
94 using LocalView =
typename Basis::LocalView;
95 using size_type =
typename Tree::size_type;
98 using LocalBasisRange =
typename Node::FiniteElement::Traits::LocalBasisType::Traits::RangeType;
101 using NodeData =
typename std::vector<LocalBasisRange<Node>>;
103 using PerNodeEvaluationBuffer =
typename TypeTree::TreeContainer<NodeData,Tree>;
113 : globalFunction_(&globalFunction)
114 , localView_(globalFunction.
basis().localView())
115 , evaluationBuffer_(localView_.tree())
118 localDoFs_.reserve(localView_.maxSize());
122 : globalFunction_(other.globalFunction_)
123 , localView_(other.localView_)
124 , evaluationBuffer_(localView_.tree())
125 , bound_(other.bound_)
127 localDoFs_.reserve(localView_.maxSize());
129 localDoFs_ = other.localDoFs_;
134 globalFunction_ = other.globalFunction_;
135 localView_ = other.localView_;
136 bound_ = other.bound_;
138 localDoFs_ = other.localDoFs_;
150 localView_.bind(element);
163 localDoFs_.resize(localView_.size());
164 for (size_type i = 0; i < localView_.tree().size(); ++i)
169 size_t localIndex = localView_.tree().localIndex(i);
170 localDoFs_[localIndex] = globalFunction_->
dofs()[localView_.index(localIndex)];
200 TypeTree::forEachLeafNode(localView_.tree(), [&](
auto&& node,
auto&& treePath) {
201 const auto& nodeToRangeEntry = globalFunction_->nodeToRangeEntry();
202 const auto& fe = node.finiteElement();
203 const auto& localBasis = fe.localBasis();
204 auto& shapeFunctionValues = evaluationBuffer_[treePath];
206 localBasis.evaluateFunction(x, shapeFunctionValues);
209 auto re = flatVectorView(nodeToRangeEntry(node, treePath, y));
211 for (size_type i = 0; i < localBasis.size(); ++i)
214 auto c = flatVectorView(localDoFs_[node.localIndex(i)]);
217 auto v = flatVectorView(shapeFunctionValues[i]);
223 auto&& dimC = c.size();
224 auto dimV = v.size();
225 assert(dimC*dimV == re.size());
226 for(size_type j=0; j<dimC; ++j)
229 for(size_type k=0; k<dimV; ++k)
230 re[j*dimV + k] += c_j*v[k];
240 return localView_.element();
245 DUNE_THROW(NotImplemented,
"not implemented");
251 LocalView localView_;
252 mutable PerNodeEvaluationBuffer evaluationBuffer_;
254 std::vector<Coefficient> localDoFs_;
257 template<
class B_T,
class V_T,
class NTRE_T>
259 entitySet_(basis.gridView()),
260 basis_(wrap_or_move(std::forward<B_T>(basis))),
261 coefficients_(wrap_or_move(std::forward<V_T>(coefficients))),
262 nodeToRangeEntry_(wrap_or_move(std::forward<NTRE_T>(nodeToRangeEntry)))
265 DiscreteGlobalBasisFunction(std::shared_ptr<const Basis> basis, std::shared_ptr<const V> coefficients, std::shared_ptr<const NodeToRangeEntry> nodeToRangeEntry) :
266 entitySet_(basis->gridView()),
268 coefficients_(coefficients),
269 nodeToRangeEntry_(nodeToRangeEntry)
279 return *coefficients_;
284 return *nodeToRangeEntry_;
290 DUNE_THROW(NotImplemented,
"not implemented");
295 DUNE_THROW(NotImplemented,
"not implemented");
328 EntitySet entitySet_;
329 std::shared_ptr<const Basis> basis_;
330 std::shared_ptr<const V> coefficients_;
331 std::shared_ptr<const NodeToRangeEntry> nodeToRangeEntry_;
346 template<
typename... TT>
351 template<
typename R,
typename B,
typename V>
354 using Basis = std::decay_t<B>;
359 auto toConstVectorBackend = [&](
auto&& v) -> decltype(
auto) {
361 return std::forward<decltype(v)>(v);
367 using Vector = std::decay_t<decltype(toConstVectorBackend(std::forward<V>(vector)))>;
369 std::forward<B>(basis),
370 toConstVectorBackend(std::forward<V>(vector)),
friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t)
Construct local function from a DiscreteGlobalBasisFunction.
Definition: discreteglobalbasisfunction.hh:313
void localFunction(DiscreteGlobalBasisFunction< TT... > &&t)=delete
Construction of local functions from a temporary DiscreteGlobalBasisFunction (forbidden)
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition: istlvectorbackend.hh:345
Definition: polynomial.hh:10
auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector)
Definition: discreteglobalbasisfunction.hh:352
Definition: backends/concepts.hh:21
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
A simple node to range map using the nested tree indices.
Definition: hierarchicnodetorangemap.hh:30
A grid function induced by a global basis and a coefficient vector.
Definition: discreteglobalbasisfunction.hh:70
Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename Basis::MultiIndex >()])> Coefficient
Definition: discreteglobalbasisfunction.hh:77
Imp::GridFunctionTraits< Range(Domain), EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition: discreteglobalbasisfunction.hh:90
DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T &&nodeToRangeEntry)
Definition: discreteglobalbasisfunction.hh:258
friend Traits::DerivativeInterface derivative(const DiscreteGlobalBasisFunction &t)
Definition: discreteglobalbasisfunction.hh:293
const V & dofs() const
Definition: discreteglobalbasisfunction.hh:277
const Basis & basis() const
Definition: discreteglobalbasisfunction.hh:272
const EntitySet & entitySet() const
Get associated EntitySet.
Definition: discreteglobalbasisfunction.hh:321
DiscreteGlobalBasisFunction(std::shared_ptr< const Basis > basis, std::shared_ptr< const V > coefficients, std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry)
Definition: discreteglobalbasisfunction.hh:265
typename Basis::GridView GridView
Definition: discreteglobalbasisfunction.hh:79
GridViewEntitySet< GridView, 0 > EntitySet
Definition: discreteglobalbasisfunction.hh:80
typename EntitySet::LocalCoordinate LocalDomain
Definition: discreteglobalbasisfunction.hh:87
typename EntitySet::Element Element
Definition: discreteglobalbasisfunction.hh:88
B Basis
Definition: discreteglobalbasisfunction.hh:72
typename EntitySet::GlobalCoordinate Domain
Definition: discreteglobalbasisfunction.hh:84
R Range
Definition: discreteglobalbasisfunction.hh:85
V Vector
Definition: discreteglobalbasisfunction.hh:73
typename Basis::LocalView::Tree Tree
Definition: discreteglobalbasisfunction.hh:81
NTRE NodeToRangeEntry
Definition: discreteglobalbasisfunction.hh:82
const NodeToRangeEntry & nodeToRangeEntry() const
Definition: discreteglobalbasisfunction.hh:282
Definition: discreteglobalbasisfunction.hh:93
GlobalFunction::Element Element
Definition: discreteglobalbasisfunction.hh:110
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition: discreteglobalbasisfunction.hh:148
bool bound() const
Check if LocalFunction is already bound to an element.
Definition: discreteglobalbasisfunction.hh:183
LocalDomain Domain
Definition: discreteglobalbasisfunction.hh:108
const Element & localContext() const
Definition: discreteglobalbasisfunction.hh:238
GlobalFunction::Range Range
Definition: discreteglobalbasisfunction.hh:109
friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction &t)
Definition: discreteglobalbasisfunction.hh:243
void unbind()
Definition: discreteglobalbasisfunction.hh:174
LocalFunction & operator=(const LocalFunction &other)
Definition: discreteglobalbasisfunction.hh:132
LocalFunction(const DiscreteGlobalBasisFunction &globalFunction)
Definition: discreteglobalbasisfunction.hh:112
Range operator()(const Domain &x) const
Evaluate LocalFunction at bound element.
Definition: discreteglobalbasisfunction.hh:196
LocalFunction(const LocalFunction &other)
Definition: discreteglobalbasisfunction.hh:121
Definition: gridfunction.hh:32
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36