12#ifndef DUMUX_DISCRETIZATION_HYBRID_CVFE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_HYBRID_CVFE_ELEMENT_VARIABLES_HH
22#include <dumux/common/concepts/ipdata_.hh>
23#include <dumux/common/concepts/localdofs_.hh>
41template<
class GVC,
bool cachingEnabled>
52 class MutableVariablesView
55 MutableVariablesView(GVC& gridCache)
56 : gridCache_(gridCache) {}
58 using Variables =
typename GVC::Variables;
60 template<Dumux::Concept::LocalDof LocalDof>
61 Variables& operator [](
const LocalDof& localDof)
const
62 {
return gridCache_.variables(localDof); }
67 class MutableVariablesViewWithIpCacheAccess
70 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
71 : gridCache_(gridCache)
74 using Variables =
typename GVC::Variables;
76 template<Dumux::Concept::LocalDof LocalDof>
77 Variables& operator [](
const LocalDof& localDof)
const
78 {
return gridCache_.variables(localDof); }
80 auto&
cache(std::size_t eIdx)
const
81 {
return gridCache_.cache(eIdx); }
96 InterpolationPointData::isSolDependent,
97 MutableVariablesViewWithIpCacheAccess,
102 using Variables =
typename GridVariablesCache::Variables;
105 template<
class ElementDiscretization>
107 InterpolationPointData::isSolDependent,
116 const Variables& operator [](std::size_t localDofIdx)
const
119 template<Dumux::Concept::LocalDof LocalDof>
120 const Variables& operator [](
const LocalDof& localDof)
const
123 template<
class IpData>
124 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
125 const Variables& operator [](
const IpData& ipData)
const
128 template<Concept::ScvfQpIpData IpData>
130 const IpData& ipData)
131 {
return elemVars.ipDataCache().scvfCache(ipData.scvfIndex(), ipData.qpIndex()); }
133 template<Concept::BoundaryFaceQpIpData IpData>
135 const IpData& ipData)
136 {
return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
138 template<Concept::QIpData IpData>
140 const IpData& ipData)
141 {
return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
148 template<
class ElementDiscretization,
class SolutionVector>
150 const ElementDiscretization& elemDisc,
151 const SolutionVector& sol) &&
154 return std::move(*
this);
159 template<
class ElementDiscretization,
class SolutionVector>
160 void bind(
const typename ElementDiscretization::Element& element,
161 const ElementDiscretization& elemDisc,
162 const SolutionVector& sol) &
172 template<
class ElementDiscretization,
class SolutionVector>
174 const ElementDiscretization& elemDisc,
175 const SolutionVector& sol) &&
178 return std::move(*
this);
182 template<
class ElementDiscretization,
class SolutionVector>
183 void bindElement(
const typename ElementDiscretization::Element& element,
184 const ElementDiscretization& elemDisc,
185 const SolutionVector& sol) &
189 if constexpr (!GridVariablesCache::interpolationPointDataCachingEnabled)
190 ipDataCache_.bind(elemDisc);
195 {
return *gridVariablesCachePtr_; }
202 {
return { gridVars }; }
207 const ElementInterpolationPointDataCache& ipDataCache()
const
209 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
210 return gridVariablesCache().cache(eIdx_);
212 return ipDataCache_.get(gridVariablesCache().problem(), gridVariablesCache().localDofVariables(eIdx_));
215 const GridVariablesCache* gridVariablesCachePtr_;
228 class MutableVariablesView
231 MutableVariablesView(ThisType& view)
234 using Variables =
typename GVC::Variables;
236 template<Dumux::Concept::LocalDof LocalDof>
237 Variables& operator [](
const LocalDof& localDof)
const
238 {
return view_[localDof]; }
243 class MutableVariablesViewWithIpCacheAccess
246 MutableVariablesViewWithIpCacheAccess(ThisType& view)
250 using Variables =
typename GVC::Variables;
252 template<Dumux::Concept::LocalDof LocalDof>
253 Variables& operator [](
const LocalDof& localDof)
const
254 {
return view_[localDof]; }
256 auto&
cache(std::size_t)
const
257 {
return view_.ipDataCache_.get(view_.gridVariablesCache().problem(), view_.variables_); }
272 InterpolationPointData::isSolDependent,
273 MutableVariablesViewWithIpCacheAccess,
278 using Variables =
typename GridVariablesCache::Variables;
281 template<
class ElementDiscretization>
283 InterpolationPointData::isSolDependent,
290 : gridVariablesCachePtr_(&gridVarsCache)
298 template<
class ElementDiscretization,
class SolutionVector>
300 const ElementDiscretization& elemDisc,
301 const SolutionVector& sol) &&
304 return std::move(*
this);
308 template<
class ElementDiscretization,
class SolutionVector>
309 void bind(
const typename ElementDiscretization::Element& element,
310 const ElementDiscretization& elemDisc,
311 const SolutionVector& sol) &
321 template<
class ElementDiscretization,
class SolutionVector>
323 const ElementDiscretization& elemDisc,
324 const SolutionVector& sol) &&
327 return std::move(*
this);
331 template<
class ElementDiscretization,
class SolutionVector>
332 void bindElement(
const typename ElementDiscretization::Element& element,
333 const ElementDiscretization& elemDisc,
334 const SolutionVector& sol) &
341 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
344 for (
const auto& localDof :
localDofs(elemDisc))
345 variables_[localDof.index()].update(elemSol,
gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
347 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
351 ipDataCache_.bind(elemDisc);
352 if constexpr (InterpolationPointData::isSolDependent)
357 const Variables& operator [](std::size_t localIdx)
const
358 {
return variables_[localIdx]; }
361 {
return variables_[localIdx]; }
363 template<Dumux::Concept::LocalDof LocalDof>
364 const Variables& operator [](
const LocalDof& localDof)
const
365 {
return variables_[localDof.index()]; }
367 template<Dumux::Concept::LocalDof LocalDof>
369 {
return variables_[localDof.index()]; }
371 template<
class IpData>
372 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
373 const Variables& operator [](
const IpData& ipData)
const
374 {
return variables_[ipData.localDofIndex()]; }
376 template<
class IpData>
377 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
379 {
return variables_[ipData.localDofIndex()]; }
381 template<Concept::ScvfQpIpData IpData>
383 const IpData& ipData)
384 {
return elemVars.ipDataCache().scvfCache(ipData.scvfIndex(), ipData.qpIndex()); }
386 template<Concept::BoundaryFaceQpIpData IpData>
388 const IpData& ipData)
389 {
return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
391 template<Concept::QIpData IpData>
393 const IpData& ipData)
394 {
return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
398 {
return *gridVariablesCachePtr_; }
405 {
return { *
this }; }
410 const ElementInterpolationPointDataCache& ipDataCache()
const
412 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
413 return gridVariablesCache().cache(eIdx_);
415 return ipDataCache_.get(gridVariablesCache().problem(), variables_);
418 const GridVariablesCache* gridVariablesCachePtr_;
419 std::vector<Variables> variables_;
420 std::size_t eIdx_ = 0;
Interpolation point data at the quadrature points of the sub-control volume faces,...
Definition elementinterpolationpointdatacache.hh:128
An element cache that is updated on its first access after binding.
Definition lazyelementcache.hh:29
Definition variablesdeflectionpolicy.hh:29
Definition variablesdeflectionpolicy.hh:95
std::conditional_t< InterpolationPointData::isSolDependent, Dumux::Detail::CVFE::VariablesDeflectionPolicyWithIpCacheUpdate< MutableView, ElementDiscretization >, Dumux::Detail::CVFE::VariablesDeflectionPolicy< MutableView, ElementDiscretization > > DeflectionPolicy
export type of deflection policy
Definition cvfe/hybrid/elementvariables.hh:282
void bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:309
std::conditional_t< InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition cvfe/hybrid/elementvariables.hh:271
MutableView asMutableView(GridVariablesCache &)
return a local view on variables that is always mutable, regardless of the caching policy
Definition cvfe/hybrid/elementvariables.hh:404
HybridCVFEElementVariables(const GridVariablesCache &gridVarsCache)
Constructor.
Definition cvfe/hybrid/elementvariables.hh:289
friend const InterpolationPointData & cache(const HybridCVFEElementVariables &elemVars, const IpData &ipData)
Definition cvfe/hybrid/elementvariables.hh:382
GVC GridVariablesCache
export type of the grid variables cache
Definition cvfe/hybrid/elementvariables.hh:265
void bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:332
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition cvfe/hybrid/elementvariables.hh:268
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition cvfe/hybrid/elementvariables.hh:397
HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element &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 cvfe/hybrid/elementvariables.hh:322
HybridCVFEElementVariables bind(const typename ElementDiscretization::Element &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 cvfe/hybrid/elementvariables.hh:299
typename GridVariablesCache::Variables Variables
export type of the variables
Definition cvfe/hybrid/elementvariables.hh:278
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition cvfe/hybrid/elementvariables.hh:194
void bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:183
std::conditional_t< InterpolationPointData::isSolDependent, Dumux::Detail::CVFE::VariablesDeflectionPolicyWithIpCacheUpdate< MutableView, ElementDiscretization >, Dumux::Detail::CVFE::VariablesDeflectionPolicy< MutableView, ElementDiscretization > > DeflectionPolicy
export type of deflection policy
Definition cvfe/hybrid/elementvariables.hh:106
MutableView asMutableView(GridVariablesCache &gridVars)
return a local view on variables that is always mutable, regardless of the caching policy
Definition cvfe/hybrid/elementvariables.hh:201
GVC GridVariablesCache
export type of the grid variables cache
Definition cvfe/hybrid/elementvariables.hh:89
std::conditional_t< InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition cvfe/hybrid/elementvariables.hh:95
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition cvfe/hybrid/elementvariables.hh:92
void bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:160
friend const InterpolationPointData & cache(const HybridCVFEElementVariables &elemVars, const IpData &ipData)
Definition cvfe/hybrid/elementvariables.hh:129
HybridCVFEElementVariables bind(const typename ElementDiscretization::Element &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 cvfe/hybrid/elementvariables.hh:149
HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element &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 cvfe/hybrid/elementvariables.hh:173
typename GridVariablesCache::Variables Variables
export type of the variables
Definition cvfe/hybrid/elementvariables.hh:102
HybridCVFEElementVariables(const GridVariablesCache &gridVariablesCache)
Constructor.
Definition cvfe/hybrid/elementvariables.hh:113
The (stencil) element variables class for hybrid control-volume finite element.
Definition cvfe/hybrid/elementvariables.hh:42
Type traits for problem classes.
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 cvfe/hybrid/elementvariables.hh:32
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.