12#ifndef DUMUX_DISCRETIZATION_HYBRID_CVFE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_HYBRID_CVFE_ELEMENT_VARIABLES_HH
23#include <dumux/common/concepts/ipdata_.hh>
24#include <dumux/common/concepts/localdofs_.hh>
40template<
class GVC,
bool cachingEnabled>
51 class MutableVariablesView
54 MutableVariablesView(GVC& gridCache)
55 : gridCache_(gridCache) {}
57 using Variables =
typename GVC::Variables;
59 template<Dumux::Concept::LocalDof LocalDof>
60 Variables& operator [](
const LocalDof& localDof)
const
61 {
return gridCache_.variables(localDof); }
66 class MutableVariablesViewWithIpCacheAccess
69 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
70 : gridCache_(gridCache)
73 using Variables =
typename GVC::Variables;
75 template<Dumux::Concept::LocalDof LocalDof>
76 Variables& operator [](
const LocalDof& localDof)
const
77 {
return gridCache_.variables(localDof); }
79 auto&
cache(std::size_t eIdx)
const
80 {
return gridCache_.cache(eIdx); }
95 InterpolationPointData::isSolDependent,
96 MutableVariablesViewWithIpCacheAccess,
101 using Variables =
typename GridVariablesCache::Variables;
104 template<
class ElementDiscretization>
106 InterpolationPointData::isSolDependent,
115 const Variables& operator [](std::size_t localDofIdx)
const
118 template<Dumux::Concept::LocalDof LocalDof>
119 const Variables& operator [](
const LocalDof& localDof)
const
122 template<
class IpData>
123 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
124 const Variables& operator [](
const IpData& ipData)
const
127 template<Concept::ScvfQpIpData IpData>
129 const IpData& ipData)
130 {
return elemVars.gridVariablesCache().scvfCache(elemVars.eIdx_, ipData.scvfIndex(), ipData.qpIndex()); }
132 template<Concept::BoundaryFaceQpIpData IpData>
134 const IpData& ipData)
135 {
return elemVars.gridVariablesCache().boundaryFaceCache(elemVars.eIdx_, ipData.boundaryFaceIndex(), ipData.qpIndex()); }
137 template<Concept::QIpData IpData>
139 const IpData& ipData)
140 {
return elemVars.gridVariablesCache().elementCache(elemVars.eIdx_, ipData.qpIndex()); }
147 template<
class ElementDiscretization,
class SolutionVector>
149 const ElementDiscretization& elemDisc,
150 const SolutionVector& sol) &&
153 return std::move(*
this);
158 template<
class ElementDiscretization,
class SolutionVector>
159 void bind(
const typename ElementDiscretization::Element& element,
160 const ElementDiscretization& elemDisc,
161 const SolutionVector& sol) &
171 template<
class ElementDiscretization,
class SolutionVector>
173 const ElementDiscretization& elemDisc,
174 const SolutionVector& sol) &&
177 return std::move(*
this);
181 template<
class ElementDiscretization,
class SolutionVector>
182 void bindElement(
const typename ElementDiscretization::Element& element,
183 const ElementDiscretization& elemDisc,
184 const SolutionVector& sol) &
192 {
return *gridVariablesCachePtr_; }
199 {
return { gridVars }; }
202 const GridVariablesCache* gridVariablesCachePtr_;
214 class MutableVariablesView
217 MutableVariablesView(ThisType& view)
220 using Variables =
typename GVC::Variables;
222 template<Dumux::Concept::LocalDof LocalDof>
223 Variables& operator [](
const LocalDof& localDof)
const
224 {
return view_[localDof]; }
229 class MutableVariablesViewWithIpCacheAccess
232 MutableVariablesViewWithIpCacheAccess(ThisType& view)
236 using Variables =
typename GVC::Variables;
238 template<Dumux::Concept::LocalDof LocalDof>
239 Variables& operator [](
const LocalDof& localDof)
const
240 {
return view_[localDof]; }
242 auto&
cache(std::size_t)
const
243 {
return *view_.ipDataCache_; }
258 InterpolationPointData::isSolDependent,
259 MutableVariablesViewWithIpCacheAccess,
264 using Variables =
typename GridVariablesCache::Variables;
267 template<
class ElementDiscretization>
269 InterpolationPointData::isSolDependent,
276 : gridVariablesCachePtr_(&gridVarsCache)
277 , ipDataCache_(std::make_shared<InterpolationPointDataCache>())
285 template<
class ElementDiscretization,
class SolutionVector>
287 const ElementDiscretization& elemDisc,
288 const SolutionVector& sol) &&
291 return std::move(*
this);
295 template<
class ElementDiscretization,
class SolutionVector>
296 void bind(
const typename ElementDiscretization::Element& element,
297 const ElementDiscretization& elemDisc,
298 const SolutionVector& sol) &
308 template<
class ElementDiscretization,
class SolutionVector>
310 const ElementDiscretization& elemDisc,
311 const SolutionVector& sol) &&
314 return std::move(*
this);
318 template<
class ElementDiscretization,
class SolutionVector>
319 void bindElement(
const typename ElementDiscretization::Element& element,
320 const ElementDiscretization& elemDisc,
321 const SolutionVector& sol) &
328 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
331 for (
const auto& localDof :
localDofs(elemDisc))
332 variables_[localDof.index()].update(elemSol,
gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
334 if constexpr (InterpolationPointData::isSolDependent)
336 auto newIpDataCache = std::make_shared<InterpolationPointDataCache>(*ipDataCache_);
337 newIpDataCache->update(
gridVariablesCache().problem(), element, elemDisc, variables_);
338 ipDataCache_ = std::move(newIpDataCache);
344 const Variables& operator [](std::size_t localIdx)
const
345 {
return variables_[localIdx]; }
348 {
return variables_[localIdx]; }
350 template<Dumux::Concept::LocalDof LocalDof>
351 const Variables& operator [](
const LocalDof& localDof)
const
352 {
return variables_[localDof.index()]; }
354 template<Dumux::Concept::LocalDof LocalDof>
356 {
return variables_[localDof.index()]; }
358 template<
class IpData>
359 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
360 const Variables& operator [](
const IpData& ipData)
const
361 {
return variables_[ipData.localDofIndex()]; }
363 template<
class IpData>
364 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
366 {
return variables_[ipData.localDofIndex()]; }
368 template<Concept::ScvfQpIpData IpData>
370 const IpData& ipData)
371 {
return elemVars.ipDataCache_->scvfCache(ipData.scvfIndex(), ipData.qpIndex()); }
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 }; }
395 class InterpolationPointDataCache
398 InterpolationPointDataCache()
401 template<
class Problem,
class ElementDiscretization,
class ElementVariables>
402 void update(
const Problem& problem,
403 const typename ElementDiscretization::Element& element,
404 const ElementDiscretization& elemDisc,
405 const ElementVariables& elemVars)
407 updateElementCache_(problem, element, elemDisc, elemVars);
411 const InterpolationPointData& scvfCache(std::size_t scvfIdx, std::size_t qpIdx)
const
412 {
return scvfCache_[scvfIdx][qpIdx]; }
415 InterpolationPointData& scvfCache(std::size_t scvfIdx, std::size_t qpIdx)
416 {
return scvfCache_[scvfIdx][qpIdx]; }
419 const InterpolationPointData& elementCache(std::size_t qpIdx)
const
420 {
return elementCache_[qpIdx]; }
423 InterpolationPointData& elementCache(std::size_t qpIdx)
424 {
return elementCache_[qpIdx]; }
427 const InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
const
428 {
return boundaryFaceCache_[bfIdx][qpIdx]; }
431 InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
432 {
return boundaryFaceCache_[bfIdx][qpIdx]; }
435 template<
class Problem,
class ElementDiscretization,
class ElementVariables>
436 void updateElementCache_(
const Problem& problem,
437 const typename ElementDiscretization::Element& element,
438 const ElementDiscretization& elemDisc,
439 const ElementVariables& elemVars)
441 scvfCache_.resize(elemDisc.numScvf());
442 for (
const auto& scvf : scvfs(elemDisc))
445 scvfCache_[scvf.index()].resize(std::ranges::size(quadRule));
446 for (
const auto& qpData : quadRule)
447 scvfCache_[scvf.index()][qpData.ipData().qpIndex()].update(
448 problem, element, elemDisc, elemVars, qpData.ipData()
453 elementCache_.resize(std::ranges::size(elemQuadRule));
454 for (
const auto& qpData : elemQuadRule)
455 elementCache_[qpData.ipData().qpIndex()].update(problem, element, elemDisc, elemVars, qpData.ipData());
457 boundaryFaceCache_.resize(std::ranges::size(boundaryFaces(elemDisc)));
458 for (
const auto& boundaryFace : boundaryFaces(elemDisc))
460 auto& bfCache = boundaryFaceCache_[boundaryFace.index()];
462 bfCache.resize(std::ranges::size(quadRule));
463 for (
const auto& qpData : quadRule)
464 bfCache[qpData.ipData().qpIndex()].update(problem,
472 std::vector<std::vector<InterpolationPointData>> scvfCache_;
473 std::vector<InterpolationPointData> elementCache_;
474 std::vector<std::vector<InterpolationPointData>> boundaryFaceCache_;
477 const GridVariablesCache* gridVariablesCachePtr_;
478 std::vector<Variables> variables_;
479 std::shared_ptr<InterpolationPointDataCache> ipDataCache_;
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:268
void bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:296
std::conditional_t< InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition cvfe/hybrid/elementvariables.hh:257
MutableView asMutableView(GridVariablesCache &)
return a local view on variables that is always mutable, regardless of the caching policy
Definition cvfe/hybrid/elementvariables.hh:391
HybridCVFEElementVariables(const GridVariablesCache &gridVarsCache)
Constructor.
Definition cvfe/hybrid/elementvariables.hh:275
friend const InterpolationPointData & cache(const HybridCVFEElementVariables &elemVars, const IpData &ipData)
Definition cvfe/hybrid/elementvariables.hh:369
GVC GridVariablesCache
export type of the grid variables cache
Definition cvfe/hybrid/elementvariables.hh:251
void bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:319
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition cvfe/hybrid/elementvariables.hh:254
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition cvfe/hybrid/elementvariables.hh:384
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:309
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:286
typename GridVariablesCache::Variables Variables
export type of the variables
Definition cvfe/hybrid/elementvariables.hh:264
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition cvfe/hybrid/elementvariables.hh:191
void bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:182
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:105
MutableView asMutableView(GridVariablesCache &gridVars)
return a local view on variables that is always mutable, regardless of the caching policy
Definition cvfe/hybrid/elementvariables.hh:198
GVC GridVariablesCache
export type of the grid variables cache
Definition cvfe/hybrid/elementvariables.hh:88
std::conditional_t< InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition cvfe/hybrid/elementvariables.hh:94
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition cvfe/hybrid/elementvariables.hh:91
void bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:159
friend const InterpolationPointData & cache(const HybridCVFEElementVariables &elemVars, const IpData &ipData)
Definition cvfe/hybrid/elementvariables.hh:128
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:148
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:172
typename GridVariablesCache::Variables Variables
export type of the variables
Definition cvfe/hybrid/elementvariables.hh:101
HybridCVFEElementVariables(const GridVariablesCache &gridVariablesCache)
Constructor.
Definition cvfe/hybrid/elementvariables.hh:112
The (stencil) element variables class for hybrid control-volume finite element.
Definition cvfe/hybrid/elementvariables.hh:41
Base class for all standard finite volume or finite element problems.
Definition common/problem.hh:39
Type traits for problem classes.
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 cvfe/hybrid/elementvariables.hh:31
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.