Dune-Functions 2.11
Loading...
Searching...
No Matches
coarsefunctiononfinegridview.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COARSEFUNCTIONONFINEGRIDVIEW_HH
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COARSEFUNCTIONONFINEGRIDVIEW_HH
9
10#include <optional>
11#include <type_traits>
12#include <utility>
13
14#include <dune/common/referencehelper.hh>
15
20
21namespace Dune::Functions {
22
23
24
39template<class GridFunction, class GV, template<class> class DerivativeTraits=Dune::Functions::DefaultDerivativeTraits>
41{
42 using RawGridFunction = Dune::ResolveRef_t<GridFunction>;
43
44 auto&& rawFunction() const
45 {
46 return Dune::resolveRef(function_);
47 }
48
49public:
50
51 using GridView = GV;
53 using Element = typename EntitySet::Element;
56 using Range = std::decay_t<decltype(std::declval<RawGridFunction>()(std::declval<Domain>()))>;
57
58private:
59
60 using CoarseEntitySet = std::decay_t<decltype(std::declval<RawGridFunction>().entitySet())>;
61 using GeometryInAncestor = Dune::Functions::GeometryInAncestor<Element>;
62 using Traits = Dune::Functions::Imp::GridFunctionTraits<Range(Domain), EntitySet, DerivativeTraits, 56>;
63
64 class CoarseLocalFunctionOnFineGridView
65 {
66 using Traits = typename CoarseFunctionOnFineGridView::Traits::LocalFunctionTraits;
67
68 public:
69
70 using Derivative = decltype(localFunction(derivative(std::declval<CoarseFunctionOnFineGridView>())));
71 using RawLocalFunction = std::decay_t<decltype(localFunction(std::declval<const RawGridFunction&>()))>;
72
78 CoarseLocalFunctionOnFineGridView(RawLocalFunction&& localFunction, const CoarseEntitySet& coarseEntitySet)
79 : element_()
80 , localFunction_(localFunction)
81 , coarseEntitySet_(coarseEntitySet)
82 , geometryInAncestor_()
83 {}
84
90 CoarseLocalFunctionOnFineGridView(
91 RawLocalFunction&& localFunction,
92 const CoarseEntitySet& coarseEntitySet,
93 const GeometryInAncestor& geometryInAncestor,
94 const std::optional<Element>& element
95 )
96 : element_(element)
97 , localFunction_(localFunction)
98 , coarseEntitySet_(coarseEntitySet)
99 , geometryInAncestor_(geometryInAncestor, *element_)
100 {}
101
103 void bind(const Element& element)
104 {
105 element_ = element;
106 geometryInAncestor_.bind(*element_, [&](const auto& e) { return not coarseEntitySet_.contains(e); });
107 localFunction_.bind(geometryInAncestor_.coarseElement());
108 }
109
111 void unbind()
112 {
113 element_.reset();
114 }
115
117 bool bound() const
118 {
119 return static_cast<bool>(element_);
120 }
121
123 const Element& localContext() const
124 {
125 return *element_;
126 }
127
129 friend auto derivative(const CoarseLocalFunctionOnFineGridView& f)
130 {
131 if constexpr(requires{ derivative(f.localFunction_); })
132 return Derivative(derivative(f.localFunction_), f.coarseEntitySet_, f.geometryInAncestor_, f.element_);
133 else
134 return typename Traits::DerivativeInterface{};
135 }
136
139 {
140 return localFunction_(geometryInAncestor_.global(x));
141 }
142
143 private:
144 std::optional<Element> element_;
145 RawLocalFunction localFunction_;
146 const CoarseEntitySet& coarseEntitySet_;
147 GeometryInAncestor geometryInAncestor_;
148 };
149
150public:
151
152 using LocalFunction = CoarseLocalFunctionOnFineGridView;
153
160 CoarseFunctionOnFineGridView(const GridFunction& function, const GridView& gridView)
161 : function_(function)
162 , entitySet_(gridView)
163 {}
164
172 : function_(std::move(function))
173 , entitySet_(gridView)
174 {}
175
177 Range operator()(const Domain& x) const
178 {
179 return function_(x);
180 }
181
184 {
185 if constexpr(requires{ derivative(f.rawFunction()); })
186 {
187 using RawDerivative = std::decay_t<decltype(derivative(f.rawFunction()))>;
189 }
190 else
191 return typename Traits::DerivativeInterface{};
192 }
193
196 {
197 return LocalFunction(localFunction(f.rawFunction()), f.rawFunction().entitySet());
198 }
199
201 const EntitySet& entitySet() const
202 {
203 return entitySet_;
204 }
205
206protected:
207
210};
211
212
213
214} // namespace Dune::Functions
215
216#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COARSEFUNCTIONONFINEGRIDVIEW_HH
Definition monomialset.hh:19
A geometry embedding a descendent element into an ancestor.
Definition geometryinancestor.hh:39
GlobalCoordinate global(LocalCoordinate x) const
Map local coordinate in fine element into coarse element.
Definition geometryinancestor.hh:169
const Element & bind(const Element &fineElement, F &&includeFather)
Bind this GeometryInAncestor to a fine element and search coarse element.
Definition geometryinancestor.hh:119
const Element & coarseElement() const
Return the coarse element.
Definition geometryinancestor.hh:163
friend auto derivative(const CoarseFunctionOnFineGridView &f)
Obtain global derivative of this function.
Definition coarsefunctiononfinegridview.hh:183
Dune::Functions::GridViewEntitySet< GridView, 0 > EntitySet
Definition coarsefunctiononfinegridview.hh:52
Range operator()(const Domain &x) const
Evaluate function in global coordinates.
Definition coarsefunctiononfinegridview.hh:177
typename EntitySet::GlobalCoordinate Domain
Definition coarsefunctiononfinegridview.hh:54
CoarseFunctionOnFineGridView(GridFunction &&function, const GridView &gridView)
Create CoarseFunctionOnFineGridView from GridFunction and GridView.
Definition coarsefunctiononfinegridview.hh:171
const EntitySet & entitySet() const
Return the EntitySet associated to this GridViewFunction.
Definition coarsefunctiononfinegridview.hh:201
CoarseLocalFunctionOnFineGridView LocalFunction
Definition coarsefunctiononfinegridview.hh:152
typename EntitySet::Element Element
Definition coarsefunctiononfinegridview.hh:53
GridFunction function_
Definition coarsefunctiononfinegridview.hh:208
CoarseFunctionOnFineGridView(const GridFunction &function, const GridView &gridView)
Create CoarseFunctionOnFineGridView from GridFunction and GridView.
Definition coarsefunctiononfinegridview.hh:160
EntitySet entitySet_
Definition coarsefunctiononfinegridview.hh:209
typename EntitySet::LocalCoordinate LocalDomain
Definition coarsefunctiononfinegridview.hh:55
friend LocalFunction localFunction(const CoarseFunctionOnFineGridView &f)
Create a LocalFunction for evaluation in local coordinates.
Definition coarsefunctiononfinegridview.hh:195
std::decay_t< decltype(std::declval< RawGridFunction >()(std::declval< Domain >()))> Range
Definition coarsefunctiononfinegridview.hh:56
GV GridView
Definition coarsefunctiononfinegridview.hh:51
Definition gridfunction.hh:36
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
const GridView & gridView() const
Return the associated GridView.
Definition gridviewentityset.hh:80
Element::Geometry::LocalCoordinate LocalCoordinate
Definition gridviewentityset.hh:39
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40