12#ifndef DUMUX_DISCRETIZATION_CVFE_ELEMENT_FLUXVARSCACHE_HH
13#define DUMUX_DISCRETIZATION_CVFE_ELEMENT_FLUXVARSCACHE_HH
19#include <dune/common/std/type_traits.hh>
21#include <dumux/common/concepts/ipdata_.hh>
28template<
class FluxVariablesCache>
31template<
class FluxVariablesCache>
46template<
class GFVC,
bool cachingEnabled,
class ScvfQuadratureRule>
54template<
class GFVC,
bool cachingEnabled>
61template<
class GFVC,
class ScvfQR>
72 : gridFluxVarsCachePtr_(&global) {}
76 template<
class FVElementGeometry,
class ElementVolumeVariables>
77 void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
78 const FVElementGeometry& fvGeometry,
79 const ElementVolumeVariables& elemVolVars) &
80 { bindElement(element, fvGeometry, elemVolVars); }
87 template<
class FVElementGeometry,
class ElementVolumeVariables>
89 const FVElementGeometry& fvGeometry,
90 const ElementVolumeVariables& elemVolVars) &&
92 this->bind(element, fvGeometry, elemVolVars);
93 return std::move(*
this);
96 template<
class FVElementGeometry,
class ElementVolumeVariables>
97 void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
98 const FVElementGeometry& fvGeometry,
99 const ElementVolumeVariables& elemVolVars) &
100 { eIdx_ = fvGeometry.gridGeometry().elementMapper().index(element); }
107 template<
class FVElementGeometry,
class ElementVolumeVariables>
109 const FVElementGeometry& fvGeometry,
110 const ElementVolumeVariables& elemVolVars) &&
112 this->bindElement(element, fvGeometry, elemVolVars);
113 return std::move(*
this);
116 template<
class FVElementGeometry,
class ElementVolumeVariables>
117 void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
118 const FVElementGeometry& fvGeometry,
119 const ElementVolumeVariables& elemVolVars,
120 const typename FVElementGeometry::SubControlVolumeFace& scvf) &
121 { bindElement(element, fvGeometry, elemVolVars); }
128 template<
class FVElementGeometry,
class ElementVolumeVariables>
130 const FVElementGeometry& fvGeometry,
131 const ElementVolumeVariables& elemVolVars,
132 const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
134 this->bindScvf(element, fvGeometry, elemVolVars, scvf);
135 return std::move(*
this);
139 template<
class FVElementGeometry,
class ElementVolumeVariables>
140 void update(
const typename FVElementGeometry::Element& element,
141 const FVElementGeometry& fvGeometry,
142 const ElementVolumeVariables& elemVolVars) {}
145 template<
class SubControlVolumeFace>
148 if constexpr (std::is_same_v<ScvfQR, QuadratureRules::MidpointQuadrature>)
149 return gridFluxVarsCache().cache(eIdx_, scvf.index());
151 DUNE_THROW(Dune::NotImplemented,
"CVFEElementFluxVariablesCache: Scvf access operator only implemented for MidpointQuadrature.");
155 template<Concept::ScvfIpData IpData>
158 if constexpr (std::is_same_v<ScvfQR, QuadratureRules::MidpointQuadrature>)
159 return gridFluxVarsCache().cache(eIdx_, ipData.scvfIndex());
161 return gridFluxVarsCache().cache(eIdx_, ipData.scvfIndex(), ipData.qpIndex());
166 {
return *gridFluxVarsCachePtr_; }
169 const GridFluxVariablesCache* gridFluxVarsCachePtr_;
188 : gridFluxVarsCachePtr_(&global) {}
192 template<
class FVElementGeometry,
class ElementVolumeVariables>
193 void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
194 const FVElementGeometry& fvGeometry,
195 const ElementVolumeVariables& elemVolVars) &
197 bindElement(element, fvGeometry, elemVolVars);
205 template<
class FVElementGeometry,
class ElementVolumeVariables>
207 const FVElementGeometry& fvGeometry,
208 const ElementVolumeVariables& elemVolVars) &&
210 this->bind(element, fvGeometry, elemVolVars);
211 return std::move(*
this);
214 template<
class FVElementGeometry,
class ElementVolumeVariables>
215 void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
216 const FVElementGeometry& fvGeometry,
217 const ElementVolumeVariables& elemVolVars) &
220 fluxVarsCache_.resize(fvGeometry.numScvf());
221 for (
auto&& scvf : scvfs(fvGeometry))
222 (*this)[scvf].update(gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
230 template<
class FVElementGeometry,
class ElementVolumeVariables>
232 const FVElementGeometry& fvGeometry,
233 const ElementVolumeVariables& elemVolVars) &&
235 this->bindElement(element, fvGeometry, elemVolVars);
236 return std::move(*
this);
239 template<
class FVElementGeometry,
class ElementVolumeVariables>
240 void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
241 const FVElementGeometry& fvGeometry,
242 const ElementVolumeVariables& elemVolVars,
243 const typename FVElementGeometry::SubControlVolumeFace& scvf) &
245 fluxVarsCache_.resize(fvGeometry.numScvf());
246 (*this)[scvf].update(gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
254 template<
class FVElementGeometry,
class ElementVolumeVariables>
256 const FVElementGeometry& fvGeometry,
257 const ElementVolumeVariables& elemVolVars,
258 const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
260 this->bindScvf(element, fvGeometry, elemVolVars, scvf);
261 return std::move(*
this);
268 template<
class FVElementGeometry,
class ElementVolumeVariables>
269 void update(
const typename FVElementGeometry::Element& element,
270 const FVElementGeometry& fvGeometry,
271 const ElementVolumeVariables& elemVolVars)
273 if constexpr (FluxVariablesCache::isSolDependent)
275 fluxVarsCache_.resize(fvGeometry.numScvf());
276 for (
const auto& scvf : scvfs(fvGeometry))
277 (*
this)[scvf].update(gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
282 template<
class SubControlVolumeFace>
284 {
return fluxVarsCache_[scvf.index()]; }
287 template<
class SubControlVolumeFace>
289 {
return fluxVarsCache_[scvf.index()]; }
292 template<Concept::ScvfIpData IpData>
294 {
return fluxVarsCache_[ipData.scvfIndex()]; }
297 template<Concept::ScvfIpData IpData>
299 {
return fluxVarsCache_[ipData.scvfIndex()]; }
303 {
return *gridFluxVarsCachePtr_; }
306 const GridFluxVariablesCache* gridFluxVarsCachePtr_;
307 std::vector<FluxVariablesCache> fluxVarsCache_;
314template<
class GFVC,
class ScvfQR>
325 : gridFluxVarsCachePtr_(&global) {}
329 template<
class FVElementGeometry,
class ElementVolumeVariables>
330 void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
331 const FVElementGeometry& fvGeometry,
332 const ElementVolumeVariables& elemVolVars) &
334 bindElement(element, fvGeometry, elemVolVars);
342 template<
class FVElementGeometry,
class ElementVolumeVariables>
344 const FVElementGeometry& fvGeometry,
345 const ElementVolumeVariables& elemVolVars) &&
347 this->bind(element, fvGeometry, elemVolVars);
348 return std::move(*
this);
351 template<
class FVElementGeometry,
class ElementVolumeVariables>
352 void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
353 const FVElementGeometry& fvGeometry,
354 const ElementVolumeVariables& elemVolVars) &
357 fluxVarsCache_.resize(fvGeometry.numScvf());
358 for (
auto&& scvf : scvfs(fvGeometry))
361 fluxVarsCache_[scvf.index()].resize(std::ranges::size(quadRule));
362 for (
const auto& qpData : quadRule)
363 fluxVarsCache_[scvf.index()][qpData.ipData().qpIndex()].update(
364 gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, qpData.ipData()
374 template<
class FVElementGeometry,
class ElementVolumeVariables>
376 const FVElementGeometry& fvGeometry,
377 const ElementVolumeVariables& elemVolVars) &&
379 this->bindElement(element, fvGeometry, elemVolVars);
380 return std::move(*
this);
383 template<
class FVElementGeometry,
class ElementVolumeVariables>
384 void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
385 const FVElementGeometry& fvGeometry,
386 const ElementVolumeVariables& elemVolVars,
387 const typename FVElementGeometry::SubControlVolumeFace& scvf) &
389 fluxVarsCache_.resize(fvGeometry.numScvf());
391 fluxVarsCache_[scvf.index()].resize(std::ranges::size(quadRule));
392 for (
const auto& qpData : quadRule)
393 fluxVarsCache_[scvf.index()][qpData.ipData().qpIndex()].update(
394 gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, qpData.ipData()
403 template<
class FVElementGeometry,
class ElementVolumeVariables>
405 const FVElementGeometry& fvGeometry,
406 const ElementVolumeVariables& elemVolVars,
407 const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
409 this->bindScvf(element, fvGeometry, elemVolVars, scvf);
410 return std::move(*
this);
417 template<
class FVElementGeometry,
class ElementVolumeVariables>
418 void update(
const typename FVElementGeometry::Element& element,
419 const FVElementGeometry& fvGeometry,
420 const ElementVolumeVariables& elemVolVars)
422 if constexpr (FluxVariablesCache::isSolDependent)
424 fluxVarsCache_.resize(fvGeometry.numScvf());
425 for (
const auto& scvf : scvfs(fvGeometry))
428 fluxVarsCache_[scvf.index()].resize(std::ranges::size(quadRule));
429 for (
const auto& qpData : quadRule)
430 fluxVarsCache_[scvf.index()][qpData.ipData().qpIndex()].update(
431 gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, qpData.ipData()
438 template<Concept::ScvfQpIpData IpData>
440 {
return fluxVarsCache_[ipData.scvfIndex()][ipData.qpIndex()]; }
443 template<Concept::ScvfQpIpData IpData>
445 {
return fluxVarsCache_[ipData.scvfIndex()][ipData.qpIndex()]; }
449 {
return *gridFluxVarsCachePtr_; }
452 const GridFluxVariablesCache* gridFluxVarsCachePtr_;
453 std::vector<std::vector<FluxVariablesCache>> fluxVarsCache_;
CVFEElementFluxVariablesCacheImpl bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:231
void bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:193
void bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:215
typename GFVC::FluxVariablesCache FluxVariablesCache
export the type of the flux variables cache
Definition: discretization/cvfe/elementfluxvariablescache.hh:185
CVFEElementFluxVariablesCacheImpl bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:206
CVFEElementFluxVariablesCacheImpl bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:255
const GridFluxVariablesCache & gridFluxVarsCache() const
The global object we are a restriction of.
Definition: discretization/cvfe/elementfluxvariablescache.hh:302
void bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:240
void update(const typename FVElementGeometry::Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars)
Update the caches if the volume variables have changed and the cache is solution-dependent.
Definition: discretization/cvfe/elementfluxvariablescache.hh:269
GFVC GridFluxVariablesCache
export the type of the grid flux variables cache
Definition: discretization/cvfe/elementfluxvariablescache.hh:182
CVFEElementFluxVariablesCacheImpl(const GridFluxVariablesCache &global)
Definition: discretization/cvfe/elementfluxvariablescache.hh:187
typename GFVC::FluxVariablesCache FluxVariablesCache
export the type of the flux variables cache
Definition: discretization/cvfe/elementfluxvariablescache.hh:322
void bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:352
void bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:384
CVFEElementFluxVariablesCacheImpl(const GridFluxVariablesCache &global)
Definition: discretization/cvfe/elementfluxvariablescache.hh:324
GFVC GridFluxVariablesCache
export the type of the grid flux variables cache
Definition: discretization/cvfe/elementfluxvariablescache.hh:319
const GridFluxVariablesCache & gridFluxVarsCache() const
The global object we are a restriction of.
Definition: discretization/cvfe/elementfluxvariablescache.hh:448
void update(const typename FVElementGeometry::Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars)
Update the caches if the volume variables have changed and the cache is solution-dependent.
Definition: discretization/cvfe/elementfluxvariablescache.hh:418
CVFEElementFluxVariablesCacheImpl bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:404
CVFEElementFluxVariablesCacheImpl bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:343
CVFEElementFluxVariablesCacheImpl bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:375
void bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:330
CVFEElementFluxVariablesCacheImpl bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:129
CVFEElementFluxVariablesCacheImpl bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:88
void bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:77
void update(const typename FVElementGeometry::Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars)
Specialization for the global caching being enabled - do nothing here.
Definition: discretization/cvfe/elementfluxvariablescache.hh:140
GFVC GridFluxVariablesCache
export the type of the grid flux variables cache
Definition: discretization/cvfe/elementfluxvariablescache.hh:66
typename GFVC::FluxVariablesCache FluxVariablesCache
export the type of the flux variables cache
Definition: discretization/cvfe/elementfluxvariablescache.hh:69
const GridFluxVariablesCache & gridFluxVarsCache() const
The global object we are a restriction of.
Definition: discretization/cvfe/elementfluxvariablescache.hh:165
void bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:117
CVFEElementFluxVariablesCacheImpl(const GridFluxVariablesCache &global)
Definition: discretization/cvfe/elementfluxvariablescache.hh:71
void bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition: discretization/cvfe/elementfluxvariablescache.hh:97
CVFEElementFluxVariablesCacheImpl bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cvfe/elementfluxvariablescache.hh:108
The flux variables caches for an element.
Definition: discretization/cvfe/elementfluxvariablescache.hh:48
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition: quadraturerules.hh:148
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesScvfQuadratureRule, FluxVariablesCache > ScvfQuadratureRuleOrDefault_t
Definition: discretization/cvfe/elementfluxvariablescache.hh:34
typename FluxVariablesCache::ScvfQuadratureRule DefinesScvfQuadratureRule
Definition: discretization/cvfe/elementfluxvariablescache.hh:29
Quadrature rules over sub-control volumes and sub-control volume faces.
Midpoint quadrature rule that uses scv/scvf centers.
Definition: quadraturerules.hh:58