7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FINEFUNCTIONONCOARSEGRIDVIEW_HH
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FINEFUNCTIONONCOARSEGRIDVIEW_HH
17#include <dune/common/referencehelper.hh>
19#include <dune/geometry/type.hh>
21#include <dune/functions/common/defaultderivativetraits.hh>
22#include <dune/functions/gridfunctions/gridfunction.hh>
23#include <dune/functions/gridfunctions/gridviewentityset.hh>
25namespace Dune::Functions {
29namespace ReferenceElementUtilities {
33template<class X, class FT = std::decay_t<decltype(std::declval<X>()[0])> >
34FT distance(
unsigned int topologyId,
int dim, X x, FT scaleFactor = FT(1))
39 auto dist_x_last = max(max(x[dim-1]-scaleFactor, -x[dim-1]), FT(0));
42 if (Dune::Impl::isPyramid(topologyId, dim))
43 scaleFactor -= max(min(x[dim-1], scaleFactor), FT(0));
44 return distance(Dune::Impl::baseTopologyId(topologyId, dim), dim-1, x, scaleFactor) + dist_x_last;
57template<class X, class FT = std::decay_t<decltype(std::declval<X>()[0])> >
58bool checkInside(
unsigned int topologyId,
int dim, X x, FT tolerance, FT scaleFactor = FT(1))
65 auto dist_x_last = max(x[dim-1]-scaleFactor, -x[dim-1]);
66 if (dist_x_last <= tolerance)
68 if (Dune::Impl::isPyramid(topologyId, dim))
69 scaleFactor -= max(min(x[dim-1], scaleFactor), FT(0));
70 return checkInside(Dune::Impl::baseTopologyId(topologyId, dim), dim-1, x, tolerance - max(dist_x_last, FT(0)), scaleFactor);
104 using RawGridFunction = Dune::ResolveRef_t<GridFunction>;
106 auto&& rawFunction()
const
108 return Dune::resolveRef(function_);
111 static constexpr auto dim = GV::Grid::dimension;
118 using Domain =
typename EntitySet::GlobalCoordinate;
120 using Range = std::decay_t<decltype(std::declval<RawGridFunction>()(std::declval<Domain>()))>;
124 using FineEntitySet = std::decay_t<decltype(std::declval<RawGridFunction>().entitySet())>;
125 using Traits = Dune::Functions::Imp::GridFunctionTraits<Range(Domain),
EntitySet, DerivativeTraits, 56>;
127 class FineLocalFunctionOnCoarseGridView
129 using Traits =
typename FineFunctionOnCoarseGridView::Traits::LocalFunctionTraits;
134 using RawLocalFunction = std::decay_t<decltype(localFunction(std::declval<const RawGridFunction&>()))>;
141 FineLocalFunctionOnCoarseGridView(RawLocalFunction&&
localFunction,
const FineEntitySet& fineEntitySet)
144 , fineEntitySet_(fineEntitySet)
145 , forwardToFineFunction_(
false)
153 FineLocalFunctionOnCoarseGridView(
155 const FineEntitySet& fineEntitySet,
156 bool forwardToFineFunction,
157 const std::optional<Element>& element
161 , fineEntitySet_(fineEntitySet)
162 , forwardToFineFunction_(forwardToFineFunction)
166 void bind(
const Element& element)
169 forwardToFineFunction_ = fineEntitySet_.contains(*element_);
170 if (forwardToFineFunction_)
171 localFunction_.bind(element);
183 return static_cast<bool>(element_);
187 const Element& localContext()
const
193 friend auto derivative(
const FineLocalFunctionOnCoarseGridView& f)
195 if constexpr(
requires{
derivative(f.localFunction_); })
196 return Derivative(
derivative(f.localFunction_), f.fineEntitySet_, f.forwardToFineFunction_, f.element_);
198 return typename Traits::DerivativeInterface{};
204 if (forwardToFineFunction_)
205 return localFunction_(x);
206 return evaluateInDescendent(*element_, x);
212 Range evaluateInDescendent(
const Element& element, LocalDomain x)
const
214 Element closestChild;
215 LocalDomain xInClosestChild;
216 double distanceToClosestChild = std::numeric_limits<double>::max();
217 for(
const auto& child : descendantElements(element, element.level()+1))
219 auto&& geometry = child.geometryInFather();
220 auto xInChild = geometry.local(x);
221 auto dist = Impl::ReferenceElementUtilities::distance(child.type().id(), dim, xInChild);
222 if (dist < distanceToClosestChild)
224 closestChild = child;
225 distanceToClosestChild = dist;
226 xInClosestChild = xInChild;
227 if (distanceToClosestChild==0)
231 if (fineEntitySet_.contains(closestChild))
233 localFunction_.bind(closestChild);
234 return localFunction_(xInClosestChild);
237 return evaluateInDescendent(closestChild, xInClosestChild);
240 std::optional<Element> element_;
241 mutable RawLocalFunction localFunction_;
242 const FineEntitySet& fineEntitySet_;
243 bool forwardToFineFunction_ =
false;
248 using LocalFunction = FineLocalFunctionOnCoarseGridView;
257 : function_(function)
258 , entitySet_(gridView)
268 : function_(std::move(function))
269 , entitySet_(gridView)
281 if constexpr(
requires{
derivative(f.rawFunction()); })
283 using RawDerivative = std::decay_t<
decltype(
derivative(f.rawFunction()))>;
287 return typename Traits::DerivativeInterface{};
293 return LocalFunction(
localFunction(f.rawFunction()), f.rawFunction().entitySet());
304 GridFunction function_;
305 EntitySet entitySet_;
A wrapper representing a fine grid function on a gridview.
Definition: finefunctiononcoarsegridview.hh:103
Range operator()(const Domain &x) const
Evaluate function in global coordinates.
Definition: finefunctiononcoarsegridview.hh:273
FineFunctionOnCoarseGridView(const GridFunction &function, const GridView &gridView)
Create FineFunctionOnCoarseGridView from GridFunction and GridView.
Definition: finefunctiononcoarsegridview.hh:256
friend auto derivative(const FineFunctionOnCoarseGridView &f)
Obtain global derivative of this function.
Definition: finefunctiononcoarsegridview.hh:279
FineFunctionOnCoarseGridView(GridFunction &&function, const GridView &gridView)
Create FineFunctionOnCoarseGridView from GridFunction and GridView.
Definition: finefunctiononcoarsegridview.hh:267
friend LocalFunction localFunction(const FineFunctionOnCoarseGridView &f)
Create a LocalFunction for evaluation in local coordinates.
Definition: finefunctiononcoarsegridview.hh:291
const EntitySet & entitySet() const
Return the EntitySet associated to this GridViewFunction.
Definition: finefunctiononcoarsegridview.hh:297
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:36
const GridView & gridView() const
Return the associated GridView.
Definition: gridviewentityset.hh:80
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:39
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:41