308 static Scalar flux(const Problem& problem,
309 const Element& element,
310 const FVElementGeometry& fvGeometry,
311 const ElementVolumeVariables& elemVolVars,
312 const SubControlVolumeFace& scvf,
314 const ElementFluxVarsCache& elemFluxVarsCache)
316 static const bool gravity = getParamFromGroup<bool>(problem.paramGroup(), "Problem.EnableGravity");
318 const auto& fluxVarsCache = elemFluxVarsCache[scvf];
321 const auto& insideScv = fvGeometry.scv(scvf.insideScvIdx());
322 const auto& insideVolVars = elemVolVars[insideScv];
323 const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
328 const auto rho = [&]()
332 return outsideVolVars.density(phaseIdx);
335 else if (scvf.numOutsideScvs() == 1)
336 return (insideVolVars.density(phaseIdx) + outsideVolVars.density(phaseIdx))*0.5;
341 Scalar rho(insideVolVars.density(phaseIdx));
342 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
344 const auto outsideScvIdx = scvf.outsideScvIdx(i);
345 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
346 rho += outsideVolVars.density(phaseIdx);
348 return rho/(scvf.numOutsideScvs()+1);
352 const auto& tij = fluxVarsCache.advectionTij();
353 const auto& g = problem.spatialParams().gravity(scvf.ipGlobal());
356 const auto pInside = insideVolVars.pressure(phaseIdx);
357 const auto pOutside = [&]()
360 if (scvf.numOutsideScvs() == 1)
361 return outsideVolVars.pressure(phaseIdx);
367 Scalar sumPTi(tij*pInside);
370 sumPTi += rho*scvf.area()
371 *insideVolVars.extrusionFactor()
372 *vtmv(scvf.unitOuterNormal(), insideVolVars.permeability(), g);
374 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
376 const auto outsideScvIdx = scvf.outsideScvIdx(i);
377 const auto& flippedScvf = fvGeometry.flipScvf(scvf.index(), i);
378 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
379 const auto& outsideFluxVarsCache = elemFluxVarsCache[flippedScvf];
380 sumTi += outsideFluxVarsCache.advectionTij();
381 sumPTi += outsideFluxVarsCache.advectionTij()*outsideVolVars.pressure(phaseIdx);
384 sumPTi += rho*scvf.area()
385 *outsideVolVars.extrusionFactor()
386 *vtmv(flippedScvf.unitOuterNormal(), outsideVolVars.permeability(), g);
393 const auto alpha_inside = vtmv(scvf.unitOuterNormal(), insideVolVars.permeability(), g)*insideVolVars.extrusionFactor();
395 Scalar flux = tij*(pInside - pOutside) + scvf.area()*rho*alpha_inside;
398 if (!scvf.boundary() && scvf.numOutsideScvs() == 1)
400 const auto& outsideScv = fvGeometry.scv(scvf.outsideScvIdx());
401 const auto& outsideScvf = fvGeometry.flipScvf(scvf.index());
402 const auto outsideK = outsideVolVars.permeability();
403 const auto outsideTi = computeTpfaTransmissibility(outsideScvf, outsideScv, outsideK, outsideVolVars.extrusionFactor());
404 const auto alpha_outside = vtmv(outsideScvf.unitOuterNormal(), outsideK, g)*outsideVolVars.extrusionFactor();
406 flux -= rho*tij/outsideTi*(alpha_inside + alpha_outside);
414 const auto pInside = insideVolVars.pressure(phaseIdx);
415 const auto pOutside = [&]()
418 if (scvf.numOutsideScvs() <= 1)
419 return outsideVolVars.pressure(phaseIdx);
424 const auto& insideFluxVarsCache = elemFluxVarsCache[scvf];
425 Scalar sumTi(insideFluxVarsCache.advectionTij());
426 Scalar sumPTi(insideFluxVarsCache.advectionTij()*pInside);
428 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
430 const auto outsideScvIdx = scvf.outsideScvIdx(i);
431 const auto& flippedScvf = fvGeometry.flipScvf(scvf.index(), i);
432 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
433 const auto& outsideFluxVarsCache = elemFluxVarsCache[flippedScvf];
434 sumTi += outsideFluxVarsCache.advectionTij();
435 sumPTi += outsideFluxVarsCache.advectionTij()*outsideVolVars.pressure(phaseIdx);
442 return fluxVarsCache.advectionTij()*(pInside - pOutside);
449 static Scalar calculateTransmissibility(const Problem& problem,
450 const Element& element,
451 const FVElementGeometry& fvGeometry,
452 const ElementVolumeVariables& elemVolVars,
453 const SubControlVolumeFace& scvf)
457 const auto insideScvIdx = scvf.insideScvIdx();
458 const auto& insideScv = fvGeometry.scv(insideScvIdx);
459 const auto& insideVolVars = elemVolVars[insideScvIdx];
461 const Scalar ti = computeTpfaTransmissibility(scvf, insideScv,
462 getPermeability_(problem, insideVolVars, scvf.ipGlobal()),
463 insideVolVars.extrusionFactor());
466 if (scvf.boundary() || scvf.numOutsideScvs() > 1)
467 tij = scvf.area()*ti;
472 const auto outsideScvIdx = scvf.outsideScvIdx();
475 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
476 const auto& outsideVolVars = elemVolVars[outsideScvIdx];
477 const Scalar tj = computeTpfaTransmissibility(fvGeometry.flipScvf(scvf.index()), outsideScv,
478 getPermeability_(problem, outsideVolVars, scvf.ipGlobal()),
479 outsideVolVars.extrusionFactor());
486 tij = scvf.area()*(ti * tj)/(ti + tj);