12#ifndef DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
22#include <dumux/common/concepts/ipdata_.hh>
23#include <dumux/common/concepts/localdofs_.hh>
38template<
class GVC,
bool cachingEnabled>
49 class MutableVariablesView
52 MutableVariablesView(GVC& gridCache)
53 : gridCache_(gridCache) {}
55 using Variables =
typename GVC::Variables;
57 template<Dumux::Concept::LocalDof LocalDof>
58 Variables& operator [](
const LocalDof& localDof)
const
59 {
return gridCache_.variables(localDof); }
64 class MutableVariablesViewWithIpCacheAccess
67 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
68 : gridCache_(gridCache)
71 using Variables =
typename GVC::Variables;
73 template<Dumux::Concept::LocalDof LocalDof>
74 Variables& operator [](
const LocalDof& localDof)
const
75 {
return gridCache_.variables(localDof); }
77 auto&
cache(std::size_t eIdx)
const
78 {
return gridCache_.cache(eIdx); }
90 GridVariablesCache::InterpolationPointData::isSolDependent,
91 MutableVariablesViewWithIpCacheAccess,
96 using Variables =
typename GridVariablesCache::Variables;
102 template<
class ElementDiscretization>
104 InterpolationPointData::isSolDependent,
113 const Variables& operator [](std::size_t localDofIdx)
const
116 template<Dumux::Concept::LocalDof LocalDof>
117 const Variables& operator [](
const LocalDof& localDof)
const
120 template<
class IpData>
121 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
122 const Variables& operator [](
const IpData& ipData)
const
125 template<Concept::BoundaryFaceQpIpData IpData>
127 const IpData& ipData)
128 {
return elemVars.gridVariablesCache().boundaryFaceCache(elemVars.eIdx_, ipData.boundaryFaceIndex(), ipData.qpIndex()); }
130 template<Concept::QIpData IpData>
132 const IpData& ipData)
133 {
return elemVars.gridVariablesCache().elementCache(elemVars.eIdx_, ipData.qpIndex()); }
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) &&
146 return std::move(*
this);
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) &
164 template<
class ElementDiscretization,
class SolutionVector>
166 const ElementDiscretization& elemDisc,
167 const SolutionVector& sol) &&
170 return std::move(*
this);
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) &
185 {
return *gridVariablesCachePtr_; }
192 {
return { gridVars }; }
195 const GridVariablesCache* gridVariablesCachePtr_;
207 class MutableVariablesView
210 MutableVariablesView(ThisType& view)
213 using Variables =
typename GVC::Variables;
215 template<Dumux::Concept::LocalDof LocalDof>
216 Variables& operator [](
const LocalDof& localDof)
const
217 {
return view_[localDof]; }
222 class MutableVariablesViewWithIpCacheAccess
225 MutableVariablesViewWithIpCacheAccess(ThisType& view)
229 using Variables =
typename GVC::Variables;
231 template<Dumux::Concept::LocalDof LocalDof>
232 Variables& operator [](
const LocalDof& localDof)
const
233 {
return view_[localDof]; }
235 auto&
cache(std::size_t)
const
236 {
return *view_.ipDataCache_; }
248 GridVariablesCache::InterpolationPointData::isSolDependent,
249 MutableVariablesViewWithIpCacheAccess,
254 using Variables =
typename GridVariablesCache::Variables;
260 template<
class ElementDiscretization>
262 InterpolationPointData::isSolDependent,
269 : gridVariablesCachePtr_(&gridVarsCache)
270 , ipDataCache_(std::make_shared<InterpolationPointDataCache>())
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) &&
284 return std::move(*
this);
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) &
301 template<
class ElementDiscretization,
class SolutionVector>
303 const ElementDiscretization& elemDisc,
304 const SolutionVector& sol) &&
307 return std::move(*
this);
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) &
317 auto elemSol =
elementSolution(element, sol, elemDisc.gridDiscretization());
320 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
323 for (
const auto& localDof :
localDofs(elemDisc))
324 variables_[localDof.index()].update(elemSol,
gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
326 if constexpr (InterpolationPointData::isSolDependent)
328 auto newIpDataCache = std::make_shared<InterpolationPointDataCache>(*ipDataCache_);
329 newIpDataCache->update(
gridVariablesCache().problem(), element, elemDisc, variables_);
330 ipDataCache_ = std::move(newIpDataCache);
335 const Variables& operator [](std::size_t localIdx)
const
336 {
return variables_[localIdx]; }
339 {
return variables_[localIdx]; }
341 template<Dumux::Concept::LocalDof LocalDof>
342 const Variables& operator [](
const LocalDof& localDof)
const
343 {
return variables_[localDof.index()]; }
345 template<Dumux::Concept::LocalDof LocalDof>
347 {
return variables_[localDof.index()]; }
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()]; }
354 template<
class IpData>
355 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
357 {
return variables_[ipData.localDofIndex()]; }
359 template<Concept::BoundaryFaceQpIpData IpData>
361 const IpData& ipData)
362 {
return elemVars.ipDataCache_->boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
364 template<Concept::QIpData IpData>
366 const IpData& ipData)
367 {
return elemVars.ipDataCache_->elementCache(ipData.qpIndex()); }
371 {
return *gridVariablesCachePtr_; }
378 {
return { *
this }; }
381 class InterpolationPointDataCache
384 InterpolationPointDataCache()
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)
393 updateElementCache_(problem, element, elemDisc, elemVars);
397 const InterpolationPointData& elementCache(std::size_t qpIdx)
const
398 {
return elementCache_[qpIdx]; }
401 InterpolationPointData& elementCache(std::size_t qpIdx)
402 {
return elementCache_[qpIdx]; }
405 const InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
const
406 {
return boundaryFaceCache_[bfIdx][qpIdx]; }
409 InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
410 {
return boundaryFaceCache_[bfIdx][qpIdx]; }
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)
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());
424 boundaryFaceCache_.resize(std::ranges::size(boundaryFaces(elemDisc)));
425 for (
const auto& boundaryFace : boundaryFaces(elemDisc))
427 auto& bfCache = boundaryFaceCache_[boundaryFace.index()];
429 bfCache.resize(std::ranges::size(quadRule));
430 for (
const auto& qpData : quadRule)
431 bfCache[qpData.ipData().qpIndex()].update(problem,
439 std::vector<InterpolationPointData> elementCache_;
440 std::vector<std::vector<InterpolationPointData>> boundaryFaceCache_;
443 const GridVariablesCache* gridVariablesCachePtr_;
444 std::vector<Variables> variables_;
445 std::shared_ptr<InterpolationPointDataCache> ipDataCache_;
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.