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#include <memory>
21
22#include <dumux/common/concepts/ipdata_.hh>
23#include <dumux/common/concepts/localdofs_.hh>
26
28
29namespace Dumux::Experimental {
30
38template<class GVC, bool cachingEnabled>
40
46template<class GVC>
47class FEElementVariables<GVC, /*cachingEnabled*/true>
48{
49 class MutableVariablesView
50 {
51 public:
52 MutableVariablesView(GVC& gridCache)
53 : gridCache_(gridCache) {}
54
55 using Variables = typename GVC::Variables;
56
57 template<Dumux::Concept::LocalDof LocalDof>
58 Variables& operator [](const LocalDof& localDof) const
59 { return gridCache_.variables(localDof); }
60 private:
61 GVC& gridCache_;
62 };
63
64 class MutableVariablesViewWithIpCacheAccess
65 {
66 public:
67 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
68 : gridCache_(gridCache)
69 {}
70
71 using Variables = typename GVC::Variables;
72
73 template<Dumux::Concept::LocalDof LocalDof>
74 Variables& operator [](const LocalDof& localDof) const
75 { return gridCache_.variables(localDof); }
76
77 auto& cache(std::size_t eIdx) const
78 { return gridCache_.cache(eIdx); }
79
80 private:
81 GVC& gridCache_;
82 };
83
84public:
86 using GridVariablesCache = GVC;
87
89 using MutableView = std::conditional_t<
90 GridVariablesCache::InterpolationPointData::isSolDependent,
91 MutableVariablesViewWithIpCacheAccess,
92 MutableVariablesView
93 >;
94
96 using Variables = typename GridVariablesCache::Variables;
97
99 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
100
102 template<class ElementDiscretization>
103 using DeflectionPolicy = std::conditional_t<
104 InterpolationPointData::isSolDependent,
107 >;
108
112
113 const Variables& operator [](std::size_t localDofIdx) const
114 { return gridVariablesCache().variables(eIdx_, localDofIdx); }
115
116 template<Dumux::Concept::LocalDof LocalDof>
117 const Variables& operator [](const LocalDof& localDof) const
118 { return gridVariablesCache().variables(localDof); }
119
120 template<class IpData>
121 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
122 const Variables& operator [](const IpData& ipData) const
123 { return gridVariablesCache().variables(eIdx_, ipData.localDofIndex()); }
124
125 template<Concept::BoundaryFaceQpIpData IpData>
126 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
127 const IpData& ipData)
128 { return elemVars.gridVariablesCache().boundaryFaceCache(elemVars.eIdx_, ipData.boundaryFaceIndex(), ipData.qpIndex()); }
129
130 template<Concept::QIpData IpData>
131 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
132 const IpData& ipData)
133 { return elemVars.gridVariablesCache().elementCache(elemVars.eIdx_, ipData.qpIndex()); }
134
140 template<class ElementDiscretization, class SolutionVector>
141 FEElementVariables bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
142 const ElementDiscretization& elemDisc,
143 const SolutionVector& sol) &&
144 {
145 this->bindElement(element, elemDisc, sol);
146 return std::move(*this);
147 }
148
149 // For compatibility reasons with the case of not storing the variables.
150 // function to be called before assembling an element, preparing the variables within the stencil
151 template<class ElementDiscretization, class SolutionVector>
152 void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
153 const ElementDiscretization& elemDisc,
154 const SolutionVector& sol) &
155 {
156 bindElement(element, elemDisc, sol);
157 }
158
164 template<class ElementDiscretization, class SolutionVector>
165 FEElementVariables bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
166 const ElementDiscretization& elemDisc,
167 const SolutionVector& sol) &&
168 {
169 this->bindElement(element, elemDisc, sol);
170 return std::move(*this);
171 }
172
173 // function to prepare the variables within the element
174 template<class ElementDiscretization, class SolutionVector>
175 void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
176 const ElementDiscretization& elemDisc,
177 const SolutionVector& sol) &
178 {
179 const auto& gridDiscretization = elemDisc.gridDiscretization();
180 eIdx_ = gridDiscretization.elementMapper().index(element);
181 }
182
185 { return *gridVariablesCachePtr_; }
186
192 { return { gridVars }; }
193
194private:
195 const GridVariablesCache* gridVariablesCachePtr_;
196 std::size_t eIdx_;
197};
198
203template<class GVC>
204class FEElementVariables<GVC, /*cachingEnabled*/false>
205{
206 using ThisType = FEElementVariables<GVC, /*cachingEnabled*/false>;
207 class MutableVariablesView
208 {
209 public:
210 MutableVariablesView(ThisType& view)
211 : view_(view) {}
212
213 using Variables = typename GVC::Variables;
214
215 template<Dumux::Concept::LocalDof LocalDof>
216 Variables& operator [](const LocalDof& localDof) const
217 { return view_[localDof]; }
218 private:
219 ThisType& view_;
220 };
221
222 class MutableVariablesViewWithIpCacheAccess
223 {
224 public:
225 MutableVariablesViewWithIpCacheAccess(ThisType& view)
226 : view_(view)
227 {}
228
229 using Variables = typename GVC::Variables;
230
231 template<Dumux::Concept::LocalDof LocalDof>
232 Variables& operator [](const LocalDof& localDof) const
233 { return view_[localDof]; }
234
235 auto& cache(std::size_t) const
236 { return *view_.ipDataCache_; }
237
238 private:
239 ThisType& view_;
240 };
241
242public:
245
247 using MutableView = std::conditional_t<
248 GridVariablesCache::InterpolationPointData::isSolDependent,
249 MutableVariablesViewWithIpCacheAccess,
250 MutableVariablesView
251 >;
252
254 using Variables = typename GridVariablesCache::Variables;
255
257 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
258
260 template<class ElementDiscretization>
261 using DeflectionPolicy = std::conditional_t<
262 InterpolationPointData::isSolDependent,
265 >;
266
269 : gridVariablesCachePtr_(&gridVarsCache)
270 , ipDataCache_(std::make_shared<InterpolationPointDataCache>())
271 {}
272
278 template<class ElementDiscretization, class SolutionVector>
279 FEElementVariables bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
280 const ElementDiscretization& elemDisc,
281 const SolutionVector& sol) &&
282 {
283 this->bindElement(element, elemDisc, sol);
284 return std::move(*this);
285 }
286
287 // specialization for finite element schemes, simply forwards to the bindElement method
288 template<class ElementDiscretization, class SolutionVector>
289 void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
290 const ElementDiscretization& elemDisc,
291 const SolutionVector& sol) &
292 {
293 bindElement(element, elemDisc, sol);
294 }
295
301 template<class ElementDiscretization, class SolutionVector>
302 FEElementVariables bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
303 const ElementDiscretization& elemDisc,
304 const SolutionVector& sol) &&
305 {
306 this->bindElement(element, elemDisc, sol);
307 return std::move(*this);
308 }
309
310 // specialization for finite element schemes
311 template<class ElementDiscretization, class SolutionVector>
312 void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
313 const ElementDiscretization& elemDisc,
314 const SolutionVector& sol) &
315 {
316 // get the solution at the dofs of the element
317 auto elemSol = elementSolution(element, sol, elemDisc.gridDiscretization());
318
319 // resize variables to the required size
320 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
321
322 // update variables related to localDofs
323 for (const auto& localDof : localDofs(elemDisc))
324 variables_[localDof.index()].update(elemSol, gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
325
326 if constexpr (InterpolationPointData::isSolDependent)
327 {
328 auto newIpDataCache = std::make_shared<InterpolationPointDataCache>(*ipDataCache_);
329 newIpDataCache->update(gridVariablesCache().problem(), element, elemDisc, variables_);
330 ipDataCache_ = std::move(newIpDataCache);
331 }
332 else
333 ipDataCache_->update(gridVariablesCache().problem(), element, elemDisc, variables_);
334 }
335 const Variables& operator [](std::size_t localIdx) const
336 { return variables_[localIdx]; }
337
338 Variables& operator [](std::size_t localIdx)
339 { return variables_[localIdx]; }
340
341 template<Dumux::Concept::LocalDof LocalDof>
342 const Variables& operator [](const LocalDof& localDof) const
343 { return variables_[localDof.index()]; }
344
345 template<Dumux::Concept::LocalDof LocalDof>
346 Variables& operator [](const LocalDof& localDof)
347 { return variables_[localDof.index()]; }
348
349 template<class IpData>
350 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
351 const Variables& operator [](const IpData& ipData) const
352 { return variables_[ipData.localDofIndex()]; }
353
354 template<class IpData>
355 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
356 Variables& operator [](const IpData& ipData)
357 { return variables_[ipData.localDofIndex()]; }
358
359 template<Concept::BoundaryFaceQpIpData IpData>
360 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
361 const IpData& ipData)
362 { return elemVars.ipDataCache_->boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
363
364 template<Concept::QIpData IpData>
365 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
366 const IpData& ipData)
367 { return elemVars.ipDataCache_->elementCache(ipData.qpIndex()); }
368
371 { return *gridVariablesCachePtr_; }
372
378 { return { *this }; }
379
380private:
381 class InterpolationPointDataCache
382 {
383 public:
384 InterpolationPointDataCache()
385 {}
386
387 template<class Problem, class ElementDiscretization, class ElementVariables>
388 void update(const Problem& problem,
389 const typename ElementDiscretization::Element& element,
390 const ElementDiscretization& elemDisc,
391 const ElementVariables& elemVars)
392 {
393 updateElementCache_(problem, element, elemDisc, elemVars);
394 }
395
396 // access operator
397 const InterpolationPointData& elementCache(std::size_t qpIdx) const
398 { return elementCache_[qpIdx]; }
399
400 // access operator
401 InterpolationPointData& elementCache(std::size_t qpIdx)
402 { return elementCache_[qpIdx]; }
403
404 // access operator
405 const InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx) const
406 { return boundaryFaceCache_[bfIdx][qpIdx]; }
407
408 // access operator
409 InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
410 { return boundaryFaceCache_[bfIdx][qpIdx]; }
411
412 private:
413 template<class Problem, class ElementDiscretization, class ElementVariables>
414 void updateElementCache_(const Problem& problem,
415 const typename ElementDiscretization::Element& element,
416 const ElementDiscretization& elemDisc,
417 const ElementVariables& elemVars)
418 {
419 const auto elemQuadRule = Dumux::CVFE::quadratureRule(elemDisc, element);
420 elementCache_.resize(std::ranges::size(elemQuadRule));
421 for (const auto& qpData : elemQuadRule)
422 elementCache_[qpData.ipData().qpIndex()].update(problem, element, elemDisc, elemVars, qpData.ipData());
423
424 boundaryFaceCache_.resize(std::ranges::size(boundaryFaces(elemDisc)));
425 for (const auto& boundaryFace : boundaryFaces(elemDisc))
426 {
427 auto& bfCache = boundaryFaceCache_[boundaryFace.index()];
428 const auto quadRule = Dumux::CVFE::quadratureRule(elemDisc, boundaryFace);
429 bfCache.resize(std::ranges::size(quadRule));
430 for (const auto& qpData : quadRule)
431 bfCache[qpData.ipData().qpIndex()].update(problem,
432 element,
433 elemDisc,
434 elemVars,
435 qpData.ipData());
436 }
437 }
438
439 std::vector<InterpolationPointData> elementCache_;
440 std::vector<std::vector<InterpolationPointData>> boundaryFaceCache_;
441 };
442
443 const GridVariablesCache* gridVariablesCachePtr_;
444 std::vector<Variables> variables_;
445 std::shared_ptr<InterpolationPointDataCache> ipDataCache_;
446};
447
448} // end namespace Dumux::Experimental
449
450#endif
Definition variablesdeflectionpolicy.hh:29
Definition variablesdeflectionpolicy.hh:95
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition fem/elementvariables.hh:257
FEElementVariables(const GridVariablesCache &gridVarsCache)
Constructor.
Definition fem/elementvariables.hh:268
void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:289
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:279
std::conditional_t< GridVariablesCache::InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition fem/elementvariables.hh:247
typename GridVariablesCache::Variables Variables
export type of the variables
Definition fem/elementvariables.hh:254
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:261
void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:312
friend const InterpolationPointData & cache(const FEElementVariables &elemVars, const IpData &ipData)
Definition fem/elementvariables.hh:360
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:302
GVC GridVariablesCache
export type of the grid variables
Definition fem/elementvariables.hh:244
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:370
MutableView asMutableView(GridVariablesCache &)
return a local view on variables that is always mutable, regardless of the caching policy
Definition fem/elementvariables.hh:377
void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:175
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:141
MutableView asMutableView(GridVariablesCache &gridVars)
return a local view on variables that is always mutable, regardless of the caching policy
Definition fem/elementvariables.hh:191
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:184
FEElementVariables(const GridVariablesCache &gridVariablesCache)
Constructor.
Definition fem/elementvariables.hh:110
typename GridVariablesCache::Variables Variables
export type of the variables
Definition fem/elementvariables.hh:96
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:165
std::conditional_t< GridVariablesCache::InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition fem/elementvariables.hh:89
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:103
friend const InterpolationPointData & cache(const FEElementVariables &elemVars, const IpData &ipData)
Definition fem/elementvariables.hh:126
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition fem/elementvariables.hh:99
void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:152
GVC GridVariablesCache
export type of the grid variables
Definition fem/elementvariables.hh:86
The (stencil) element variables class for finite element schemes.
Definition fem/elementvariables.hh:39
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
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:159
Definition assembly/assembler.hh:44
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.