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>
29template<
class FluxVariablesCache>
32template<
class FluxVariablesCache>
47template<
class GFVC,
bool cachingEnabled,
class ScvfQuadratureRule>
55template<
class GFVC,
bool cachingEnabled>
62template<
class GFVC,
class ScvfQR>
73 : gridFluxVarsCachePtr_(&global) {}
77 template<
class FVElementGeometry,
class ElementVolumeVariables>
78 void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
79 const FVElementGeometry& fvGeometry,
80 const ElementVolumeVariables& elemVolVars) &
88 template<
class FVElementGeometry,
class ElementVolumeVariables>
90 const FVElementGeometry& fvGeometry,
91 const ElementVolumeVariables& elemVolVars) &&
93 this->
bind(element, fvGeometry, elemVolVars);
94 return std::move(*
this);
97 template<
class FVElementGeometry,
class ElementVolumeVariables>
98 void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
99 const FVElementGeometry& fvGeometry,
100 const ElementVolumeVariables& elemVolVars) &
102 const auto& gridDiscretization = Deprecated::gridGeometry(fvGeometry);
103 eIdx_ = gridDiscretization.elementMapper().index(element);
111 template<
class FVElementGeometry,
class ElementVolumeVariables>
113 const FVElementGeometry& fvGeometry,
114 const ElementVolumeVariables& elemVolVars) &&
116 this->
bindElement(element, fvGeometry, elemVolVars);
117 return std::move(*
this);
120 template<
class FVElementGeometry,
class ElementVolumeVariables>
121 void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
122 const FVElementGeometry& fvGeometry,
123 const ElementVolumeVariables& elemVolVars,
124 const typename FVElementGeometry::SubControlVolumeFace& scvf) &
132 template<
class FVElementGeometry,
class ElementVolumeVariables>
134 const FVElementGeometry& fvGeometry,
135 const ElementVolumeVariables& elemVolVars,
136 const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
138 this->
bindScvf(element, fvGeometry, elemVolVars, scvf);
139 return std::move(*
this);
143 template<
class FVElementGeometry,
class ElementVolumeVariables>
144 void update(
const typename FVElementGeometry::Element& element,
145 const FVElementGeometry& fvGeometry,
146 const ElementVolumeVariables& elemVolVars) {}
149 template<
class SubControlVolumeFace>
152 if constexpr (std::is_same_v<ScvfQR, QuadratureRules::MidpointQuadrature>)
155 DUNE_THROW(Dune::NotImplemented,
"CVFEElementFluxVariablesCache: Scvf access operator only implemented for MidpointQuadrature.");
159 template<Concept::ScvfIpData IpData>
162 if constexpr (std::is_same_v<ScvfQR, QuadratureRules::MidpointQuadrature>)
170 {
return *gridFluxVarsCachePtr_; }
173 const GridFluxVariablesCache* gridFluxVarsCachePtr_;
192 : gridFluxVarsCachePtr_(&global) {}
196 template<
class FVElementGeometry,
class ElementVolumeVariables>
197 void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
198 const FVElementGeometry& fvGeometry,
199 const ElementVolumeVariables& elemVolVars) &
209 template<
class FVElementGeometry,
class ElementVolumeVariables>
211 const FVElementGeometry& fvGeometry,
212 const ElementVolumeVariables& elemVolVars) &&
214 this->
bind(element, fvGeometry, elemVolVars);
215 return std::move(*
this);
218 template<
class FVElementGeometry,
class ElementVolumeVariables>
219 void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
220 const FVElementGeometry& fvGeometry,
221 const ElementVolumeVariables& elemVolVars) &
224 fluxVarsCache_.resize(fvGeometry.numScvf());
225 for (
auto&& scvf : scvfs(fvGeometry))
226 (*this)[scvf].update(
gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
234 template<
class FVElementGeometry,
class ElementVolumeVariables>
236 const FVElementGeometry& fvGeometry,
237 const ElementVolumeVariables& elemVolVars) &&
239 this->
bindElement(element, fvGeometry, elemVolVars);
240 return std::move(*
this);
243 template<
class FVElementGeometry,
class ElementVolumeVariables>
244 void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
245 const FVElementGeometry& fvGeometry,
246 const ElementVolumeVariables& elemVolVars,
247 const typename FVElementGeometry::SubControlVolumeFace& scvf) &
249 fluxVarsCache_.resize(fvGeometry.numScvf());
250 (*this)[scvf].update(
gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
258 template<
class FVElementGeometry,
class ElementVolumeVariables>
260 const FVElementGeometry& fvGeometry,
261 const ElementVolumeVariables& elemVolVars,
262 const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
264 this->
bindScvf(element, fvGeometry, elemVolVars, scvf);
265 return std::move(*
this);
272 template<
class FVElementGeometry,
class ElementVolumeVariables>
273 void update(
const typename FVElementGeometry::Element& element,
274 const FVElementGeometry& fvGeometry,
275 const ElementVolumeVariables& elemVolVars)
277 if constexpr (FluxVariablesCache::isSolDependent)
279 fluxVarsCache_.resize(fvGeometry.numScvf());
280 for (
const auto& scvf : scvfs(fvGeometry))
281 (*this)[scvf].update(
gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
286 template<
class SubControlVolumeFace>
288 {
return fluxVarsCache_[scvf.index()]; }
291 template<
class SubControlVolumeFace>
293 {
return fluxVarsCache_[scvf.index()]; }
296 template<Concept::ScvfIpData IpData>
298 {
return fluxVarsCache_[ipData.scvfIndex()]; }
301 template<Concept::ScvfIpData IpData>
303 {
return fluxVarsCache_[ipData.scvfIndex()]; }
307 {
return *gridFluxVarsCachePtr_; }
310 const GridFluxVariablesCache* gridFluxVarsCachePtr_;
311 std::vector<FluxVariablesCache> fluxVarsCache_;
318template<
class GFVC,
class ScvfQR>
329 : gridFluxVarsCachePtr_(&global) {}
333 template<
class FVElementGeometry,
class ElementVolumeVariables>
334 void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
335 const FVElementGeometry& fvGeometry,
336 const ElementVolumeVariables& elemVolVars) &
346 template<
class FVElementGeometry,
class ElementVolumeVariables>
348 const FVElementGeometry& fvGeometry,
349 const ElementVolumeVariables& elemVolVars) &&
351 this->
bind(element, fvGeometry, elemVolVars);
352 return std::move(*
this);
355 template<
class FVElementGeometry,
class ElementVolumeVariables>
356 void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
357 const FVElementGeometry& fvGeometry,
358 const ElementVolumeVariables& elemVolVars) &
361 fluxVarsCache_.resize(fvGeometry.numScvf());
362 for (
auto&& scvf : scvfs(fvGeometry))
365 fluxVarsCache_[scvf.index()].resize(std::ranges::size(quadRule));
366 for (
const auto& qpData : quadRule)
367 fluxVarsCache_[scvf.index()][qpData.ipData().qpIndex()].update(
378 template<
class FVElementGeometry,
class ElementVolumeVariables>
380 const FVElementGeometry& fvGeometry,
381 const ElementVolumeVariables& elemVolVars) &&
383 this->
bindElement(element, fvGeometry, elemVolVars);
384 return std::move(*
this);
387 template<
class FVElementGeometry,
class ElementVolumeVariables>
388 void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
389 const FVElementGeometry& fvGeometry,
390 const ElementVolumeVariables& elemVolVars,
391 const typename FVElementGeometry::SubControlVolumeFace& scvf) &
393 fluxVarsCache_.resize(fvGeometry.numScvf());
395 fluxVarsCache_[scvf.index()].resize(std::ranges::size(quadRule));
396 for (
const auto& qpData : quadRule)
397 fluxVarsCache_[scvf.index()][qpData.ipData().qpIndex()].update(
407 template<
class FVElementGeometry,
class ElementVolumeVariables>
409 const FVElementGeometry& fvGeometry,
410 const ElementVolumeVariables& elemVolVars,
411 const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
413 this->
bindScvf(element, fvGeometry, elemVolVars, scvf);
414 return std::move(*
this);
421 template<
class FVElementGeometry,
class ElementVolumeVariables>
422 void update(
const typename FVElementGeometry::Element& element,
423 const FVElementGeometry& fvGeometry,
424 const ElementVolumeVariables& elemVolVars)
426 if constexpr (FluxVariablesCache::isSolDependent)
428 fluxVarsCache_.resize(fvGeometry.numScvf());
429 for (
const auto& scvf : scvfs(fvGeometry))
432 fluxVarsCache_[scvf.index()].resize(std::ranges::size(quadRule));
433 for (
const auto& qpData : quadRule)
434 fluxVarsCache_[scvf.index()][qpData.ipData().qpIndex()].update(
442 template<Concept::ScvfQpIpData IpData>
444 {
return fluxVarsCache_[ipData.scvfIndex()][ipData.qpIndex()]; }
447 template<Concept::ScvfQpIpData IpData>
449 {
return fluxVarsCache_[ipData.scvfIndex()][ipData.qpIndex()]; }
453 {
return *gridFluxVarsCachePtr_; }
456 const GridFluxVariablesCache* gridFluxVarsCachePtr_;
457 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:235
void bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:197
void bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:219
typename GFVC::FluxVariablesCache FluxVariablesCache
export the type of the flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:189
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:210
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:259
const GridFluxVariablesCache & gridFluxVarsCache() const
The global object we are a restriction of.
Definition discretization/cvfe/elementfluxvariablescache.hh:306
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:244
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:273
GFVC GridFluxVariablesCache
export the type of the grid flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:186
CVFEElementFluxVariablesCacheImpl(const GridFluxVariablesCache &global)
Definition discretization/cvfe/elementfluxvariablescache.hh:191
typename GFVC::FluxVariablesCache FluxVariablesCache
export the type of the flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:326
void bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:356
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:388
CVFEElementFluxVariablesCacheImpl(const GridFluxVariablesCache &global)
Definition discretization/cvfe/elementfluxvariablescache.hh:328
GFVC GridFluxVariablesCache
export the type of the grid flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:323
const GridFluxVariablesCache & gridFluxVarsCache() const
The global object we are a restriction of.
Definition discretization/cvfe/elementfluxvariablescache.hh:452
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:422
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:408
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:347
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:379
void bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:334
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:133
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:89
void bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:78
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:144
GFVC GridFluxVariablesCache
export the type of the grid flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:67
typename GFVC::FluxVariablesCache FluxVariablesCache
export the type of the flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:70
const GridFluxVariablesCache & gridFluxVarsCache() const
The global object we are a restriction of.
Definition discretization/cvfe/elementfluxvariablescache.hh:169
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:121
CVFEElementFluxVariablesCacheImpl(const GridFluxVariablesCache &global)
Definition discretization/cvfe/elementfluxvariablescache.hh:72
void bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:98
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:112
The flux variables caches for an element.
Definition discretization/cvfe/elementfluxvariablescache.hh:49
CVFEElementFluxVariablesCacheImpl< GFVC, cachingEnabled, Detail::ScvfQuadratureRuleOrDefault_t< typename GFVC::FluxVariablesCache > > CVFEElementFluxVariablesCache
The flux variables caches for an element.
Definition discretization/cvfe/elementfluxvariablescache.hh:56
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:159
Definition cvfelocalresidual.hh:25
typename FluxVariablesCache::ScvfQuadratureRule DefinesScvfQuadratureRule
Definition discretization/cvfe/elementfluxvariablescache.hh:30
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesScvfQuadratureRule, FluxVariablesCache > ScvfQuadratureRuleOrDefault_t
Definition discretization/cvfe/elementfluxvariablescache.hh:33
Definition quadraturerules.hh:52
Quadrature rules over sub-control volumes and sub-control volume faces.
Midpoint quadrature rule that uses scv/scvf centers.
Definition quadraturerules.hh:58