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>
27
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.gridVariablesCache().boundaryFaceCache(elemVars.eIdx_, 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.gridVariablesCache().elementCache(elemVars.eIdx_, 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 = Deprecated::gridGeometry(elemDisc);
181 eIdx_ = gridDiscretization.elementMapper().index(element);
182 }
183
186 { return *gridVariablesCachePtr_; }
187
193 { return { gridVars }; }
194
195private:
196 const GridVariablesCache* gridVariablesCachePtr_;
197 std::size_t eIdx_;
198};
199
204template<class GVC>
205class FEElementVariables<GVC, /*cachingEnabled*/false>
206{
207 using ThisType = FEElementVariables<GVC, /*cachingEnabled*/false>;
208 using GridDiscretization = std::decay_t<decltype(std::declval<GVC>().problem().gridDiscretization())>;
209 using GridView = typename GridDiscretization::GridView;
210
212 static constexpr std::size_t maxNumBoundaryFaces = GridView::dimension << 1;
213
214 class MutableVariablesView
215 {
216 public:
217 MutableVariablesView(ThisType& view)
218 : view_(view) {}
219
220 using Variables = typename GVC::Variables;
221
222 template<Dumux::Concept::LocalDof LocalDof>
223 Variables& operator [](const LocalDof& localDof) const
224 { return view_[localDof]; }
225 private:
226 ThisType& view_;
227 };
228
229 class MutableVariablesViewWithIpCacheAccess
230 {
231 public:
232 MutableVariablesViewWithIpCacheAccess(ThisType& view)
233 : view_(view)
234 {}
235
236 using Variables = typename GVC::Variables;
237
238 template<Dumux::Concept::LocalDof LocalDof>
239 Variables& operator [](const LocalDof& localDof) const
240 { return view_[localDof]; }
241
242 auto& cache(std::size_t) const
243 { return *view_.ipDataCache_; }
244
245 private:
246 ThisType& view_;
247 };
248
249public:
252
254 using MutableView = std::conditional_t<
255 GridVariablesCache::InterpolationPointData::isSolDependent,
256 MutableVariablesViewWithIpCacheAccess,
257 MutableVariablesView
258 >;
259
261 using Variables = typename GridVariablesCache::Variables;
262
264 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
265
267 template<class ElementDiscretization>
268 using DeflectionPolicy = std::conditional_t<
269 InterpolationPointData::isSolDependent,
272 >;
273
276 : gridVariablesCachePtr_(&gridVarsCache)
277 , ipDataCache_(std::make_shared<InterpolationPointDataCache>())
278 {}
279
285 template<class ElementDiscretization, class SolutionVector>
286 FEElementVariables bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
287 const ElementDiscretization& elemDisc,
288 const SolutionVector& sol) &&
289 {
290 this->bindElement(element, elemDisc, sol);
291 return std::move(*this);
292 }
293
294 // specialization for finite element schemes, simply forwards to the bindElement method
295 template<class ElementDiscretization, class SolutionVector>
296 void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
297 const ElementDiscretization& elemDisc,
298 const SolutionVector& sol) &
299 {
300 bindElement(element, elemDisc, sol);
301 }
302
308 template<class ElementDiscretization, class SolutionVector>
309 FEElementVariables bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
310 const ElementDiscretization& elemDisc,
311 const SolutionVector& sol) &&
312 {
313 this->bindElement(element, elemDisc, sol);
314 return std::move(*this);
315 }
316
317 // specialization for finite element schemes
318 template<class ElementDiscretization, class SolutionVector>
319 void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
320 const ElementDiscretization& elemDisc,
321 const SolutionVector& sol) &
322 {
323 // get the solution at the dofs of the element
324 auto elemSol = elementSolution(element, sol, elemDisc.gridDiscretization());
325
326 // resize variables to the required size
327 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
328
329 // update variables related to localDofs
330 for (const auto& localDof : localDofs(elemDisc))
331 variables_[localDof.index()].update(elemSol, gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
332
333 if constexpr (InterpolationPointData::isSolDependent)
334 {
335 auto newIpDataCache = std::make_shared<InterpolationPointDataCache>(*ipDataCache_);
336 newIpDataCache->update(gridVariablesCache().problem(), element, elemDisc, variables_);
337 ipDataCache_ = std::move(newIpDataCache);
338 }
339 else
340 ipDataCache_->update(gridVariablesCache().problem(), element, elemDisc, variables_);
341 }
342 const Variables& operator [](std::size_t localIdx) const
343 { return variables_[localIdx]; }
344
345 Variables& operator [](std::size_t localIdx)
346 { return variables_[localIdx]; }
347
348 template<Dumux::Concept::LocalDof LocalDof>
349 const Variables& operator [](const LocalDof& localDof) const
350 { return variables_[localDof.index()]; }
351
352 template<Dumux::Concept::LocalDof LocalDof>
353 Variables& operator [](const LocalDof& localDof)
354 { return variables_[localDof.index()]; }
355
356 template<class IpData>
357 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
358 const Variables& operator [](const IpData& ipData) const
359 { return variables_[ipData.localDofIndex()]; }
360
361 template<class IpData>
362 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
363 Variables& operator [](const IpData& ipData)
364 { return variables_[ipData.localDofIndex()]; }
365
366 template<Concept::BoundaryFaceQpIpData IpData>
367 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
368 const IpData& ipData)
369 { return elemVars.ipDataCache_->boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
370
371 template<Concept::QIpData IpData>
372 friend const InterpolationPointData& cache(const FEElementVariables& elemVars,
373 const IpData& ipData)
374 { return elemVars.ipDataCache_->elementCache(ipData.qpIndex()); }
375
378 { return *gridVariablesCachePtr_; }
379
385 { return { *this }; }
386
387private:
388 class InterpolationPointDataCache
389 {
390 public:
391 InterpolationPointDataCache()
392 {}
393
394 template<class Problem, class ElementDiscretization, class ElementVariables>
395 void update(const Problem& problem,
396 const typename ElementDiscretization::Element& element,
397 const ElementDiscretization& elemDisc,
398 const ElementVariables& elemVars)
399 {
400 updateElementCache_(problem, element, elemDisc, elemVars);
401 }
402
403 // access operator
404 const InterpolationPointData& elementCache(std::size_t qpIdx) const
405 { return elementCache_[qpIdx]; }
406
407 // access operator
408 InterpolationPointData& elementCache(std::size_t qpIdx)
409 { return elementCache_[qpIdx]; }
410
411 // access operator
412 const InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx) const
413 { return boundaryFaceCache_[bfIdx][qpIdx]; }
414
415 // access operator
416 InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
417 { return boundaryFaceCache_[bfIdx][qpIdx]; }
418
419 private:
420 template<class Problem, class ElementDiscretization, class ElementVariables>
421 void updateElementCache_(const Problem& problem,
422 const typename ElementDiscretization::Element& element,
423 const ElementDiscretization& elemDisc,
424 const ElementVariables& elemVars)
425 {
426 const auto elemQuadRule = Dumux::CVFE::quadratureRule(elemDisc, element);
427 elementCache_.resize(std::ranges::size(elemQuadRule));
428 for (const auto& qpData : elemQuadRule)
429 elementCache_[qpData.ipData().qpIndex()].update(problem, element, elemDisc, elemVars, qpData.ipData());
430
431 for (const auto& boundaryFace : boundaryFaces(elemDisc))
432 {
433 auto& bfCache = boundaryFaceCache_[boundaryFace.index()];
434 const auto quadRule = Dumux::CVFE::quadratureRule(elemDisc, boundaryFace);
435 bfCache.resize(std::ranges::size(quadRule));
436 for (const auto& qpData : quadRule)
437 bfCache[qpData.ipData().qpIndex()].update(problem,
438 element,
439 elemDisc,
440 elemVars,
441 qpData.ipData());
442 }
443 }
444
445 std::vector<InterpolationPointData> elementCache_;
446 std::array<std::vector<InterpolationPointData>, maxNumBoundaryFaces> boundaryFaceCache_;
447 };
448
449 const GridVariablesCache* gridVariablesCachePtr_;
450 std::vector<Variables> variables_;
451 std::shared_ptr<InterpolationPointDataCache> ipDataCache_;
452};
453
454} // end namespace Dumux::Experimental
455
456#endif
Definition variablesdeflectionpolicy.hh:29
Definition variablesdeflectionpolicy.hh:95
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition fem/elementvariables.hh:264
FEElementVariables(const GridVariablesCache &gridVarsCache)
Constructor.
Definition fem/elementvariables.hh:275
void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:296
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:286
std::conditional_t< GridVariablesCache::InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition fem/elementvariables.hh:254
typename GridVariablesCache::Variables Variables
export type of the variables
Definition fem/elementvariables.hh:261
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:268
void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:319
friend const InterpolationPointData & cache(const FEElementVariables &elemVars, const IpData &ipData)
Definition fem/elementvariables.hh:367
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:309
GVC GridVariablesCache
export type of the grid variables
Definition fem/elementvariables.hh:251
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:377
MutableView asMutableView(GridVariablesCache &)
return a local view on variables that is always mutable, regardless of the caching policy
Definition fem/elementvariables.hh:384
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:192
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:185
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
Helpers for deprecation.
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
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.