12#ifndef DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_FE_ELEMENT_VARIABLES_HH
22#include <dumux/common/concepts/ipdata_.hh>
23#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.gridVariablesCache().boundaryFaceCache(elemVars.eIdx_, ipData.boundaryFaceIndex(), ipData.qpIndex()); }
131 template<Concept::QIpData IpData>
133 const IpData& ipData)
134 {
return elemVars.gridVariablesCache().elementCache(elemVars.eIdx_, 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) &
180 const auto& gridDiscretization = Deprecated::gridGeometry(elemDisc);
181 eIdx_ = gridDiscretization.elementMapper().index(element);
186 {
return *gridVariablesCachePtr_; }
193 {
return { gridVars }; }
196 const GridVariablesCache* gridVariablesCachePtr_;
208 using GridDiscretization = std::decay_t<decltype(std::declval<GVC>().problem().gridDiscretization())>;
209 using GridView =
typename GridDiscretization::GridView;
212 static constexpr std::size_t maxNumBoundaryFaces = GridView::dimension << 1;
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_; }
255 GridVariablesCache::InterpolationPointData::isSolDependent,
256 MutableVariablesViewWithIpCacheAccess,
261 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>
286 FEElementVariables bind(
const typename ElementDiscretization::GridDiscretization::GridView::template Codim<0>::Entity& element,
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::GridDiscretization::GridView::template Codim<0>::Entity& 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::GridDiscretization::GridView::template Codim<0>::Entity& element,
320 const ElementDiscretization& elemDisc,
321 const SolutionVector& sol) &
324 auto elemSol =
elementSolution(element, sol, elemDisc.gridDiscretization());
327 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
330 for (
const auto& localDof :
localDofs(elemDisc))
331 variables_[localDof.index()].update(elemSol,
gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
333 if constexpr (InterpolationPointData::isSolDependent)
335 auto newIpDataCache = std::make_shared<InterpolationPointDataCache>(*ipDataCache_);
336 newIpDataCache->update(
gridVariablesCache().problem(), element, elemDisc, variables_);
337 ipDataCache_ = std::move(newIpDataCache);
342 const Variables& operator [](std::size_t localIdx)
const
343 {
return variables_[localIdx]; }
346 {
return variables_[localIdx]; }
348 template<Dumux::Concept::LocalDof LocalDof>
349 const Variables& operator [](
const LocalDof& localDof)
const
350 {
return variables_[localDof.index()]; }
352 template<Dumux::Concept::LocalDof LocalDof>
354 {
return variables_[localDof.index()]; }
356 template<
class IpData>
357 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
358 const Variables& operator [](
const IpData& ipData)
const
359 {
return variables_[ipData.localDofIndex()]; }
361 template<
class IpData>
362 requires requires (
const IpData& ipData) { ipData.localDofIndex(); }
364 {
return variables_[ipData.localDofIndex()]; }
366 template<Concept::BoundaryFaceQpIpData IpData>
368 const IpData& ipData)
369 {
return elemVars.ipDataCache_->boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
371 template<Concept::QIpData IpData>
373 const IpData& ipData)
374 {
return elemVars.ipDataCache_->elementCache(ipData.qpIndex()); }
378 {
return *gridVariablesCachePtr_; }
385 {
return { *
this }; }
388 class InterpolationPointDataCache
391 InterpolationPointDataCache()
394 template<
class Problem,
class ElementDiscretization,
class ElementVariables>
395 void update(
const Problem& problem,
396 const typename ElementDiscretization::Element& element,
397 const ElementDiscretization& elemDisc,
398 const ElementVariables& elemVars)
400 updateElementCache_(problem, element, elemDisc, elemVars);
404 const InterpolationPointData& elementCache(std::size_t qpIdx)
const
405 {
return elementCache_[qpIdx]; }
408 InterpolationPointData& elementCache(std::size_t qpIdx)
409 {
return elementCache_[qpIdx]; }
412 const InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
const
413 {
return boundaryFaceCache_[bfIdx][qpIdx]; }
416 InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
417 {
return boundaryFaceCache_[bfIdx][qpIdx]; }
420 template<
class Problem,
class ElementDiscretization,
class ElementVariables>
421 void updateElementCache_(
const Problem& problem,
422 const typename ElementDiscretization::Element& element,
423 const ElementDiscretization& elemDisc,
424 const ElementVariables& elemVars)
427 elementCache_.resize(std::ranges::size(elemQuadRule));
428 for (
const auto& qpData : elemQuadRule)
429 elementCache_[qpData.ipData().qpIndex()].update(problem, element, elemDisc, elemVars, qpData.ipData());
431 for (
const auto& boundaryFace : boundaryFaces(elemDisc))
433 auto& bfCache = boundaryFaceCache_[boundaryFace.index()];
435 bfCache.resize(std::ranges::size(quadRule));
436 for (
const auto& qpData : quadRule)
437 bfCache[qpData.ipData().qpIndex()].update(problem,
445 std::vector<InterpolationPointData> elementCache_;
446 std::array<std::vector<InterpolationPointData>, maxNumBoundaryFaces> boundaryFaceCache_;
449 const GridVariablesCache* gridVariablesCachePtr_;
450 std::vector<Variables> variables_;
451 std::shared_ptr<InterpolationPointDataCache> ipDataCache_;
Definition variablesdeflectionpolicy.hh:29
Definition variablesdeflectionpolicy.hh:95
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition fem/elementvariables.hh:264
FEElementVariables(const GridVariablesCache &gridVarsCache)
Constructor.
Definition fem/elementvariables.hh:275
void bind(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:296
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:286
std::conditional_t< GridVariablesCache::InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition fem/elementvariables.hh:254
typename GridVariablesCache::Variables Variables
export type of the variables
Definition fem/elementvariables.hh:261
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:268
void bindElement(const typename ElementDiscretization::GridDiscretization::GridView::template Codim< 0 >::Entity &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition fem/elementvariables.hh:319
friend const InterpolationPointData & cache(const FEElementVariables &elemVars, const IpData &ipData)
Definition fem/elementvariables.hh:367
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:309
GVC GridVariablesCache
export type of the grid variables
Definition fem/elementvariables.hh:251
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:377
MutableView asMutableView(GridVariablesCache &)
return a local view on variables that is always mutable, regardless of the caching policy
Definition fem/elementvariables.hh:384
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:192
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition fem/elementvariables.hh:185
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
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
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:159
Definition assembly/assembler.hh:44
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.