329 static Scalar flux(const Problem& problem,
330 const Element& element,
331 const FVElementGeometry& fvGeometry,
332 const ElementVolumeVariables& elemVolVars,
333 const SubControlVolumeFace& scvf,
335 const ElementFluxVarsCache& elemFluxVarsCache)
337 static const bool gravity = getParamFromGroup<bool>(problem.paramGroup(), "Problem.EnableGravity");
339 const auto& fluxVarsCache = elemFluxVarsCache[scvf];
342 const auto& insideScv = fvGeometry.scv(scvf.insideScvIdx());
343 const auto& insideVolVars = elemVolVars[insideScv];
344 const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
349 const auto rho = [&]()
353 return outsideVolVars.density(phaseIdx);
356 else if (scvf.numOutsideScvs() == 1)
357 return (insideVolVars.density(phaseIdx) + outsideVolVars.density(phaseIdx))*0.5;
362 Scalar rho(insideVolVars.density(phaseIdx));
363 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
365 const auto outsideScvIdx = scvf.outsideScvIdx(i);
366 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
367 rho += outsideVolVars.density(phaseIdx);
369 return rho/(scvf.numOutsideScvs()+1);
373 const auto& tij = fluxVarsCache.advectionTij();
374 const auto& g = problem.spatialParams().gravity(scvf.ipGlobal());
377 const auto pInside = insideVolVars.pressure(phaseIdx);
378 const auto pOutside = [&]()
381 if (scvf.numOutsideScvs() == 1)
382 return outsideVolVars.pressure(phaseIdx);
388 Scalar sumPTi(tij*pInside);
391 sumPTi += rho*Extrusion::area(scvf)
392 *insideVolVars.extrusionFactor()
393 *vtmv(scvf.unitOuterNormal(), insideVolVars.permeability(), g);
395 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
397 const auto outsideScvIdx = scvf.outsideScvIdx(i);
398 const auto& flippedScvf = fvGeometry.flipScvf(scvf.index(), i);
399 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
400 const auto& outsideFluxVarsCache = elemFluxVarsCache[flippedScvf];
401 sumTi += outsideFluxVarsCache.advectionTij();
402 sumPTi += outsideFluxVarsCache.advectionTij()*outsideVolVars.pressure(phaseIdx);
405 sumPTi += rho*Extrusion::area(scvf)
406 *outsideVolVars.extrusionFactor()
407 *vtmv(flippedScvf.unitOuterNormal(), outsideVolVars.permeability(), g);
414 const auto alpha_inside = vtmv(scvf.unitOuterNormal(), insideVolVars.permeability(), g)*insideVolVars.extrusionFactor();
416 Scalar flux = tij*(pInside - pOutside) + Extrusion::area(scvf)*rho*alpha_inside;
419 if (!scvf.boundary() && scvf.numOutsideScvs() == 1)
421 const auto& outsideScv = fvGeometry.scv(scvf.outsideScvIdx());
422 const auto& outsideScvf = fvGeometry.flipScvf(scvf.index());
423 const auto outsideK = outsideVolVars.permeability();
424 const auto outsideTi = computeTpfaTransmissibility(outsideScvf, outsideScv, outsideK, outsideVolVars.extrusionFactor());
425 const auto alpha_outside = vtmv(outsideScvf.unitOuterNormal(), outsideK, g)*outsideVolVars.extrusionFactor();
427 flux -= rho*tij/outsideTi*(alpha_inside + alpha_outside);
435 const auto pInside = insideVolVars.pressure(phaseIdx);
436 const auto pOutside = [&]()
439 if (scvf.numOutsideScvs() <= 1)
440 return outsideVolVars.pressure(phaseIdx);
445 const auto& insideFluxVarsCache = elemFluxVarsCache[scvf];
446 Scalar sumTi(insideFluxVarsCache.advectionTij());
447 Scalar sumPTi(insideFluxVarsCache.advectionTij()*pInside);
449 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
451 const auto outsideScvIdx = scvf.outsideScvIdx(i);
452 const auto& flippedScvf = fvGeometry.flipScvf(scvf.index(), i);
453 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
454 const auto& outsideFluxVarsCache = elemFluxVarsCache[flippedScvf];
455 sumTi += outsideFluxVarsCache.advectionTij();
456 sumPTi += outsideFluxVarsCache.advectionTij()*outsideVolVars.pressure(phaseIdx);
463 return fluxVarsCache.advectionTij()*(pInside - pOutside);
470 static Scalar calculateTransmissibility(const Problem& problem,
471 const Element& element,
472 const FVElementGeometry& fvGeometry,
473 const ElementVolumeVariables& elemVolVars,
474 const SubControlVolumeFace& scvf)
478 const auto insideScvIdx = scvf.insideScvIdx();
479 const auto& insideScv = fvGeometry.scv(insideScvIdx);
480 const auto& insideVolVars = elemVolVars[insideScvIdx];
482 const Scalar ti = computeTpfaTransmissibility(scvf, insideScv,
483 getPermeability_(problem, insideVolVars, scvf.ipGlobal()),
484 insideVolVars.extrusionFactor());
487 if (scvf.boundary() || scvf.numOutsideScvs() > 1)
488 tij = Extrusion::area(scvf)*ti;
493 const auto outsideScvIdx = scvf.outsideScvIdx();
496 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
497 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
498 const Scalar tj = computeTpfaTransmissibility(fvGeometry.flipScvf(scvf.index()), outsideScv,
499 getPermeability_(problem, outsideVolVars, scvf.ipGlobal()),
500 outsideVolVars.extrusionFactor());
507 tij = Extrusion::area(scvf)*(ti * tj)/(ti + tj);