version 3.11-dev
Loading...
Searching...
No Matches
cvfe/hybrid/elementvariables.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_DISCRETIZATION_HYBRID_CVFE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_HYBRID_CVFE_ELEMENT_VARIABLES_HH
14
15#include <array>
16#include <optional>
17#include <ranges>
18#include <type_traits>
19#include <utility>
20#include <vector>
21#include <memory>
22
23#include <dumux/common/concepts/ipdata_.hh>
24#include <dumux/common/concepts/localdofs_.hh>
28
30
32
40template<class GVC, bool cachingEnabled>
42
48template<class GVC>
49class HybridCVFEElementVariables<GVC, /*cachingEnabled*/true>
50{
51 class MutableVariablesView
52 {
53 public:
54 MutableVariablesView(GVC& gridCache)
55 : gridCache_(gridCache) {}
56
57 using Variables = typename GVC::Variables;
58
59 template<Dumux::Concept::LocalDof LocalDof>
60 Variables& operator [](const LocalDof& localDof) const
61 { return gridCache_.variables(localDof); }
62 private:
63 GVC& gridCache_;
64 };
65
66 class MutableVariablesViewWithIpCacheAccess
67 {
68 public:
69 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
70 : gridCache_(gridCache)
71 {}
72
73 using Variables = typename GVC::Variables;
74
75 template<Dumux::Concept::LocalDof LocalDof>
76 Variables& operator [](const LocalDof& localDof) const
77 { return gridCache_.variables(localDof); }
78
79 auto& cache(std::size_t eIdx) const
80 { return gridCache_.cache(eIdx); }
81
82 private:
83 GVC& gridCache_;
84 };
85
86public:
88 using GridVariablesCache = GVC;
89
91 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
92
94 using MutableView = std::conditional_t<
95 InterpolationPointData::isSolDependent,
96 MutableVariablesViewWithIpCacheAccess,
97 MutableVariablesView
98 >;
99
101 using Variables = typename GridVariablesCache::Variables;
102
104 template<class ElementDiscretization>
105 using DeflectionPolicy = std::conditional_t<
106 InterpolationPointData::isSolDependent,
109 >;
110
114
115 const Variables& operator [](std::size_t localDofIdx) const
116 { return gridVariablesCache().variables(eIdx_, localDofIdx); }
117
118 template<Dumux::Concept::LocalDof LocalDof>
119 const Variables& operator [](const LocalDof& localDof) const
120 { return gridVariablesCache().variables(localDof); }
121
122 template<class IpData>
123 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
124 const Variables& operator [](const IpData& ipData) const
125 { return gridVariablesCache().variables(eIdx_, ipData.localDofIndex()); }
126
127 template<Concept::ScvfQpIpData IpData>
129 const IpData& ipData)
130 { return elemVars.gridVariablesCache().scvfCache(elemVars.eIdx_, ipData.scvfIndex(), ipData.qpIndex()); }
131
132 template<Concept::BoundaryFaceQpIpData IpData>
134 const IpData& ipData)
135 { return elemVars.gridVariablesCache().boundaryFaceCache(elemVars.eIdx_, ipData.boundaryFaceIndex(), ipData.qpIndex()); }
136
137 template<Concept::QIpData IpData>
139 const IpData& ipData)
140 { return elemVars.gridVariablesCache().elementCache(elemVars.eIdx_, ipData.qpIndex()); }
141
147 template<class ElementDiscretization, class SolutionVector>
148 HybridCVFEElementVariables bind(const typename ElementDiscretization::Element& element,
149 const ElementDiscretization& elemDisc,
150 const SolutionVector& sol) &&
151 {
152 this->bindElement(element, elemDisc, sol);
153 return std::move(*this);
154 }
155
156 // For compatibility reasons with the case of not storing the variables.
157 // function to be called before assembling an element, preparing the variables within the stencil
158 template<class ElementDiscretization, class SolutionVector>
159 void bind(const typename ElementDiscretization::Element& element,
160 const ElementDiscretization& elemDisc,
161 const SolutionVector& sol) &
162 {
163 bindElement(element, elemDisc, sol);
164 }
165
171 template<class ElementDiscretization, class SolutionVector>
172 HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element& element,
173 const ElementDiscretization& elemDisc,
174 const SolutionVector& sol) &&
175 {
176 this->bindElement(element, elemDisc, sol);
177 return std::move(*this);
178 }
179
180 // function to prepare the variables within the element
181 template<class ElementDiscretization, class SolutionVector>
182 void bindElement(const typename ElementDiscretization::Element& element,
183 const ElementDiscretization& elemDisc,
184 const SolutionVector& sol) &
185 {
186 const auto& gridDiscretization = elemDisc.gridDiscretization();
187 eIdx_ = gridDiscretization.elementMapper().index(element);
188 }
189
192 { return *gridVariablesCachePtr_; }
193
199 { return { gridVars }; }
200
201private:
202 const GridVariablesCache* gridVariablesCachePtr_;
203 std::size_t eIdx_;
204};
205
210template<class GVC>
211class HybridCVFEElementVariables<GVC, /*cachingEnabled*/false>
212{
213 using ThisType = HybridCVFEElementVariables<GVC, /*cachingEnabled*/false>;
214 class MutableVariablesView
215 {
216 public:
217 MutableVariablesView(ThisType& view)
218 : view_(view) {}
219
220 using Variables = typename GVC::Variables;
221
222 template<Dumux::Concept::LocalDof LocalDof>
223 Variables& operator [](const LocalDof& localDof) const
224 { return view_[localDof]; }
225 private:
226 ThisType& view_;
227 };
228
229 class MutableVariablesViewWithIpCacheAccess
230 {
231 public:
232 MutableVariablesViewWithIpCacheAccess(ThisType& view)
233 : view_(view)
234 {}
235
236 using Variables = typename GVC::Variables;
237
238 template<Dumux::Concept::LocalDof LocalDof>
239 Variables& operator [](const LocalDof& localDof) const
240 { return view_[localDof]; }
241
242 auto& cache(std::size_t) const
243 { return *view_.ipDataCache_; }
244
245 private:
246 ThisType& view_;
247 };
248
249public:
252
254 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
255
257 using MutableView = std::conditional_t<
258 InterpolationPointData::isSolDependent,
259 MutableVariablesViewWithIpCacheAccess,
260 MutableVariablesView
261 >;
262
264 using Variables = typename GridVariablesCache::Variables;
265
267 template<class ElementDiscretization>
268 using DeflectionPolicy = std::conditional_t<
269 InterpolationPointData::isSolDependent,
272 >;
273
276 : gridVariablesCachePtr_(&gridVarsCache)
277 , ipDataCache_(std::make_shared<InterpolationPointDataCache>())
278 {}
279
285 template<class ElementDiscretization, class SolutionVector>
286 HybridCVFEElementVariables bind(const typename ElementDiscretization::Element& element,
287 const ElementDiscretization& elemDisc,
288 const SolutionVector& sol) &&
289 {
290 this->bindElement(element, elemDisc, sol);
291 return std::move(*this);
292 }
293
294 // specialization for control-volume finite element, simply forwards to the bindElement method
295 template<class ElementDiscretization, class SolutionVector>
296 void bind(const typename ElementDiscretization::Element& element,
297 const ElementDiscretization& elemDisc,
298 const SolutionVector& sol) &
299 {
300 bindElement(element, elemDisc, sol);
301 }
302
308 template<class ElementDiscretization, class SolutionVector>
309 HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element& element,
310 const ElementDiscretization& elemDisc,
311 const SolutionVector& sol) &&
312 {
313 this->bindElement(element, elemDisc, sol);
314 return std::move(*this);
315 }
316
317 // specialization for control-volume finite element
318 template<class ElementDiscretization, class SolutionVector>
319 void bindElement(const typename ElementDiscretization::Element& element,
320 const ElementDiscretization& elemDisc,
321 const SolutionVector& sol) &
322 {
323 // get the solution at the dofs of the element
324 const auto& gridDiscretization = elemDisc.gridDiscretization();
325 auto elemSol = elementSolution(element, sol, gridDiscretization);
326
327 // resize variables to the required size
328 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
329
330 // update variables related to localDofs
331 for (const auto& localDof : localDofs(elemDisc))
332 variables_[localDof.index()].update(elemSol, gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
333
334 if constexpr (InterpolationPointData::isSolDependent)
335 {
336 auto newIpDataCache = std::make_shared<InterpolationPointDataCache>(*ipDataCache_);
337 newIpDataCache->update(gridVariablesCache().problem(), element, elemDisc, variables_);
338 ipDataCache_ = std::move(newIpDataCache);
339 }
340 else
341 ipDataCache_->update(gridVariablesCache().problem(), element, elemDisc, variables_);
342 }
343
344 const Variables& operator [](std::size_t localIdx) const
345 { return variables_[localIdx]; }
346
347 Variables& operator [](std::size_t localIdx)
348 { return variables_[localIdx]; }
349
350 template<Dumux::Concept::LocalDof LocalDof>
351 const Variables& operator [](const LocalDof& localDof) const
352 { return variables_[localDof.index()]; }
353
354 template<Dumux::Concept::LocalDof LocalDof>
355 Variables& operator [](const LocalDof& localDof)
356 { return variables_[localDof.index()]; }
357
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()]; }
362
363 template<class IpData>
364 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
365 Variables& operator [](const IpData& ipData)
366 { return variables_[ipData.localDofIndex()]; }
367
368 template<Concept::ScvfQpIpData IpData>
370 const IpData& ipData)
371 { return elemVars.ipDataCache_->scvfCache(ipData.scvfIndex(), ipData.qpIndex()); }
372
373 template<Concept::BoundaryFaceQpIpData IpData>
375 const IpData& ipData)
376 { return elemVars.ipDataCache_->boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
377
378 template<Concept::QIpData IpData>
380 const IpData& ipData)
381 { return elemVars.ipDataCache_->elementCache(ipData.qpIndex()); }
382
385 { return *gridVariablesCachePtr_; }
386
392 { return { *this }; }
393
394private:
395 class InterpolationPointDataCache
396 {
397 public:
398 InterpolationPointDataCache()
399 {}
400
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)
406 {
407 updateElementCache_(problem, element, elemDisc, elemVars);
408 }
409
410 // access operator
411 const InterpolationPointData& scvfCache(std::size_t scvfIdx, std::size_t qpIdx) const
412 { return scvfCache_[scvfIdx][qpIdx]; }
413
414 // access operator
415 InterpolationPointData& scvfCache(std::size_t scvfIdx, std::size_t qpIdx)
416 { return scvfCache_[scvfIdx][qpIdx]; }
417
418 // access operator
419 const InterpolationPointData& elementCache(std::size_t qpIdx) const
420 { return elementCache_[qpIdx]; }
421
422 // access operator
423 InterpolationPointData& elementCache(std::size_t qpIdx)
424 { return elementCache_[qpIdx]; }
425
426 // access operator
427 const InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx) const
428 { return boundaryFaceCache_[bfIdx][qpIdx]; }
429
430 // access operator
431 InterpolationPointData& boundaryFaceCache(std::size_t bfIdx, std::size_t qpIdx)
432 { return boundaryFaceCache_[bfIdx][qpIdx]; }
433
434 private:
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)
440 {
441 scvfCache_.resize(elemDisc.numScvf());
442 for (const auto& scvf : scvfs(elemDisc))
443 {
444 const auto quadRule = Dumux::CVFE::quadratureRule(elemDisc, scvf);
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()
449 );
450 }
451
452 const auto elemQuadRule = Dumux::CVFE::quadratureRule(elemDisc, element);
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());
456
457 boundaryFaceCache_.resize(std::ranges::size(boundaryFaces(elemDisc)));
458 for (const auto& boundaryFace : boundaryFaces(elemDisc))
459 {
460 auto& bfCache = boundaryFaceCache_[boundaryFace.index()];
461 const auto quadRule = Dumux::CVFE::quadratureRule(elemDisc, boundaryFace);
462 bfCache.resize(std::ranges::size(quadRule));
463 for (const auto& qpData : quadRule)
464 bfCache[qpData.ipData().qpIndex()].update(problem,
465 element,
466 elemDisc,
467 elemVars,
468 qpData.ipData());
469 }
470 }
471
472 std::vector<std::vector<InterpolationPointData>> scvfCache_;
473 std::vector<InterpolationPointData> elementCache_;
474 std::vector<std::vector<InterpolationPointData>> boundaryFaceCache_;
475 };
476
477 const GridVariablesCache* gridVariablesCachePtr_;
478 std::vector<Variables> variables_;
479 std::shared_ptr<InterpolationPointDataCache> ipDataCache_;
480};
481
482} // end namespace Dumux::Experimental::CVFE
483
484#endif
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.