3.2-git
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
multidomain/facet/cellcentered/tpfa/darcyslaw.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 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
24#ifndef DUMUX_DISCRETIZATION_CC_TPFA_FACET_COUPLING_DARCYS_LAW_HH
25#define DUMUX_DISCRETIZATION_CC_TPFA_FACET_COUPLING_DARCYS_LAW_HH
26
27#include <array>
28#include <cmath>
29
30#include <dune/common/float_cmp.hh>
31
32#include <dumux/common/math.hh>
35
39
40namespace Dumux {
41
43template<class ScalarType, class GridGeometry, bool isNetwork>
45
52template<class AdvectionType, class GridGeometry, bool isNetwork>
54
61template<class ScalarType, class GridGeometry>
63 CCTpfaFacetCouplingDarcysLawImpl< ScalarType, GridGeometry, ( int(GridGeometry::GridView::dimension) <
64 int(GridGeometry::GridView::dimensionworld) ) >;
65
70template<class AdvectionType, class GridGeometry>
71class CCTpfaFacetCouplingDarcysLawCache<AdvectionType, GridGeometry, /*isNetwork*/false>
72{
73 using Scalar = typename AdvectionType::Scalar;
74 using FVElementGeometry = typename GridGeometry::LocalView;
75 using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
76 using Element = typename GridGeometry::GridView::template Codim<0>::Entity;
77
78public:
81
85 static constexpr int insideTijIdx = 0;
86 static constexpr int outsideTijIdx = 1;
87 static constexpr int facetTijIdx = 2;
88
90 using AdvectionTransmissibilityContainer = std::array<Scalar, 3>;
91
93 using GravityCoefficients = std::array<Scalar, 2>;
94
96 template< class Problem, class ElementVolumeVariables >
97 void updateAdvection(const Problem& problem,
98 const Element& element,
99 const FVElementGeometry& fvGeometry,
100 const ElementVolumeVariables& elemVolVars,
101 const SubControlVolumeFace &scvf)
102 {
103 tij_ = AdvectionType::calculateTransmissibility(problem, element, fvGeometry, elemVolVars, scvf, g_);
104 }
105
110 Scalar advectionTij() const
111 { return tij_[insideTijIdx]; }
112
114 Scalar advectionTijInside() const
115 { return tij_[insideTijIdx]; }
116
118 Scalar advectionTijOutside() const
119 { return tij_[outsideTijIdx]; }
120
122 Scalar advectionTijFacet() const
123 { return tij_[facetTijIdx]; }
124
127 { return g_; }
128
129private:
130 std::array<Scalar, 3> tij_;
131 GravityCoefficients g_;
132};
133
138template<class ScalarType, class GridGeometry>
139class CCTpfaFacetCouplingDarcysLawImpl<ScalarType, GridGeometry, /*isNetwork*/false>
140{
143
144 using FVElementGeometry = typename GridGeometry::LocalView;
145 using SubControlVolume = typename GridGeometry::SubControlVolume;
146 using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
147
148 using GridView = typename GridGeometry::GridView;
149 using Element = typename GridView::template Codim<0>::Entity;
150 using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
151
152 public:
154 using Scalar = ScalarType;
158 using Cache = CCTpfaFacetCouplingDarcysLawCache<ThisType, GridGeometry, /*isNetwork*/false>;
160 using TijContainer = typename Cache::AdvectionTransmissibilityContainer;
161
162
164 template< class Problem, class ElementVolumeVariables, class ElementFluxVarsCache >
165 static Scalar flux(const Problem& problem,
166 const Element& element,
167 const FVElementGeometry& fvGeometry,
168 const ElementVolumeVariables& elemVolVars,
169 const SubControlVolumeFace& scvf,
170 int phaseIdx,
171 const ElementFluxVarsCache& elemFluxVarsCache)
172 {
173 if (!problem.couplingManager().isOnInteriorBoundary(element, scvf))
174 return TpfaDarcysLaw::flux(problem, element, fvGeometry, elemVolVars, scvf, phaseIdx, elemFluxVarsCache);
175
176 // Obtain inside and fracture pressures
177 const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()];
178 const auto& facetVolVars = problem.couplingManager().getLowDimVolVars(element, scvf);
179 const auto pInside = insideVolVars.pressure(phaseIdx);
180 const auto pFacet = facetVolVars.pressure(phaseIdx);
181
182 // compute and return flux
183 const auto& fluxVarsCache = elemFluxVarsCache[scvf];
184 Scalar flux = fluxVarsCache.advectionTijInside()*pInside + fluxVarsCache.advectionTijFacet()*pFacet;
185
186 // maybe add gravitational acceleration
187 static const Scalar gravity = getParamFromGroup<bool>(problem.paramGroup(), "Problem.EnableGravity");
188 if (gravity)
189 {
190 // compute alpha := n^T*K*g and add to flux (use arithmetic mean for density)
191 const auto& g = problem.spatialParams().gravity(scvf.ipGlobal());
192 const auto rho = 0.5*(insideVolVars.density(phaseIdx) + facetVolVars.density(phaseIdx));
193 const auto rhoTimesArea = rho*scvf.area();
194 const auto alpha_inside = rhoTimesArea*insideVolVars.extrusionFactor()
195 *vtmv(scvf.unitOuterNormal(), insideVolVars.permeability(), g);
196
197 flux += alpha_inside;
198 if (!scvf.boundary())
199 {
200 const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
201
202 // add further gravitational contributions
203 if ( problem.interiorBoundaryTypes(element, scvf).hasOnlyNeumann() )
204 {
205 static const Scalar xi = getParamFromGroup<Scalar>(problem.paramGroup(), "FacetCoupling.Xi", 1.0);
206 const auto alpha_facet = rhoTimesArea*insideVolVars.extrusionFactor()
207 *vtmv(scvf.unitOuterNormal(), facetVolVars.permeability(), g);
208 const auto alpha_outside = rhoTimesArea*outsideVolVars.extrusionFactor()
209 *vtmv(scvf.unitOuterNormal(), outsideVolVars.permeability(), g);
210
211 flux -= fluxVarsCache.gravityCoefficients()[0]*(xi*alpha_inside - alpha_facet + (1.0 - xi)*alpha_outside);
212 flux += fluxVarsCache.gravityCoefficients()[1]*(xi*alpha_outside - alpha_facet + (1.0 - xi)*alpha_inside);
213 }
214
215 // add outside contribution
216 flux += fluxVarsCache.advectionTijOutside()*outsideVolVars.pressure(phaseIdx);
217 }
218
219 return flux;
220 }
221 else
222 return scvf.boundary() ? flux
223 : flux + fluxVarsCache.advectionTijOutside()*elemVolVars[scvf.outsideScvIdx()].pressure(phaseIdx);
224 }
225
226 // The flux variables cache has to be bound to an element prior to flux calculations
227 // During the binding, the transmissibility will be computed and stored using the method below.
228 template< class Problem, class ElementVolumeVariables >
229 static TijContainer calculateTransmissibility(const Problem& problem,
230 const Element& element,
231 const FVElementGeometry& fvGeometry,
232 const ElementVolumeVariables& elemVolVars,
233 const SubControlVolumeFace& scvf)
234 {
235 typename Cache::GravityCoefficients g;
236 return calculateTransmissibility(problem, element, fvGeometry, elemVolVars, scvf, g);
237 }
238
239 // This overload additionally receives a container in which the coefficients required
240 // for the computation of the gravitational acceleration ar the scvf are stored
241 template< class Problem, class ElementVolumeVariables >
242 static TijContainer calculateTransmissibility(const Problem& problem,
243 const Element& element,
244 const FVElementGeometry& fvGeometry,
245 const ElementVolumeVariables& elemVolVars,
246 const SubControlVolumeFace& scvf,
247 typename Cache::GravityCoefficients& g)
248 {
249 TijContainer tij;
250 if (!problem.couplingManager().isCoupled(element, scvf))
251 {
253 tij[Cache::insideTijIdx] = TpfaDarcysLaw::calculateTransmissibility(problem, element, fvGeometry, elemVolVars, scvf);
254 return tij;
255 }
256
258 static const Scalar xi = getParamFromGroup<Scalar>(problem.paramGroup(), "FacetCoupling.Xi", 1.0);
259
260 const auto insideScvIdx = scvf.insideScvIdx();
261 const auto& insideScv = fvGeometry.scv(insideScvIdx);
262 const auto& insideVolVars = elemVolVars[insideScvIdx];
263 const auto wIn = scvf.area()*computeTpfaTransmissibility(scvf,
264 insideScv,
265 insideVolVars.permeability(),
266 insideVolVars.extrusionFactor());
267
268 // proceed depending on the interior BC types used
269 const auto iBcTypes = problem.interiorBoundaryTypes(element, scvf);
270
271 // neumann-coupling
272 if (iBcTypes.hasOnlyNeumann())
273 {
274 const auto& facetVolVars = problem.couplingManager().getLowDimVolVars(element, scvf);
275 const auto wFacet = 2.0*scvf.area()*insideVolVars.extrusionFactor()
276 /facetVolVars.extrusionFactor()
277 *vtmv(scvf.unitOuterNormal(), facetVolVars.permeability(), scvf.unitOuterNormal());
278
279 // The fluxes across this face and the outside face can be expressed in matrix form:
280 // \f$\mathbf{C} \bar{\mathbf{u}} + \mathbf{D} \mathbf{u} + \mathbf{E} \mathbf{u}_\gamma\f$,
281 // where \f$\gamma$\f denotes the domain living on the facets and \f$\bar{\mathbf{u}}$\f are
282 // intermediate face unknowns in the matrix domain. Equivalently, flux continuity reads:
283 // \f$\mathbf{A} \bar{\mathbf{u}} = \mathbf{B} \mathbf{u} + \mathbf{M} \mathbf{u}_\gamma\f$.
284 // Combining the two, we can eliminate the intermediate unknowns and compute the transmissibilities
285 // that allow the description of the fluxes as functions of the cell and Dirichlet pressures only.
286 if (!scvf.boundary())
287 {
288 const auto outsideScvIdx = scvf.outsideScvIdx();
289 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
290 const auto wOut = -1.0*scvf.area()*computeTpfaTransmissibility(scvf,
291 fvGeometry.scv(outsideScvIdx),
292 outsideVolVars.permeability(),
293 outsideVolVars.extrusionFactor());
294
295 if ( !Dune::FloatCmp::eq(xi, 1.0, 1e-6) )
296 {
297 // The gravity coefficients are the first row of the inverse of the A matrix in the local eq system
298 // multiplied with wIn. Note that we never compute the inverse but use an optimized implementation below.
299 // The A matrix has the following coefficients:
300 // A = | xi*wIn + wFacet, (xi - 1.0)*wOut | -> AInv = 1/detA | xi*wOut + wFacet, -(xi - 1.0)*wOut |
301 // | wIn*(xi - 1.0) , xi*wOut + wFacet | | -wIn*(xi - 1.0) , xi*wIn + wFacet |
302 const Scalar xiMinusOne = (xi - 1.0);
303 const Scalar a01 = xiMinusOne*wOut;
304 const Scalar a11 = xi*wOut + wFacet;
305 const Scalar detA = (xi*wIn + wFacet)*a11 - xiMinusOne*wIn*a01;
306 g[0] = wIn*a11/detA; g[1] = -wIn*a01/detA;
307
308 // optimized implementation: factorization obtained using sympy
309 const Scalar factor = wIn * wFacet / ( wIn * wOut * ( 2.0 * xi - 1.0 ) + wFacet * ( xi * ( wIn + wOut ) + wFacet ) );
310 tij[Cache::insideTijIdx] = factor * ( wOut * xi + wFacet );
311 tij[Cache::outsideTijIdx] = factor * ( wOut * ( 1.0 - xi ) );
312 tij[Cache::facetTijIdx] = factor * ( - wOut - wFacet );
313 }
314 else
315 {
316 g[0] = wIn/(wIn+wFacet); g[1] = 0.0;
317 tij[Cache::insideTijIdx] = wFacet*g[0];
318 tij[Cache::facetTijIdx] = -tij[Cache::insideTijIdx];
319 tij[Cache::outsideTijIdx] = 0.0;
320 }
321 }
322 else
323 {
324 // TODO: check for division by zero??
325 tij[Cache::insideTijIdx] = wFacet*wIn/(wIn+wFacet);
326 tij[Cache::facetTijIdx] = -tij[Cache::insideTijIdx];
327 tij[Cache::outsideTijIdx] = 0.0;
328 }
329 }
330 else if (iBcTypes.hasOnlyDirichlet())
331 {
332 tij[Cache::insideTijIdx] = wIn;
333 tij[Cache::outsideTijIdx] = 0.0;
334 tij[Cache::facetTijIdx] = -wIn;
335 }
336 else
337 DUNE_THROW(Dune::NotImplemented, "Interior boundary types other than pure Dirichlet or Neumann");
338
339 return tij;
340 }
341};
342
347template<class AdvectionType, class GridGeometry>
348class CCTpfaFacetCouplingDarcysLawCache<AdvectionType, GridGeometry, /*isNetwork*/true>
349{
350 using Scalar = typename AdvectionType::Scalar;
351 using FVElementGeometry = typename GridGeometry::LocalView;
352 using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
353 using Element = typename GridGeometry::GridView::template Codim<0>::Entity;
354
355public:
358
362 static constexpr int insideTijIdx = 0;
363 static constexpr int facetTijIdx = 1;
364
366 using AdvectionTransmissibilityContainer = std::array<Scalar, 2>;
367
369 template< class Problem, class ElementVolumeVariables >
370 void updateAdvection(const Problem& problem,
371 const Element& element,
372 const FVElementGeometry& fvGeometry,
373 const ElementVolumeVariables& elemVolVars,
374 const SubControlVolumeFace &scvf)
375 {
376 tij_ = AdvectionType::calculateTransmissibility(problem, element, fvGeometry, elemVolVars, scvf);
377 }
378
383 Scalar advectionTij() const
384 { return tij_[insideTijIdx]; }
385
387 Scalar advectionTijInside() const
388 { return tij_[insideTijIdx]; }
389
391 Scalar advectionTijFacet() const
392 { return tij_[facetTijIdx]; }
393
394private:
395 AdvectionTransmissibilityContainer tij_;
396};
397
402template<class ScalarType, class GridGeometry>
403class CCTpfaFacetCouplingDarcysLawImpl<ScalarType, GridGeometry, /*isNetwork*/true>
404{
407
408 using FVElementGeometry = typename GridGeometry::LocalView;
409 using SubControlVolume = typename GridGeometry::SubControlVolume;
410 using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
411
412 using GridView = typename GridGeometry::GridView;
413 using Element = typename GridView::template Codim<0>::Entity;
414 using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
415
416 public:
418 using Scalar = ScalarType;
422 using Cache = CCTpfaFacetCouplingDarcysLawCache<ThisType, GridGeometry, /*isNetwork*/true>;
424 using TijContainer = typename Cache::AdvectionTransmissibilityContainer;
425
427 template< class Problem, class ElementVolumeVariables, class ElementFluxVarsCache >
428 static Scalar flux(const Problem& problem,
429 const Element& element,
430 const FVElementGeometry& fvGeometry,
431 const ElementVolumeVariables& elemVolVars,
432 const SubControlVolumeFace& scvf,
433 int phaseIdx,
434 const ElementFluxVarsCache& elemFluxVarsCache)
435 {
436 static const Scalar gravity = getParamFromGroup<bool>(problem.paramGroup(), "Problem.EnableGravity");
437 if (gravity)
438 DUNE_THROW(Dune::NotImplemented, "Gravity for darcys law with facet coupling on surface grids");
439
440 if (!problem.couplingManager().isOnInteriorBoundary(element, scvf))
441 return TpfaDarcysLaw::flux(problem, element, fvGeometry, elemVolVars, scvf, phaseIdx, elemFluxVarsCache);
442
443 // Obtain inside and fracture pressures
444 const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()];
445 const auto pInside = insideVolVars.pressure(phaseIdx);
446 const auto pFacet = problem.couplingManager().getLowDimVolVars(element, scvf).pressure(phaseIdx);
447
448 // return flux
449 const auto& fluxVarsCache = elemFluxVarsCache[scvf];
450 if (scvf.boundary())
451 return fluxVarsCache.advectionTijInside()*pInside + fluxVarsCache.advectionTijFacet()*pFacet;
452 else
453 return fluxVarsCache.advectionTijInside()*pInside + fluxVarsCache.advectionTijFacet()*pFacet;
454 }
455
456 // The flux variables cache has to be bound to an element prior to flux calculations
457 // During the binding, the transmissibility will be computed and stored using the method below.
458 template< class Problem, class ElementVolumeVariables >
459 static TijContainer calculateTransmissibility(const Problem& problem,
460 const Element& element,
461 const FVElementGeometry& fvGeometry,
462 const ElementVolumeVariables& elemVolVars,
463 const SubControlVolumeFace& scvf)
464 {
465 TijContainer tij;
466 if (!problem.couplingManager().isCoupled(element, scvf))
467 {
469 tij[Cache::insideTijIdx] = TpfaDarcysLaw::calculateTransmissibility(problem, element, fvGeometry, elemVolVars, scvf);
470 return tij;
471 }
472
474 static const Scalar xi = getParamFromGroup<Scalar>(problem.paramGroup(), "FacetCoupling.Xi", 1.0);
475
476 // On surface grids only xi = 1.0 can be used, as the coupling condition
477 // for xi != 1.0 does not generalize for surface grids where the normal
478 // vectors of the inside/outside elements have different orientations.
479 if (Dune::FloatCmp::ne(xi, 1.0, 1e-6))
480 DUNE_THROW(Dune::InvalidStateException, "Xi != 1.0 cannot be used on surface grids");
481
482 const auto area = scvf.area();
483 const auto insideScvIdx = scvf.insideScvIdx();
484 const auto& insideScv = fvGeometry.scv(insideScvIdx);
485 const auto& insideVolVars = elemVolVars[insideScvIdx];
486 const auto wIn = area*computeTpfaTransmissibility(scvf, insideScv, insideVolVars.permeability(), insideVolVars.extrusionFactor());
487
488 // proceed depending on the interior BC types used
489 const auto iBcTypes = problem.interiorBoundaryTypes(element, scvf);
490
491 // neumann-coupling
492 if (iBcTypes.hasOnlyNeumann())
493 {
494 const auto& facetVolVars = problem.couplingManager().getLowDimVolVars(element, scvf);
495
496 // Here we use the square root of the facet extrusion factor
497 // as an approximate average distance from scvf ip to facet center
498 using std::sqrt;
499 const auto wFacet = 2.0*area*insideVolVars.extrusionFactor()
500 /sqrt(facetVolVars.extrusionFactor())
501 *vtmv(scvf.unitOuterNormal(), facetVolVars.permeability(), scvf.unitOuterNormal());
502
503 // TODO: check for division by zero??
504 tij[Cache::insideTijIdx] = wFacet*wIn/(wIn+wFacet);
505 tij[Cache::facetTijIdx] = -tij[Cache::insideTijIdx];
506 }
507 else if (iBcTypes.hasOnlyDirichlet())
508 {
509 tij[Cache::insideTijIdx] = wIn;
510 tij[Cache::facetTijIdx] = -wIn;
511 }
512 else
513 DUNE_THROW(Dune::NotImplemented, "Interior boundary types other than pure Dirichlet or Neumann");
514
515 return tij;
516 }
517};
518
519} // end namespace Dumux
520
521#endif
Define some often used mathematical functions.
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.
The available discretization methods in Dumux.
DiscretizationMethod
The available discretization methods in Dumux.
Definition: method.hh:37
Tensor::field_type computeTpfaTransmissibility(const SubControlVolumeFace &scvf, const SubControlVolume &scv, const Tensor &T, typename SubControlVolume::Traits::Scalar extrusionFactor)
Free function to evaluate the Tpfa transmissibility associated with the flux (in the form of flux = T...
Definition: tpfa/computetransmissibility.hh:47
Dune::DenseMatrix< MAT >::value_type vtmv(const Dune::DenseVector< V1 > &v1, const Dune::DenseMatrix< MAT > &M, const Dune::DenseVector< V2 > &v2)
Evaluates the scalar product of a vector v2, projected by a matrix M, with a vector v1.
Definition: math.hh:840
Definition: adapt.hh:29
Class that fills the cache corresponding to tpfa Darcy's Law.
Definition: flux/cctpfa/darcyslaw.hh:69
Specialization of the CCTpfaDarcysLaw grids where dim=dimWorld.
Definition: flux/cctpfa/darcyslaw.hh:129
Specialization of the CCTpfaDarcysLaw grids where dim < dimWorld (network/surface grids)
Definition: flux/cctpfa/darcyslaw.hh:283
Forward declaration of the implementation.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:44
The cache corresponding to tpfa Darcy's Law with facet coupling.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:53
const GravityCoefficients & gravityCoefficients() const
return the coefficients for the computation of gravity at the scvf
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:126
std::array< Scalar, 3 > AdvectionTransmissibilityContainer
Export transmissibility storage type.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:90
Scalar advectionTijInside() const
returns the transmissibility associated with the inside cell
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:114
std::array< Scalar, 2 > GravityCoefficients
Export the type used for the gravity coefficients.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:93
void updateAdvection(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf)
update subject to a given problem
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:97
Scalar advectionTijOutside() const
returns the transmissibility associated with the outside cell
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:118
Scalar advectionTijFacet() const
returns the transmissibility associated with the outside cell
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:122
Scalar advectionTij() const
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:110
Specialization of CCTpfaFacetCouplingDarcysLawImpl for dim=dimWorld.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:140
static Scalar flux(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf, int phaseIdx, const ElementFluxVarsCache &elemFluxVarsCache)
Compute the advective flux.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:165
ScalarType Scalar
state the scalar type of the law
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:154
static TijContainer calculateTransmissibility(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf)
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:229
static TijContainer calculateTransmissibility(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf, typename Cache::GravityCoefficients &g)
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:242
typename Cache::AdvectionTransmissibilityContainer TijContainer
export the type used to store transmissibilities
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:160
std::array< Scalar, 2 > AdvectionTransmissibilityContainer
Export transmissibility storage type.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:366
Scalar advectionTij() const
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:383
Scalar advectionTijInside() const
returns the transmissibility associated with the inside cell
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:387
void updateAdvection(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf)
update subject to a given problem
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:370
Scalar advectionTijFacet() const
returns the transmissibility associated with the outside cell
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:391
Specialization of CCTpfaFacetCouplingDarcysLawImpl for dim<dimWorld.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:404
static TijContainer calculateTransmissibility(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf)
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:459
typename Cache::AdvectionTransmissibilityContainer TijContainer
export the type used to store transmissibilities
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:424
ScalarType Scalar
state the scalar type of the law
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:418
static Scalar flux(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf, int phaseIdx, const ElementFluxVarsCache &elemFluxVarsCache)
Compute the advective flux.
Definition: multidomain/facet/cellcentered/tpfa/darcyslaw.hh:428
Declares all properties used in Dumux.
Free functions to evaluate the transmissibilities associated with flux evaluations across sub-control...
Darcy's law for cell-centered finite volume schemes with two-point flux approximation.