331 static Scalar flux(const Problem& problem,
332 const Element& element,
333 const FVElementGeometry& fvGeometry,
334 const ElementVolumeVariables& elemVolVars,
335 const SubControlVolumeFace& scvf,
337 const ElementFluxVarsCache& elemFluxVarsCache)
339 static const bool gravity = getParamFromGroup<bool>(problem.paramGroup(), "Problem.EnableGravity");
341 const auto& fluxVarsCache = elemFluxVarsCache[scvf];
344 const auto& insideScv = fvGeometry.scv(scvf.insideScvIdx());
345 const auto& insideVolVars = elemVolVars[insideScv];
346 const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
351 const auto rho = [&]()
355 return outsideVolVars.density(phaseIdx);
358 else if (scvf.numOutsideScvs() == 1)
359 return (insideVolVars.density(phaseIdx) + outsideVolVars.density(phaseIdx))*0.5;
364 Scalar rho(insideVolVars.density(phaseIdx));
365 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
367 const auto outsideScvIdx = scvf.outsideScvIdx(i);
368 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
369 rho += outsideVolVars.density(phaseIdx);
371 return rho/(scvf.numOutsideScvs()+1);
375 const auto& tij = fluxVarsCache.advectionTij();
376 const auto& g = problem.spatialParams().gravity(scvf.ipGlobal());
379 const auto pInside = insideVolVars.pressure(phaseIdx);
380 const auto pOutside = [&]()
383 if (scvf.numOutsideScvs() == 1)
384 return outsideVolVars.pressure(phaseIdx);
390 Scalar sumPTi(tij*pInside);
393 sumPTi += rho*Extrusion::area(scvf)
394 *insideVolVars.extrusionFactor()
395 *vtmv(scvf.unitOuterNormal(), insideVolVars.permeability(), g);
397 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
399 const auto outsideScvIdx = scvf.outsideScvIdx(i);
400 const auto& flippedScvf = fvGeometry.flipScvf(scvf.index(), i);
401 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
402 const auto& outsideFluxVarsCache = elemFluxVarsCache[flippedScvf];
403 sumTi += outsideFluxVarsCache.advectionTij();
404 sumPTi += outsideFluxVarsCache.advectionTij()*outsideVolVars.pressure(phaseIdx);
407 sumPTi += rho*Extrusion::area(scvf)
408 *outsideVolVars.extrusionFactor()
409 *vtmv(flippedScvf.unitOuterNormal(), outsideVolVars.permeability(), g);
416 const auto alpha_inside = vtmv(scvf.unitOuterNormal(), insideVolVars.permeability(), g)*insideVolVars.extrusionFactor();
418 Scalar flux = tij*(pInside - pOutside) + Extrusion::area(scvf)*rho*alpha_inside;
421 if (!scvf.boundary() && scvf.numOutsideScvs() == 1)
423 const auto& outsideScv = fvGeometry.scv(scvf.outsideScvIdx());
424 const auto& outsideScvf = fvGeometry.flipScvf(scvf.index());
425 const auto outsideK = outsideVolVars.permeability();
426 const auto outsideTi = computeTpfaTransmissibility(outsideScvf, outsideScv, outsideK, outsideVolVars.extrusionFactor());
427 const auto alpha_outside = vtmv(outsideScvf.unitOuterNormal(), outsideK, g)*outsideVolVars.extrusionFactor();
429 flux -= rho*tij/outsideTi*(alpha_inside + alpha_outside);
437 const auto pInside = insideVolVars.pressure(phaseIdx);
438 const auto pOutside = [&]()
441 if (scvf.numOutsideScvs() <= 1)
442 return outsideVolVars.pressure(phaseIdx);
447 const auto& insideFluxVarsCache = elemFluxVarsCache[scvf];
448 Scalar sumTi(insideFluxVarsCache.advectionTij());
449 Scalar sumPTi(insideFluxVarsCache.advectionTij()*pInside);
451 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
453 const auto outsideScvIdx = scvf.outsideScvIdx(i);
454 const auto& flippedScvf = fvGeometry.flipScvf(scvf.index(), i);
455 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
456 const auto& outsideFluxVarsCache = elemFluxVarsCache[flippedScvf];
457 sumTi += outsideFluxVarsCache.advectionTij();
458 sumPTi += outsideFluxVarsCache.advectionTij()*outsideVolVars.pressure(phaseIdx);
465 return fluxVarsCache.advectionTij()*(pInside - pOutside);
472 static Scalar calculateTransmissibility(const Problem& problem,
473 const Element& element,
474 const FVElementGeometry& fvGeometry,
475 const ElementVolumeVariables& elemVolVars,
476 const SubControlVolumeFace& scvf)
480 const auto insideScvIdx = scvf.insideScvIdx();
481 const auto& insideScv = fvGeometry.scv(insideScvIdx);
482 const auto& insideVolVars = elemVolVars[insideScvIdx];
484 const Scalar ti = computeTpfaTransmissibility(scvf, insideScv,
485 getPermeability_(problem, insideVolVars, scvf.ipGlobal()),
486 insideVolVars.extrusionFactor());
489 if (scvf.boundary() || scvf.numOutsideScvs() > 1)
490 tij = Extrusion::area(scvf)*ti;
495 const auto outsideScvIdx = scvf.outsideScvIdx();
498 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
499 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
500 const Scalar tj = computeTpfaTransmissibility(fvGeometry.flipScvf(scvf.index()), outsideScv,
501 getPermeability_(problem, outsideVolVars, scvf.ipGlobal()),
502 outsideVolVars.extrusionFactor());
509 tij = Extrusion::area(scvf)*(ti * tj)/(ti + tj);