7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
13#include <dune/common/typetraits.hh>
14#include <dune/common/shared_ptr.hh>
16#include <dune/grid/utility/hierarchicsearch.hh>
18#include <dune/common/typetree/traversal.hh>
19#include <dune/common/typetree/treecontainer.hh>
34template<
typename B,
typename V,
typename NTRE>
43 using Coefficient = Dune::AutonomousValue<decltype(std::declval<Vector>()[std::declval<typename Basis::MultiIndex>()])>;
47 using Tree =
typename Basis::LocalView::Tree;
63 std::shared_ptr<const Basis>
basis;
71 using LocalView =
typename Basis::LocalView;
72 using size_type =
typename Tree::size_type;
140 for (size_type i = 0; i <
localView_.tree().size(); ++i)
145 size_t localIndex =
localView_.tree().localIndex(i);
170 template<
class To,
class From>
175 assert(from_flat.size() == to_flat.size());
176 for (size_type i = 0; i < to_flat.size(); ++i)
177 to_flat[i] = from_flat[i];
180 template<
class Node,
class TreePath,
class Range>
181 decltype(
auto)
nodeToRangeEntry(
const Node& node,
const TreePath& treePath, Range& y)
const
183 return (*
data_->nodeToRangeEntry)(node, treePath, y);
203 return *
data_->basis;
209 return *
data_->coefficients;
215 return *
data_->nodeToRangeEntry;
221 return data_->entitySet;
232template<
typename DGBF>
278template<
typename B,
typename V,
280 typename R =
typename V::value_type>
299 using LocalBasisRange =
typename Node::FiniteElement::Traits::LocalBasisType::Traits::RangeType;
301 using NodeData =
typename std::vector<LocalBasisRange<Node>>;
302 using PerNodeEvaluationBuffer =
typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
309 using size_type =
typename Base::Tree::size_type;
310 using LocalBase::nodeToRangeEntry;
315 using Domain =
typename LocalBase::Domain;
321 : LocalBase(globalFunction.
data_)
341 TypeTree::forEachLeafNode(this->
localView_.tree(), [&](
auto&& node,
auto&& treePath) {
344 const auto& fe = node.finiteElement();
345 const auto& localBasis = fe.localBasis();
346 auto& shapeFunctionValues = evaluationBuffer_[treePath];
348 localBasis.evaluateFunction(x, shapeFunctionValues);
354 using Value = LocalBasisRange< std::decay_t<decltype(node)> >;
355 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
356 auto values = std::array<Value, coeffDim>{};
358 for (size_type i = 0; i < localBasis.size(); ++i)
361 for (std::size_t j = 0; j < coeffDim; ++j)
362 values[j].axpy(c[j], shapeFunctionValues[i]);
383 mutable PerNodeEvaluationBuffer evaluationBuffer_;
387 template<
class B_T,
class V_T,
class NTRE_T>
389 : Base(std::make_shared<Data>(Data{{
basis.gridView()}, wrap_or_move(std::forward<B_T>(basis)), wrap_or_move(std::forward<V_T>(coefficients)), wrap_or_move(std::forward<NTRE_T>(nodeToRangeEntry))}))
394 : Base(std::make_shared<Data>(Data{{
basis->gridView()}, basis, coefficients, nodeToRangeEntry}))
404 HierarchicSearch search(this->
data_->basis->gridView().grid(), this->data_->basis->gridView().indexSet());
406 const auto e = search.findEntity(x);
409 return localThis(e.geometry().local(x));
457template<
typename R,
typename B,
typename V>
460 using Basis = std::decay_t<B>;
465 auto toConstVectorBackend = [&](
auto&& v) ->
decltype(
auto) {
466 if constexpr (models<Concept::ConstVectorBackend<Basis>,
decltype(v)>()) {
467 return std::forward<decltype(v)>(v);
473 using Vector = std::decay_t<decltype(toConstVectorBackend(std::forward<V>(vector)))>;
475 std::forward<B>(
basis),
476 toConstVectorBackend(std::forward<V>(vector)),
495template<
typename DGBF>
500 using Data =
typename Base::Data;
516 using LocalBasisRange =
typename Node::FiniteElement::Traits::LocalBasisType::Traits::JacobianType;
518 using NodeData =
typename std::vector< LocalBasisRange<Node> >;
519 using PerNodeEvaluationBuffer =
typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
531 :
public Base::LocalFunctionBase
533 using LocalBase =
typename Base::LocalFunctionBase;
534 using size_type =
typename Base::Tree::size_type;
535 using LocalBase::nodeToRangeEntry;
539 using Domain =
typename LocalBase::Domain;
545 : LocalBase(globalFunction.
data_)
559 LocalBase::bind(element);
560 geometry_.emplace(element.geometry());
588 const auto& jacobianInverse = geometry_->jacobianInverse(x);
590 TypeTree::forEachLeafNode(this->
localView_.tree(), [&](
auto&& node,
auto&& treePath) {
593 const auto& fe = node.finiteElement();
594 const auto& localBasis = fe.localBasis();
595 auto& shapeFunctionJacobians = evaluationBuffer_[treePath];
597 localBasis.evaluateJacobian(x, shapeFunctionJacobians);
603 using RefJacobian = LocalBasisRange< std::decay_t<decltype(node)> >;
604 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
605 auto refJacobians = std::array<RefJacobian, coeffDim>{};
607 for (size_type i = 0; i < localBasis.size(); ++i)
610 for (std::size_t j = 0; j < coeffDim; ++j)
611 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]);
615 using Jacobian =
decltype(refJacobians[0] * jacobianInverse);
616 auto jacobians = std::array<Jacobian, coeffDim>{};
618 refJacobians.begin(), refJacobians.end(), jacobians.begin(),
619 [&](
const auto& refJacobian) { return refJacobian * jacobianInverse; });
632 DUNE_THROW(NotImplemented,
"derivative of derivative is not implemented");
636 mutable PerNodeEvaluationBuffer evaluationBuffer_;
637 std::optional<typename Element::Geometry> geometry_;
659 HierarchicSearch search(this->
data_->basis->gridView().grid(), this->data_->basis->gridView().indexSet());
661 const auto e = search.findEntity(x);
664 return localThis(e.geometry().local(x));
669 DUNE_THROW(NotImplemented,
"derivative of derivative is not implemented");
auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector)
Generate a DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:458
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition istlvectorbackend.hh:350
Definition monomialset.hh:19
Definition monomialset.hh:19
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition flatvectorview.hh:183
Definition discreteglobalbasisfunction.hh:32
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
Helper class to deduce the signature of a callable.
Definition signature.hh:60
A simple node to range map using the nested tree indices.
Definition hierarchicnodetorangemap.hh:34
Definition discreteglobalbasisfunction.hh:36
std::shared_ptr< const Data > data_
Definition discreteglobalbasisfunction.hh:225
const Vector & dofs() const
Return the coefficients of this discrete function by reference.
Definition discreteglobalbasisfunction.hh:207
B Basis
Definition discreteglobalbasisfunction.hh:38
typename Basis::LocalView::Tree Tree
Definition discreteglobalbasisfunction.hh:47
V Vector
Definition discreteglobalbasisfunction.hh:39
typename EntitySet::Element Element
Definition discreteglobalbasisfunction.hh:53
typename EntitySet::LocalCoordinate LocalDomain
Definition discreteglobalbasisfunction.hh:52
const NodeToRangeEntry & nodeToRangeEntry() const
Return the stored node-to-range map.
Definition discreteglobalbasisfunction.hh:213
NTRE NodeToRangeEntry
Definition discreteglobalbasisfunction.hh:48
DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data)
Definition discreteglobalbasisfunction.hh:192
typename Basis::GridView GridView
Definition discreteglobalbasisfunction.hh:45
const Basis & basis() const
Return a const reference to the stored basis.
Definition discreteglobalbasisfunction.hh:201
GridViewEntitySet< GridView, 0 > EntitySet
Definition discreteglobalbasisfunction.hh:46
const EntitySet & entitySet() const
Get associated set of entities the local-function can be bound to.
Definition discreteglobalbasisfunction.hh:219
typename EntitySet::GlobalCoordinate Domain
Definition discreteglobalbasisfunction.hh:50
Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename Basis::MultiIndex >()])> Coefficient
Definition discreteglobalbasisfunction.hh:43
Definition discreteglobalbasisfunction.hh:61
EntitySet entitySet
Definition discreteglobalbasisfunction.hh:62
std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry
Definition discreteglobalbasisfunction.hh:65
std::shared_ptr< const Basis > basis
Definition discreteglobalbasisfunction.hh:63
std::shared_ptr< const Vector > coefficients
Definition discreteglobalbasisfunction.hh:64
Definition discreteglobalbasisfunction.hh:70
LocalFunctionBase & operator=(const LocalFunctionBase &other)
Copy-assignment of the local-function.
Definition discreteglobalbasisfunction.hh:108
bool bound() const
Check if LocalFunction is already bound to an element.
Definition discreteglobalbasisfunction.hh:157
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition discreteglobalbasisfunction.hh:124
typename EntitySet::Element Element
Definition discreteglobalbasisfunction.hh:76
const Element & localContext() const
Return the element the local-function is bound to.
Definition discreteglobalbasisfunction.hh:163
LocalFunctionBase(const LocalFunctionBase &other)
Copy-construct the local-function.
Definition discreteglobalbasisfunction.hh:92
std::vector< Coefficient > localDoFs_
Definition discreteglobalbasisfunction.hh:188
void assignWith(To &to, const From &from) const
Definition discreteglobalbasisfunction.hh:171
std::shared_ptr< const Data > data_
Definition discreteglobalbasisfunction.hh:186
decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, Range &y) const
Definition discreteglobalbasisfunction.hh:181
LocalView localView_
Definition discreteglobalbasisfunction.hh:187
void unbind()
Unbind the local-function.
Definition discreteglobalbasisfunction.hh:151
LocalDomain Domain
Definition discreteglobalbasisfunction.hh:75
LocalFunctionBase(const std::shared_ptr< const Data > &data)
Definition discreteglobalbasisfunction.hh:79
Derivative of a DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:498
typename Base::Basis Basis
Definition discreteglobalbasisfunction.hh:505
friend Traits::DerivativeInterface derivative(const DiscreteGlobalBasisFunctionDerivative &f)
Definition discreteglobalbasisfunction.hh:667
Range operator()(const Domain &x) const
Evaluate the discrete grid-function derivative in global coordinates.
Definition discreteglobalbasisfunction.hh:657
typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits::DerivativeInterface >::Range Range
Definition discreteglobalbasisfunction.hh:509
friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative &f)
Construct local function from a DiscreteGlobalBasisFunctionDerivative.
Definition discreteglobalbasisfunction.hh:673
DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > &data)
create object from DiscreateGlobalBasisFunction data
Definition discreteglobalbasisfunction.hh:646
DGBF DiscreteGlobalBasisFunction
Definition discreteglobalbasisfunction.hh:503
typename Base::Vector Vector
Definition discreteglobalbasisfunction.hh:506
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition discreteglobalbasisfunction.hh:511
typename Base::Domain Domain
Definition discreteglobalbasisfunction.hh:508
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > derivative(const DiscreteGlobalBasisFunction &f)
Derivative of the DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:413
DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T &&nodeToRangeEntry)
Create a grid-function, by wrapping the arguments in std::shared_ptr.
Definition discreteglobalbasisfunction.hh:388
DiscreteGlobalBasisFunction(std::shared_ptr< const Basis > basis, std::shared_ptr< const V > coefficients, std::shared_ptr< const typename Base::NodeToRangeEntry > nodeToRangeEntry)
Create a grid-function, by moving the arguments in std::shared_ptr.
Definition discreteglobalbasisfunction.hh:393
friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t)
Construct local function from a DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:426
typename Base::Basis Basis
Definition discreteglobalbasisfunction.hh:288
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition discreteglobalbasisfunction.hh:294
R Range
Definition discreteglobalbasisfunction.hh:292
typename Base::Vector Vector
Definition discreteglobalbasisfunction.hh:289
typename Base::Domain Domain
Definition discreteglobalbasisfunction.hh:291
Definition discreteglobalbasisfunction.hh:307
GlobalFunction::Range Range
Definition discreteglobalbasisfunction.hh:316
typename LocalBase::Domain Domain
Definition discreteglobalbasisfunction.hh:315
LocalFunction(const DiscreteGlobalBasisFunction &globalFunction)
Create a local-function from the associated grid-function.
Definition discreteglobalbasisfunction.hh:320
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >::LocalFunction derivative(const LocalFunction &lf)
Local function of the derivative.
Definition discreteglobalbasisfunction.hh:374
DiscreteGlobalBasisFunction GlobalFunction
Definition discreteglobalbasisfunction.hh:314
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition discreteglobalbasisfunction.hh:336
typename LocalBase::Element Element
Definition discreteglobalbasisfunction.hh:317
local function evaluating the derivative in reference coordinates
Definition discreteglobalbasisfunction.hh:532
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition discreteglobalbasisfunction.hh:583
typename LocalBase::Domain Domain
Definition discreteglobalbasisfunction.hh:539
typename LocalBase::Element Element
Definition discreteglobalbasisfunction.hh:541
friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction &)
Not implemented.
Definition discreteglobalbasisfunction.hh:630
DiscreteGlobalBasisFunctionDerivative GlobalFunction
Definition discreteglobalbasisfunction.hh:538
GlobalFunction::Range Range
Definition discreteglobalbasisfunction.hh:540
void unbind()
Unbind the local-function.
Definition discreteglobalbasisfunction.hh:564
LocalFunction(const GlobalFunction &globalFunction)
Create a local function from the associated grid function.
Definition discreteglobalbasisfunction.hh:544
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition discreteglobalbasisfunction.hh:557
An entity set for all entities of given codim in a grid view.
Definition gridviewentityset.hh:27
GridView::template Codim< codim >::Entity Element
Definition gridviewentityset.hh:36
Element::Geometry::LocalCoordinate LocalCoordinate
Definition gridviewentityset.hh:39
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40