12#ifndef DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
21#include <dumux/common/concepts/ipdata_.hh>
22#include <dumux/common/concepts/localdofs_.hh>
39template<
class GVC,
bool cachingEnabled>
50 class MutableVariablesView
53 MutableVariablesView(GVC& gridCache)
54 : gridCache_(gridCache) {}
56 using Variables =
typename GVC::Variables;
58 template<Dumux::Concept::LocalDof LocalDof>
59 Variables& operator [](
const LocalDof& localDof)
const
60 {
return gridCache_.variables(localDof); }
65 class MutableVariablesViewWithIpCacheAccess
68 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
69 : gridCache_(gridCache)
72 using Variables =
typename GVC::Variables;
74 template<Dumux::Concept::LocalDof LocalDof>
75 Variables& operator [](
const LocalDof& localDof)
const
76 {
return gridCache_.variables(localDof); }
78 auto&
cache(std::size_t eIdx)
const
79 {
return gridCache_.cache(eIdx); }
91 GridVariablesCache::InterpolationPointData::isSolDependent,
92 MutableVariablesViewWithIpCacheAccess,
97 using Variables =
typename GridVariablesCache::Variables;
103 template<
class ElementDiscretization>
105 InterpolationPointData::isSolDependent,
114 const Variables& operator [](std::size_t localDofIdx)
const
117 template<Dumux::Concept::LocalDof LocalDof>
118 const Variables& operator [](
const LocalDof& localDof)
const
121 template<
class IpData>
122 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
123 const Variables& operator [](
const IpData& ipData)
const
126 template<Concept::BoundaryFaceQpIpData IpData>
128 const IpData& ipData)
129 {
return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
131 template<Concept::QIpData IpData>
133 const IpData& ipData)
134 {
return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
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) &&
147 return std::move(*
this);
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) &
165 template<
class ElementDiscretization,
class SolutionVector>
167 const ElementDiscretization& elemDisc,
168 const SolutionVector& sol) &&
171 return std::move(*
this);
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) &
182 if constexpr (!GridVariablesCache::interpolationPointDataCachingEnabled)
183 ipDataCache_.bind(elemDisc);
188 {
return *gridVariablesCachePtr_; }
195 {
return { gridVars }; }
200 const ElementInterpolationPointDataCache& ipDataCache()
const
202 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
203 return gridVariablesCache().cache(eIdx_);
205 return ipDataCache_.get(gridVariablesCache().problem(), gridVariablesCache().localDofVariables(eIdx_));
208 const GridVariablesCache* gridVariablesCachePtr_;
221 class MutableVariablesView
224 MutableVariablesView(ThisType& view)
227 using Variables =
typename GVC::Variables;
229 template<Dumux::Concept::LocalDof LocalDof>
230 Variables& operator [](
const LocalDof& localDof)
const
231 {
return view_[localDof]; }
236 class MutableVariablesViewWithIpCacheAccess
239 MutableVariablesViewWithIpCacheAccess(ThisType& view)
243 using Variables =
typename GVC::Variables;
245 template<Dumux::Concept::LocalDof LocalDof>
246 Variables& operator [](
const LocalDof& localDof)
const
247 {
return view_[localDof]; }
249 auto&
cache(std::size_t)
const
250 {
return view_.ipDataCache_.get(view_.gridVariablesCache().problem(), view_.variables_); }
262 GridVariablesCache::InterpolationPointData::isSolDependent,
263 MutableVariablesViewWithIpCacheAccess,
268 using Variables =
typename GridVariablesCache::Variables;
274 template<
class ElementDiscretization>
276 InterpolationPointData::isSolDependent,
283 : gridVariablesCachePtr_(&gridVarsCache)
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) &&
297 return std::move(*
this);
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) &
314 template<
class ElementDiscretization,
class SolutionVector>
316 const ElementDiscretization& elemDisc,
317 const SolutionVector& sol) &&
320 return std::move(*
this);
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) &
334 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
337 for (
const auto& localDof :
localDofs(elemDisc))
338 variables_[localDof.index()].update(elemSol,
gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
340 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
344 ipDataCache_.bind(elemDisc);
345 if constexpr (InterpolationPointData::isSolDependent)
349 const Variables& operator [](std::size_t localIdx)
const
350 {
return variables_[localIdx]; }
353 {
return variables_[localIdx]; }
355 template<Dumux::Concept::LocalDof LocalDof>
356 const Variables& operator [](
const LocalDof& localDof)
const
357 {
return variables_[localDof.index()]; }
359 template<Dumux::Concept::LocalDof LocalDof>
361 {
return variables_[localDof.index()]; }
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()]; }
368 template<
class IpData>
369 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
371 {
return variables_[ipData.localDofIndex()]; }
373 template<Concept::BoundaryFaceQpIpData IpData>
375 const IpData& ipData)
376 {
return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
378 template<Concept::QIpData IpData>
380 const IpData& ipData)
381 {
return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
385 {
return *gridVariablesCachePtr_; }
392 {
return { *
this }; }
397 const ElementInterpolationPointDataCache& ipDataCache()
const
399 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
400 return gridVariablesCache().cache(eIdx_);
402 return ipDataCache_.get(gridVariablesCache().problem(), variables_);
405 const GridVariablesCache* gridVariablesCachePtr_;
406 std::vector<Variables> variables_;
407 std::size_t eIdx_ = 0;
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.