Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
pullbackfunction.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_FUFEM_FUNCTIONS_PULLBACKFUNCTION_HH
8#define DUNE_FUFEM_FUNCTIONS_PULLBACKFUNCTION_HH
9
10#include <optional>
11#include <type_traits>
12#include <utility>
13
16
20
22
23
24
25// Forward definition
26template<class GeometryGrid>
27class GeometryGridForwardMorphism;
28
29
30
31// Forward definition
32template<class GeometryGrid>
33class GeometryGridReverseMorphism;
34
35
36
44template<class GeometryGrid>
46{
47 using HostGrid = typename GeometryGrid::HostGrid;
48
49 template<class HostGridView>
50 static auto gridViewImpl(const GeometryGrid& geoGrid, const HostGridView& hostGridView)
51 {
53 return geoGrid.leafGridView();
55 return geoGrid.levelGridView(hostGridView.template begin<0>().level());
56 }
57
58 template<int codim>
59 using Entity = typename GeometryGrid::template Codim<codim>::Entity;
60
61public:
62
65
68
70 template<class HostGridView>
72
75 : geoGridPtr_(&grid)
76 {}
77
79 template<class HostEntity>
80 Entity<HostEntity::codimension> entity(const HostEntity& hostEntity) const
81 {
82 using EntityImplementation = typename Entity<HostEntity::codimension>::Implementation;
83 return Entity<HostEntity::codimension>(EntityImplementation(*geoGridPtr_, hostEntity));
84 }
85
87 template<class HostGridView>
88 auto gridView(const HostGridView& hostGridView) const
89 {
90 return gridViewImpl(*geoGridPtr_, hostGridView);
91 }
92
94 auto inverse() const
95 {
96 return GeometryGridReverseMorphism(*geoGridPtr_);
97 }
98
99private:
100 const GeometryGrid* geoGridPtr_;
101};
102
103
104
112template<class GeometryGrid>
114{
115 using HostGrid = typename GeometryGrid::HostGrid;
116
117 template<int codim>
118 using Entity = typename HostGrid::template Codim<codim>::Entity;
119
120public:
121
124
126 using Grid = HostGrid;
127
129 template<class GeometryGridView>
130 using GridView = typename GeometryGridView::Implementation::HostGridView;
131
134 : geoGridPtr_(&grid)
135 {}
136
138 template<class GeoEntity>
139 const Entity<GeoEntity::codimension>& entity(const GeoEntity& geoEntity) const
140 {
141 return geoEntity.impl().hostEntity();
142 }
143
145 template<class GeoGridView>
146 auto gridView(const GeoGridView& geoGridView) const
147 {
148 return geoGridView.impl().hostGridView();
149 }
150
152 auto inverse() const
153 {
154 return GeometryGridForwardMorphism(*geoGridPtr_);
155 }
156
157private:
158 const GeometryGrid* geoGridPtr_;
159};
160
161
162
205template<class GridFunction, class GridMorphism, template<class> class DerivativeTraits=Dune::Functions::DefaultDerivativeTraits>
207{
209
210 auto&& rawFunction() const
211 {
212 return Dune::resolveRef(function_);
213 }
214
216 using RawDomain = typename RawEntitySet::GlobalCoordinate;
217 using RawGridView = typename RawEntitySet::GridView;
218 using RawElement = typename RawEntitySet::Element;
219
220public:
221
222 using GridView = typename GridMorphism::Inverse::GridView<RawGridView>;
224 using Element = typename EntitySet::Element;
228
229private:
230
231 using Traits = Dune::Functions::Imp::GridFunctionTraits<Range(Domain), EntitySet, DerivativeTraits, 56>;
232
233 class PullBackLocalFunction
234 {
235 using Traits = typename PullBackFunction::Traits::LocalFunctionTraits;
236
237 public:
238
239 using Derivative = decltype(localFunction(derivative(std::declval<PullBackFunction>())));
241
242 PullBackLocalFunction(RawLocalFunction&& localFunction, const GridMorphism& morphism)
243 : localFunction_(localFunction)
244 , morphismPtr_(&morphism)
245 , element_()
246 {}
247
248 PullBackLocalFunction(RawLocalFunction&& localFunction, const GridMorphism& morphism, const std::optional<Element>& element)
249 : localFunction_(localFunction)
250 , morphismPtr_(&morphism)
251 , element_(element)
252 {}
253
254 void bind(const Element& element)
255 {
256 element_ = element;
257 localFunction_.bind(morphismPtr_->entity(element));
258 }
259
260 void unbind()
261 {
262 localFunction_.unbind();
263 element_.reset();
264 }
265
266 bool bound() const
267 {
268 return static_cast<bool>(element_);
269 }
270
271 const Element& localContext() const
272 {
273 return *element_;
274 }
275
276 friend auto derivative(const PullBackLocalFunction& f)
277 {
278 if constexpr(requires{ derivative(f.localFunction_); })
279 return Derivative(derivative(f.localFunction_), *f.morphismPtr_, f.element_);
280 else
281 return typename Traits::DerivativeInterface{};
282 }
283
285 {
286 return localFunction_(x);
287 }
288
289 private:
290 RawLocalFunction localFunction_;
291 const GridMorphism* morphismPtr_;
292 std::optional<Element> element_;
293 };
294
295public:
296
297 using LocalFunction = PullBackLocalFunction;
298
307 PullBackFunction(GridFunction function, GridMorphism morphism)
308 : function_(std::move(function))
309 , morphism_(std::move(morphism))
310 , entitySet_(morphism_.inverse().gridView(rawFunction().entitySet().gridView()))
311 {}
312
317 Range operator()(const Domain& x) const
318 {
319 DUNE_THROW(Dune::NotImplemented, "Evaluation of PullBackFunction in global coordinates is not implemented");
320 }
321
323 friend auto derivative(const PullBackFunction& f)
324 {
325 if constexpr(requires{ derivative(f.rawFunction()); })
326 {
327 using RawDerivative = std::decay_t<decltype(derivative(f.rawFunction()))>;
329 }
330 else
331 return typename Traits::DerivativeInterface{};
332 }
333
336 {
337 return LocalFunction(localFunction(f.rawFunction()), f.morphism_);
338 }
339
341 const EntitySet& entitySet() const
342 {
343 return entitySet_;
344 }
345
346private:
347
348 GridFunction function_;
349 GridMorphism morphism_;
350 EntitySet entitySet_;
351};
352
353
354
359template<class GeometryGridFunction>
360auto pullBackToHostGrid(GeometryGridFunction gridFunction)
361{
362 const auto& grid = gridFunction.entitySet().gridView().grid();
364}
365
366
367
372template<class HostGridFunction, class GeometryGrid>
373auto pullBackToGeometryGrid(HostGridFunction gridFunction, const GeometryGrid& geometryGrid)
374{
376}
377
378
379
380} // namespace Dune::Fufem::Experimental
381
382#endif // DUNE_FUFEM_FUNCTIONS_PULLBACKFUNCTION_HH
constexpr T & resolveRef(T &gf) noexcept
virtual void operator()()=0
#define DUNE_THROW(E,...)
auto pullBackToGeometryGrid(HostGridFunction gridFunction, const GeometryGrid &geometryGrid)
Obtain pullback of GridFunction from HostGrid to GeometryGrid.
Definition pullbackfunction.hh:373
auto pullBackToHostGrid(GeometryGridFunction gridFunction)
Obtain pullback of GridFunction from GeometryGrid to HostGrid.
Definition pullbackfunction.hh:360
STL namespace.
Definition deformationfunction.hh:33
LeafGridView leafGridView() const
LevelGridView levelGridView(int level) const
HostGrid::template Codim< codim >::Entity HostEntity
GridView::template Codim< codim >::Entity Element
Element::Geometry::LocalCoordinate LocalCoordinate
Element::Geometry::GlobalCoordinate GlobalCoordinate
Morphism transforming a HostGrid to a GeometryGrid<HostGrid, ...>
Definition pullbackfunction.hh:46
decltype(gridViewImpl(std::declval< GeometryGrid >(), std::declval< HostGridView >())) GridView
Type of GeometryGrid GridView for given HostGrid GridView.
Definition pullbackfunction.hh:71
auto gridView(const HostGridView &hostGridView) const
Obtain GeometryGrid GridView corresponding to given HostGrid GridView.
Definition pullbackfunction.hh:88
GeometryGridForwardMorphism(const GeometryGrid &grid)
Construct GeometryGridForwardMorphism for given GeometryGrid.
Definition pullbackfunction.hh:74
Entity< HostEntity::codimension > entity(const HostEntity &hostEntity) const
Obtain GeometryGrid Entity corresponding to given HostGrid Entity.
Definition pullbackfunction.hh:80
auto inverse() const
Obtain GeometryGridReverseMorphism for underlying GeometryGrid.
Definition pullbackfunction.hh:94
Morphism transforming a GeometryGrid<HostGrid, ...> to the HostGrid.
Definition pullbackfunction.hh:114
auto inverse() const
Obtain GeometryGridForwardMorphism for underlying GeometryGrid.
Definition pullbackfunction.hh:152
GeometryGridReverseMorphism(const GeometryGrid &grid)
Construct GeometryGridReverseMorphism for given GeometryGrid.
Definition pullbackfunction.hh:133
auto gridView(const GeoGridView &geoGridView) const
Obtain HostGrid GridView corresponding to given GeometryGrid GridView.
Definition pullbackfunction.hh:146
const Entity< GeoEntity::codimension > & entity(const GeoEntity &geoEntity) const
Obtain HostGrid Entity corresponding to given GeometryGrid Entity.
Definition pullbackfunction.hh:139
HostGrid Grid
Type of HostGrid.
Definition pullbackfunction.hh:126
typename GeometryGridView::Implementation::HostGridView GridView
Type of HostGrid GridView for given GeometryGrid GridView.
Definition pullbackfunction.hh:130
A wrapper representing the pullback of a grid function wrt a grid morphism.
Definition pullbackfunction.hh:207
std::decay_t< decltype(std::declval< RawGridFunction >()(std::declval< RawDomain >()))> Range
Definition pullbackfunction.hh:227
typename EntitySet::LocalCoordinate LocalDomain
Definition pullbackfunction.hh:226
const EntitySet & entitySet() const
Return the EntitySet associated to this GridViewFunction.
Definition pullbackfunction.hh:341
typename EntitySet::Element Element
Definition pullbackfunction.hh:224
friend auto derivative(const PullBackFunction &f)
Obtain global derivative of this function.
Definition pullbackfunction.hh:323
PullBackFunction(GridFunction function, GridMorphism morphism)
Create PullBackFunction from GridFunction and GridMorphism.
Definition pullbackfunction.hh:307
typename EntitySet::GlobalCoordinate Domain
Definition pullbackfunction.hh:225
Dune::Functions::GridViewEntitySet< GridView, 0 > EntitySet
Definition pullbackfunction.hh:223
Range operator()(const Domain &x) const
Evaluate function in global coordinates.
Definition pullbackfunction.hh:317
PullBackLocalFunction LocalFunction
Definition pullbackfunction.hh:297
friend LocalFunction localFunction(const PullBackFunction &f)
Create a LocalFunction for evaluation in local coordinates.
Definition pullbackfunction.hh:335
typename GridMorphism::Inverse::GridView< RawGridView > GridView
Definition pullbackfunction.hh:222
T forward(T... args)