version 3.11-dev
Loading...
Searching...
No Matches
fem/elementvariables.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
14
15#include <array>
16#include <ranges>
17#include <type_traits>
18#include <utility>
19#include <vector>
20
21#include <dumux/common/concepts/ipdata_.hh>
22#include <dumux/common/concepts/localdofs_.hh>
25
29
30namespace Dumux::Experimental {
31
39template<class GVC, bool cachingEnabled>
41
47template<class GVC>
48class FEElementVariables<GVC, /*cachingEnabled*/true>
49{
50 class MutableVariablesView
51 {
52 public:
53 MutableVariablesView(GVC& gridCache)
54 : gridCache_(gridCache) {}
55
56 using Variables = typename GVC::Variables;
57
58 template<Dumux::Concept::LocalDof LocalDof>
59 Variables& operator [](const LocalDof& localDof) const
60 { return gridCache_.variables(localDof); }
61 private:
62 GVC& gridCache_;
63 };
64
65 class MutableVariablesViewWithIpCacheAccess
66 {
67 public:
68 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
69 : gridCache_(gridCache)
70 {}
71
72 using Variables = typename GVC::Variables;
73
74 template<Dumux::Concept::LocalDof LocalDof>
75 Variables& operator [](const LocalDof& localDof) const
76 { return gridCache_.variables(localDof); }
77
78 auto& cache(std::size_t eIdx) const
79 { return gridCache_.cache(eIdx); }
80
81 private:
82 GVC& gridCache_;
83 };
84
85public:
87 using GridVariablesCache = GVC;
88
90 using MutableView = std::conditional_t<
91 GridVariablesCache::InterpolationPointData::isSolDependent,
92 MutableVariablesViewWithIpCacheAccess,
93 MutableVariablesView
94 >;
95
97 using Variables = typename GridVariablesCache::Variables;
98
100 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
101
103 template<class ElementDiscretization>
104 using DeflectionPolicy = std::conditional_t<
105 InterpolationPointData::isSolDependent,
108 >;
109
113
114 const Variables& operator [](std::size_t localDofIdx) const
115 { return gridVariablesCache().variables(eIdx_, localDofIdx); }
116
117 template<Dumux::Concept::LocalDof LocalDof>
118 const Variables& operator [](const LocalDof& localDof) const
119 { return gridVariablesCache().variables(localDof); }
120
121 template<class IpData>
122 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
123 const Variables& operator [](const IpData& ipData) const
124 { return gridVariablesCache().variables(eIdx_, ipData.localDofIndex()); }
125
126 template<Concept::BoundaryFaceQpIpData IpData>
127 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
128 const IpData& ipData)
129 { return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
130
131 template<Concept::QIpData IpData>
132 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
133 const IpData& ipData)
134 { return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
135
141 template<class ElementDiscretization, class SolutionVector>
142 FEElementVariables bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
143 const ElementDiscretization& elemDisc,
144 const SolutionVector& sol) &&
145 {
146 this->bindElement(element, elemDisc, sol);
147 return std::move(*this);
148 }
149
150 // For compatibility reasons with the case of not storing the variables.
151 // function to be called before assembling an element, preparing the variables within the stencil
152 template<class ElementDiscretization, class SolutionVector>
153 void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
154 const ElementDiscretization& elemDisc,
155 const SolutionVector& sol) &
156 {
157 bindElement(element, elemDisc, sol);
158 }
159
165 template<class ElementDiscretization, class SolutionVector>
166 FEElementVariables bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
167 const ElementDiscretization& elemDisc,
168 const SolutionVector& sol) &&
169 {
170 this->bindElement(element, elemDisc, sol);
171 return std::move(*this);
172 }
173
174 // function to prepare the variables within the element
175 template<class ElementDiscretization, class SolutionVector>
176 void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
177 const ElementDiscretization& elemDisc,
178 const SolutionVector& sol) &
179 {
180 const auto& gridDiscretization = elemDisc.gridDiscretization();
181 eIdx_ = gridDiscretization.elementMapper().index(element);
182 if constexpr (!GridVariablesCache::interpolationPointDataCachingEnabled)
183 ipDataCache_.bind(elemDisc);
184 }
185
188 { return *gridVariablesCachePtr_; }
189
195 { return { gridVars }; }
196
197private:
199
200 const ElementInterpolationPointDataCache& ipDataCache() const
201 {
202 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
203 return gridVariablesCache().cache(eIdx_);
204 else
205 return ipDataCache_.get(gridVariablesCache().problem(), gridVariablesCache().localDofVariables(eIdx_));
206 }
207
208 const GridVariablesCache* gridVariablesCachePtr_;
209 std::size_t eIdx_;
211};
212
217template<class GVC>
218class FEElementVariables<GVC, /*cachingEnabled*/false>
219{
220 using ThisType = FEElementVariables<GVC, /*cachingEnabled*/false>;
221 class MutableVariablesView
222 {
223 public:
224 MutableVariablesView(ThisType& view)
225 : view_(view) {}
226
227 using Variables = typename GVC::Variables;
228
229 template<Dumux::Concept::LocalDof LocalDof>
230 Variables& operator [](const LocalDof& localDof) const
231 { return view_[localDof]; }
232 private:
233 ThisType& view_;
234 };
235
236 class MutableVariablesViewWithIpCacheAccess
237 {
238 public:
239 MutableVariablesViewWithIpCacheAccess(ThisType& view)
240 : view_(view)
241 {}
242
243 using Variables = typename GVC::Variables;
244
245 template<Dumux::Concept::LocalDof LocalDof>
246 Variables& operator [](const LocalDof& localDof) const
247 { return view_[localDof]; }
248
249 auto& cache(std::size_t) const
250 { return view_.ipDataCache_.get(view_.gridVariablesCache().problem(), view_.variables_); }
251
252 private:
253 ThisType& view_;
254 };
255
256public:
259
261 using MutableView = std::conditional_t<
262 GridVariablesCache::InterpolationPointData::isSolDependent,
263 MutableVariablesViewWithIpCacheAccess,
264 MutableVariablesView
265 >;
266
268 using Variables = typename GridVariablesCache::Variables;
269
271 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
272
274 template<class ElementDiscretization>
275 using DeflectionPolicy = std::conditional_t<
276 InterpolationPointData::isSolDependent,
279 >;
280
283 : gridVariablesCachePtr_(&gridVarsCache)
284 {}
285
291 template<class ElementDiscretization, class SolutionVector>
292 FEElementVariables bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
293 const ElementDiscretization& elemDisc,
294 const SolutionVector& sol) &&
295 {
296 this->bindElement(element, elemDisc, sol);
297 return std::move(*this);
298 }
299
300 // specialization for finite element schemes, simply forwards to the bindElement method
301 template<class ElementDiscretization, class SolutionVector>
302 void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
303 const ElementDiscretization& elemDisc,
304 const SolutionVector& sol) &
305 {
306 bindElement(element, elemDisc, sol);
307 }
308
314 template<class ElementDiscretization, class SolutionVector>
315 FEElementVariables bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
316 const ElementDiscretization& elemDisc,
317 const SolutionVector& sol) &&
318 {
319 this->bindElement(element, elemDisc, sol);
320 return std::move(*this);
321 }
322
323 // specialization for finite element schemes
324 template<class ElementDiscretization, class SolutionVector>
325 void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
326 const ElementDiscretization& elemDisc,
327 const SolutionVector& sol) &
328 {
329 // get the solution at the dofs of the element
330 const auto& gridDiscretization = elemDisc.gridDiscretization();
331 auto elemSol = elementSolution(element, sol, gridDiscretization);
332
333 // resize variables to the required size
334 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
335
336 // update variables related to localDofs
337 for (const auto& localDof : localDofs(elemDisc))
338 variables_[localDof.index()].update(elemSol, gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
339
340 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
341 eIdx_ = gridDiscretization.elementMapper().index(element);
342 else
343 {
344 ipDataCache_.bind(elemDisc);
345 if constexpr (InterpolationPointData::isSolDependent)
346 ipDataCache_.get(gridVariablesCache().problem(), variables_);
347 }
348 }
349 const Variables& operator [](std::size_t localIdx) const
350 { return variables_[localIdx]; }
351
352 Variables& operator [](std::size_t localIdx)
353 { return variables_[localIdx]; }
354
355 template<Dumux::Concept::LocalDof LocalDof>
356 const Variables& operator [](const LocalDof& localDof) const
357 { return variables_[localDof.index()]; }
358
359 template<Dumux::Concept::LocalDof LocalDof>
360 Variables& operator [](const LocalDof& localDof)
361 { return variables_[localDof.index()]; }
362
363 template<class IpData>
364 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
365 const Variables& operator [](const IpData& ipData) const
366 { return variables_[ipData.localDofIndex()]; }
367
368 template<class IpData>
369 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
370 Variables& operator [](const IpData& ipData)
371 { return variables_[ipData.localDofIndex()]; }
372
373 template<Concept::BoundaryFaceQpIpData IpData>
374 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
375 const IpData& ipData)
376 { return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
377
378 template<Concept::QIpData IpData>
379 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
380 const IpData& ipData)
381 { return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
382
385 { return *gridVariablesCachePtr_; }
386
392 { return { *this }; }
393
394private:
396
397 const ElementInterpolationPointDataCache& ipDataCache() const
398 {
399 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
400 return gridVariablesCache().cache(eIdx_);
401 else
402 return ipDataCache_.get(gridVariablesCache().problem(), variables_);
403 }
404
405 const GridVariablesCache* gridVariablesCachePtr_;
406 std::vector<Variables> variables_;
407 std::size_t eIdx_ = 0;
409};
410
411} // end namespace Dumux::Experimental
412
413#endif
Interpolation point data at the quadrature points of an element and of its boundary faces.
Definition elementinterpolationpointdatacache.hh:80
An element cache that is updated on its first access after binding.
Definition lazyelementcache.hh:29
Definition variablesdeflectionpolicy.hh:29
Definition variablesdeflectionpolicy.hh:95
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition fem/elementvariables.hh:271
FEElementVariables(const GridVariablesCache &gridVarsCache)
Constructor.
Definition fem/elementvariables.hh:282
void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:302
FEElementVariables bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition fem/elementvariables.hh:292
std::conditional_t< GridVariablesCache::InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition fem/elementvariables.hh:261
typename GridVariablesCache::Variables Variables
export type of the variables
Definition fem/elementvariables.hh:268
std::conditional_t< InterpolationPointData::isSolDependent, Dumux::Detail::CVFE::VariablesDeflectionPolicyWithIpCacheUpdate< MutableView, ElementDiscretization >, Dumux::Detail::CVFE::VariablesDeflectionPolicy< MutableView, ElementDiscretization > > DeflectionPolicy
export type of deflection policy
Definition fem/elementvariables.hh:275
void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:325
friend const InterpolationPointData & cache(const FEElementVariables &elemVars, const IpData &ipData)
Definition fem/elementvariables.hh:374
FEElementVariables bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition fem/elementvariables.hh:315
GVC GridVariablesCache
export type of the grid variables
Definition fem/elementvariables.hh:258
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:384
MutableView asMutableView(GridVariablesCache &)
return a local view on variables that is always mutable, regardless of the caching policy
Definition fem/elementvariables.hh:391
void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:176
FEElementVariables bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition fem/elementvariables.hh:142
MutableView asMutableView(GridVariablesCache &gridVars)
return a local view on variables that is always mutable, regardless of the caching policy
Definition fem/elementvariables.hh:194
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:187
FEElementVariables(const GridVariablesCache &gridVariablesCache)
Constructor.
Definition fem/elementvariables.hh:111
typename GridVariablesCache::Variables Variables
export type of the variables
Definition fem/elementvariables.hh:97
FEElementVariables bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition fem/elementvariables.hh:166
std::conditional_t< GridVariablesCache::InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition fem/elementvariables.hh:90
std::conditional_t< InterpolationPointData::isSolDependent, Dumux::Detail::CVFE::VariablesDeflectionPolicyWithIpCacheUpdate< MutableView, ElementDiscretization >, Dumux::Detail::CVFE::VariablesDeflectionPolicy< MutableView, ElementDiscretization > > DeflectionPolicy
export type of deflection policy
Definition fem/elementvariables.hh:104
friend const InterpolationPointData & cache(const FEElementVariables &elemVars, const IpData &ipData)
Definition fem/elementvariables.hh:127
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition fem/elementvariables.hh:100
void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:153
GVC GridVariablesCache
export type of the grid variables
Definition fem/elementvariables.hh:87
The (stencil) element variables class for finite element schemes.
Definition fem/elementvariables.hh:40
Interpolation point data at the quadrature points of an element.
Element solution classes and factory functions.
auto elementSolution(const Element &element, const SolutionVector &sol, const GridGeometry &gg) -> std::enable_if_t< GridGeometry::discMethod==DiscretizationMethods::cctpfa||GridGeometry::discMethod==DiscretizationMethods::ccmpfa, CCElementSolution< typename GridGeometry::LocalView, std::decay_t< decltype(std::declval< SolutionVector >()[0])> > >
Make an element solution for cell-centered schemes.
Definition cellcentered/elementsolution.hh:101
decltype(auto) gridDiscretization(const T &t, Args &&... args)
The grid discretization.
Definition griddiscretization.hh:65
An element cache that is updated on its first access after binding.
Definition assembly/assembler.hh:46
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition localdof.hh:50
Quadrature rules over sub-control volumes and sub-control volume faces.
Variables deflection policy.