28#ifndef EWOMS_BLACK_OIL_LOCAL_TPFA_RESIDUAL_HH
29#define EWOMS_BLACK_OIL_LOCAL_TPFA_RESIDUAL_HH
31#include <opm/input/eclipse/EclipseState/Grid/FaceDir.hpp>
32#include <opm/input/eclipse/Schedule/BCProp.hpp>
34#include <opm/material/common/MathToolbox.hpp>
35#include <opm/material/fluidstates/BlackOilFluidState.hpp>
36#include <opm/material/common/ConditionalStorage.hpp>
61template <
class TypeTag>
75 using FluidState =
typename IntensiveQuantities::FluidState;
77 enum { conti0EqIdx = Indices::conti0EqIdx };
78 enum { numEq = getPropValue<TypeTag, Properties::NumEq>() };
79 enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
80 enum { numComponents = getPropValue<TypeTag, Properties::NumComponents>() };
82 enum { dimWorld = GridView::dimensionworld };
83 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
84 enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
85 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
87 enum { gasCompIdx = FluidSystem::gasCompIdx };
88 enum { oilCompIdx = FluidSystem::oilCompIdx };
89 enum { waterCompIdx = FluidSystem::waterCompIdx };
90 enum { compositionSwitchIdx = Indices::compositionSwitchIdx };
92 static constexpr bool waterEnabled = Indices::waterEnabled;
93 static constexpr bool gasEnabled = Indices::gasEnabled;
94 static constexpr bool oilEnabled = Indices::oilEnabled;
95 static constexpr bool compositionSwitchEnabled = compositionSwitchIdx >= 0;
97 static constexpr bool blackoilConserveSurfaceVolume =
98 getPropValue<TypeTag, Properties::BlackoilConserveSurfaceVolume>();
100 static constexpr bool enableSolvent = getPropValue<TypeTag, Properties::EnableSolvent>();
101 static constexpr bool enableExtbo = getPropValue<TypeTag, Properties::EnableExtbo>();
102 static constexpr bool enablePolymer = getPropValue<TypeTag, Properties::EnablePolymer>();
103 static constexpr bool enableEnergy = getPropValue<TypeTag, Properties::EnableEnergy>();
104 static constexpr bool enableFoam = getPropValue<TypeTag, Properties::EnableFoam>();
105 static constexpr bool enableBrine = getPropValue<TypeTag, Properties::EnableBrine>();
106 static constexpr bool enableDiffusion = getPropValue<TypeTag, Properties::EnableDiffusion>();
107 static constexpr bool enableDispersion = getPropValue<TypeTag, Properties::EnableDispersion>();
108 static constexpr bool enableConvectiveMixing = getPropValue<TypeTag, Properties::EnableConvectiveMixing>();
109 static constexpr bool enableMICP = getPropValue<TypeTag, Properties::EnableMICP>();
119 using ConvectiveMixingModuleParam =
typename ConvectiveMixingModule::ConvectiveMixingModuleParam;
124 using Toolbox = MathToolbox<Evaluation>;
136 ConditionalStorage<enableEnergy, double>
inAlpha;
150 template <
class LhsEval>
152 const ElementContext& elemCtx,
154 unsigned timeIdx)
const
156 const IntensiveQuantities& intQuants = elemCtx.intensiveQuantities(dofIdx, timeIdx);
160 template <
class LhsEval>
162 const IntensiveQuantities& intQuants)
166 const auto& fs = intQuants.fluidState();
169 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
170 if (!FluidSystem::phaseIsActive(phaseIdx)) {
173 unsigned activeCompIdx =
174 Indices::canonicalToActiveComponentIndex(FluidSystem::solventComponentIndex(phaseIdx));
175 LhsEval surfaceVolume =
176 Toolbox::template decay<LhsEval>(fs.saturation(phaseIdx)) *
177 Toolbox::template decay<LhsEval>(fs.invB(phaseIdx)) *
178 Toolbox::template decay<LhsEval>(intQuants.porosity());
180 storage[conti0EqIdx + activeCompIdx] += surfaceVolume;
183 if (phaseIdx == oilPhaseIdx && FluidSystem::enableDissolvedGas()) {
184 unsigned activeGasCompIdx = Indices::canonicalToActiveComponentIndex(gasCompIdx);
185 storage[conti0EqIdx + activeGasCompIdx] +=
186 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rs()) *
191 if (phaseIdx == waterPhaseIdx && FluidSystem::enableDissolvedGasInWater()) {
192 unsigned activeGasCompIdx = Indices::canonicalToActiveComponentIndex(gasCompIdx);
193 storage[conti0EqIdx + activeGasCompIdx] +=
194 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rsw()) *
199 if (phaseIdx == gasPhaseIdx && FluidSystem::enableVaporizedOil()) {
200 unsigned activeOilCompIdx = Indices::canonicalToActiveComponentIndex(oilCompIdx);
201 storage[conti0EqIdx + activeOilCompIdx] +=
202 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rv()) *
207 if (phaseIdx == gasPhaseIdx && FluidSystem::enableVaporizedWater()) {
208 unsigned activeWaterCompIdx = Indices::canonicalToActiveComponentIndex(waterCompIdx);
209 storage[conti0EqIdx + activeWaterCompIdx] +=
210 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rvw()) *
246 const unsigned globalIndexIn,
247 const unsigned globalIndexEx,
248 const IntensiveQuantities& intQuantsIn,
249 const IntensiveQuantities& intQuantsEx,
271 const ElementContext& elemCtx,
276 assert(timeIdx == 0);
279 RateVector darcy = 0.0;
281 const auto& problem = elemCtx.problem();
282 const auto& stencil = elemCtx.stencil(timeIdx);
283 const auto& scvf = stencil.interiorFace(scvfIdx);
285 unsigned interiorDofIdx = scvf.interiorIndex();
286 unsigned exteriorDofIdx = scvf.exteriorIndex();
287 assert(interiorDofIdx != exteriorDofIdx);
291 Scalar Vin = elemCtx.dofVolume(interiorDofIdx, 0);
292 Scalar Vex = elemCtx.dofVolume(exteriorDofIdx, 0);
293 const auto& globalIndexIn = stencil.globalSpaceIndex(interiorDofIdx);
294 const auto& globalIndexEx = stencil.globalSpaceIndex(exteriorDofIdx);
295 Scalar trans = problem.transmissibility(elemCtx, interiorDofIdx, exteriorDofIdx);
296 Scalar faceArea = scvf.area();
298 Scalar thpres = problem.thresholdPressure(globalIndexIn, globalIndexEx);
303 const Scalar g = problem.gravity()[dimWorld - 1];
304 const auto& intQuantsIn = elemCtx.intensiveQuantities(interiorDofIdx, timeIdx);
305 const auto& intQuantsEx = elemCtx.intensiveQuantities(exteriorDofIdx, timeIdx);
312 const Scalar zIn = problem.dofCenterDepth(elemCtx, interiorDofIdx, timeIdx);
313 const Scalar zEx = problem.dofCenterDepth(elemCtx, exteriorDofIdx, timeIdx);
316 const Scalar distZ = zIn - zEx;
318 const Scalar inAlpha = problem.thermalHalfTransmissibility(globalIndexIn, globalIndexEx);
319 const Scalar outAlpha = problem.thermalHalfTransmissibility(globalIndexEx, globalIndexIn);
320 const Scalar diffusivity = problem.diffusivity(globalIndexEx, globalIndexIn);
321 const Scalar dispersivity = problem.dispersivity(globalIndexEx, globalIndexIn);
324 trans, faceArea, thpres, distZ * g, faceDir, Vin, Vex,
325 inAlpha, outAlpha, diffusivity, dispersivity
335 problem.moduleParams());
340 const IntensiveQuantities& intQuantsIn,
341 const IntensiveQuantities& intQuantsEx,
342 const unsigned& globalIndexIn,
343 const unsigned& globalIndexEx,
347 OPM_TIMEBLOCK_LOCAL(calculateFluxes);
348 const Scalar Vin = nbInfo.
Vin;
349 const Scalar Vex = nbInfo.
Vex;
350 const Scalar distZg = nbInfo.
dZg;
351 const Scalar thpres = nbInfo.
thpres;
352 const Scalar trans = nbInfo.
trans;
353 const Scalar faceArea = nbInfo.
faceArea;
354 FaceDir::DirEnum facedir = nbInfo.
faceDir;
356 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
357 if (!FluidSystem::phaseIsActive(phaseIdx)) {
365 short interiorDofIdx = 0;
366 short exteriorDofIdx = 1;
367 Evaluation pressureDifference;
368 ExtensiveQuantities::calculatePhasePressureDiff_(upIdx,
384 const IntensiveQuantities& up = (upIdx == interiorDofIdx) ? intQuantsIn : intQuantsEx;
385 unsigned globalUpIndex = (upIdx == interiorDofIdx) ? globalIndexIn : globalIndexEx;
387 Evaluation transMult = (intQuantsIn.rockCompTransMultiplier() +
388 Toolbox::value(intQuantsEx.rockCompTransMultiplier())) / 2;
389 if constexpr (enableMICP) {
390 transMult *= (intQuantsIn.permFactor() + Toolbox::value(intQuantsEx.permFactor())) / 2;
392 Evaluation darcyFlux;
393 if (globalUpIndex == globalIndexIn) {
394 darcyFlux = pressureDifference * up.mobility(phaseIdx, facedir) * transMult * (-trans / faceArea);
396 darcyFlux = pressureDifference *
397 (Toolbox::value(up.mobility(phaseIdx, facedir)) * transMult * (-trans / faceArea));
400 unsigned activeCompIdx =
401 Indices::canonicalToActiveComponentIndex(FluidSystem::solventComponentIndex(phaseIdx));
403 darcy[conti0EqIdx + activeCompIdx] = darcyFlux.value() * faceArea;
405 unsigned pvtRegionIdx = up.pvtRegionIndex();
407 if (globalUpIndex == globalIndexIn) {
409 = getInvB_<FluidSystem, FluidState, Evaluation>(up.fluidState(), phaseIdx, pvtRegionIdx);
410 const auto& surfaceVolumeFlux = invB * darcyFlux;
411 evalPhaseFluxes_<Evaluation>(flux, phaseIdx, pvtRegionIdx, surfaceVolumeFlux, up.fluidState());
412 if constexpr (enableEnergy) {
413 EnergyModule::template
414 addPhaseEnthalpyFluxes_<Evaluation>(flux, phaseIdx, darcyFlux, up.fluidState());
416 if constexpr (enableMICP) {
418 addMICPFluxes_<Evaluation>(flux, darcyFlux, intQuantsIn);
421 const auto& invB = getInvB_<FluidSystem, FluidState, Scalar>(up.fluidState(), phaseIdx, pvtRegionIdx);
422 const auto& surfaceVolumeFlux = invB * darcyFlux;
423 evalPhaseFluxes_<Scalar>(flux, phaseIdx, pvtRegionIdx, surfaceVolumeFlux, up.fluidState());
424 if constexpr (enableEnergy) {
425 EnergyModule::template
426 addPhaseEnthalpyFluxes_<Scalar>(flux,phaseIdx,darcyFlux, up.fluidState());
428 if constexpr (enableMICP) {
430 addMICPFluxes_<Scalar>(flux, darcyFlux, intQuantsEx);
437 static_assert(!enableSolvent,
438 "Relevant computeFlux() method must be implemented for this module before enabling.");
442 static_assert(!enableExtbo,
443 "Relevant computeFlux() method must be implemented for this module before enabling.");
447 static_assert(!enablePolymer,
448 "Relevant computeFlux() method must be implemented for this module before enabling.");
452 if constexpr (enableConvectiveMixing) {
453 ConvectiveMixingModule::addConvectiveMixingFlux(flux,
465 if constexpr (enableEnergy) {
466 const Scalar inAlpha = nbInfo.
inAlpha;
467 const Scalar outAlpha = nbInfo.
outAlpha;
470 short interiorDofIdx = 0;
471 short exteriorDofIdx = 1;
473 EnergyModule::ExtensiveQuantities::updateEnergy(heatFlux,
479 intQuantsIn.fluidState(),
480 intQuantsEx.fluidState(),
490 static_assert(!enableFoam,
491 "Relevant computeFlux() method must be implemented for this module before enabling.");
495 static_assert(!enableBrine,
496 "Relevant computeFlux() method must be implemented for this module before enabling.");
500 if constexpr (enableDiffusion) {
501 typename DiffusionModule::ExtensiveQuantities::EvaluationArray effectiveDiffusionCoefficient;
502 DiffusionModule::ExtensiveQuantities::update(effectiveDiffusionCoefficient, intQuantsIn, intQuantsEx);
504 const Scalar tmpdiffusivity = diffusivity / faceArea;
505 DiffusionModule::addDiffusiveFlux(flux,
509 effectiveDiffusionCoefficient);
513 if constexpr (enableDispersion) {
514 typename DispersionModule::ExtensiveQuantities::ScalarArray normVelocityAvg;
515 DispersionModule::ExtensiveQuantities::update(normVelocityAvg, intQuantsIn, intQuantsEx);
517 const Scalar tmpdispersivity = dispersivity / faceArea;
518 DispersionModule::addDispersiveFlux(flux,
526 if constexpr (enableMICP) {
531 template <
class BoundaryConditionData>
533 const Problem& problem,
534 const BoundaryConditionData& bdyInfo,
535 const IntensiveQuantities& insideIntQuants,
536 unsigned globalSpaceIdx)
538 switch (bdyInfo.type) {
546 case BCType::DIRICHLET:
549 case BCType::THERMAL:
553 throw std::logic_error(
"Unknown boundary condition type " +
555 " in computeBoundaryFlux()." );
559 template <
class BoundaryConditionData>
561 const BoundaryConditionData& bdyInfo)
563 bdyFlux.setMassRate(bdyInfo.massRate, bdyInfo.pvtRegionIdx);
566 template <
class BoundaryConditionData>
569 const BoundaryConditionData& bdyInfo,
570 const IntensiveQuantities& insideIntQuants,
571 unsigned globalSpaceIdx)
574 std::array<short, numPhases> upIdx;
575 std::array<short, numPhases> dnIdx;
576 std::array<Evaluation, numPhases> volumeFlux;
577 std::array<Evaluation, numPhases> pressureDifference;
579 ExtensiveQuantities::calculateBoundaryGradients_(problem,
582 bdyInfo.boundaryFaceIndex,
585 bdyInfo.exFluidState,
595 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
596 if (!FluidSystem::phaseIsActive(phaseIdx)) {
599 const auto& pBoundary = bdyInfo.exFluidState.pressure(phaseIdx);
600 const Evaluation& pInside = insideIntQuants.fluidState().pressure(phaseIdx);
601 const unsigned pvtRegionIdx = insideIntQuants.pvtRegionIndex();
604 const auto& darcyFlux = volumeFlux[phaseIdx];
606 if (pBoundary < pInside) {
609 getInvB_<FluidSystem, FluidState, Evaluation>(insideIntQuants.fluidState(), phaseIdx, pvtRegionIdx);
610 Evaluation surfaceVolumeFlux = invB * darcyFlux;
611 evalPhaseFluxes_<Evaluation>(tmp,
613 insideIntQuants.pvtRegionIndex(),
615 insideIntQuants.fluidState());
616 if constexpr (enableEnergy) {
617 EnergyModule::template
618 addPhaseEnthalpyFluxes_<Evaluation>(tmp, phaseIdx, darcyFlux, insideIntQuants.fluidState());
620 }
else if (pBoundary > pInside) {
622 using ScalarFluidState =
decltype(bdyInfo.exFluidState);
624 getInvB_<FluidSystem, ScalarFluidState, Scalar>(bdyInfo.exFluidState, phaseIdx, pvtRegionIdx);
625 Evaluation surfaceVolumeFlux = invB * darcyFlux;
626 evalPhaseFluxes_<Scalar>(tmp,
628 insideIntQuants.pvtRegionIndex(),
630 bdyInfo.exFluidState);
631 if constexpr (enableEnergy) {
632 EnergyModule::template
633 addPhaseEnthalpyFluxes_<Scalar>(tmp, phaseIdx, darcyFlux, bdyInfo.exFluidState);
637 for (
unsigned i = 0; i < tmp.size(); ++i) {
638 bdyFlux[i] += tmp[i];
643 if constexpr (enableEnergy) {
647 problem.eclTransmissibilities().thermalHalfTransBoundary(globalSpaceIdx, bdyInfo.boundaryFaceIndex);
650 EnergyModule::ExtensiveQuantities::updateEnergyBoundary(heatFlux,
655 bdyInfo.exFluidState);
659 static_assert(!enableSolvent,
660 "Relevant treatment of boundary conditions must be implemented before enabling.");
661 static_assert(!enablePolymer,
662 "Relevant treatment of boundary conditions must be implemented before enabling.");
668 for (
unsigned i = 0; i < numEq; ++i) {
669 Valgrind::CheckDefined(bdyFlux[i]);
671 Valgrind::CheckDefined(bdyFlux);
675 template <
class BoundaryConditionData>
678 const BoundaryConditionData& bdyInfo,
679 const IntensiveQuantities& insideIntQuants,
680 [[maybe_unused]]
unsigned globalSpaceIdx)
687 if constexpr (enableEnergy) {
691 problem.eclTransmissibilities().thermalHalfTransBoundary(globalSpaceIdx, bdyInfo.boundaryFaceIndex);
694 EnergyModule::ExtensiveQuantities::updateEnergyBoundary(heatFlux,
699 bdyInfo.exFluidState);
704 for (
unsigned i = 0; i < numEq; ++i) {
705 Valgrind::CheckDefined(bdyFlux[i]);
707 Valgrind::CheckDefined(bdyFlux);
712 const Problem& problem,
713 const IntensiveQuantities& insideIntQuants,
714 unsigned globalSpaceIdex,
719 problem.source(source, globalSpaceIdex, timeIdx);
725 if constexpr (enableEnergy) {
726 source[Indices::contiEnergyEqIdx] *= getPropValue<TypeTag, Properties::BlackOilEnergyScalingFactor>();
731 const Problem& problem,
732 const IntensiveQuantities& insideIntQuants,
733 unsigned globalSpaceIdex,
737 problem.addToSourceDense(source, globalSpaceIdex, timeIdx);
743 if constexpr (enableEnergy) {
744 source[Indices::contiEnergyEqIdx] *= getPropValue<TypeTag, Properties::BlackOilEnergyScalingFactor>();
752 const ElementContext& elemCtx,
754 unsigned timeIdx)
const
758 elemCtx.problem().source(source, elemCtx, dofIdx, timeIdx);
764 if constexpr (enableEnergy) {
765 source[Indices::contiEnergyEqIdx] *= getPropValue<TypeTag, Properties::BlackOilEnergyScalingFactor>();
769 template <
class UpEval,
class Flu
idState>
772 unsigned pvtRegionIdx,
773 const ExtensiveQuantities& extQuants,
774 const FluidState& upFs)
776 const auto& invB = getInvB_<FluidSystem, FluidState, UpEval>(upFs, phaseIdx, pvtRegionIdx);
777 const auto& surfaceVolumeFlux = invB * extQuants.volumeFlux(phaseIdx);
778 evalPhaseFluxes_<UpEval>(flux, phaseIdx, pvtRegionIdx, surfaceVolumeFlux, upFs);
785 template <
class UpEval,
class Eval,
class Flu
idState>
788 unsigned pvtRegionIdx,
789 const Eval& surfaceVolumeFlux,
790 const FluidState& upFs)
792 unsigned activeCompIdx =
793 Indices::canonicalToActiveComponentIndex(FluidSystem::solventComponentIndex(phaseIdx));
795 if constexpr (blackoilConserveSurfaceVolume) {
796 flux[conti0EqIdx + activeCompIdx] += surfaceVolumeFlux;
799 flux[conti0EqIdx + activeCompIdx] += surfaceVolumeFlux *
800 FluidSystem::referenceDensity(phaseIdx, pvtRegionIdx);
803 if (phaseIdx == oilPhaseIdx) {
805 if (FluidSystem::enableDissolvedGas()) {
806 const auto& Rs = BlackOil::getRs_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
808 unsigned activeGasCompIdx = Indices::canonicalToActiveComponentIndex(gasCompIdx);
809 if constexpr (blackoilConserveSurfaceVolume) {
810 flux[conti0EqIdx + activeGasCompIdx] += Rs * surfaceVolumeFlux;
813 flux[conti0EqIdx + activeGasCompIdx] +=
814 Rs * surfaceVolumeFlux *
815 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
819 else if (phaseIdx == waterPhaseIdx) {
821 if (FluidSystem::enableDissolvedGasInWater()) {
822 const auto& Rsw = BlackOil::getRsw_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
824 unsigned activeGasCompIdx = Indices::canonicalToActiveComponentIndex(gasCompIdx);
825 if constexpr (blackoilConserveSurfaceVolume) {
826 flux[conti0EqIdx + activeGasCompIdx] += Rsw * surfaceVolumeFlux;
829 flux[conti0EqIdx + activeGasCompIdx] +=
830 Rsw * surfaceVolumeFlux *
831 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
835 else if (phaseIdx == gasPhaseIdx) {
837 if (FluidSystem::enableVaporizedOil()) {
838 const auto& Rv = BlackOil::getRv_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
840 unsigned activeOilCompIdx = Indices::canonicalToActiveComponentIndex(oilCompIdx);
841 if constexpr (blackoilConserveSurfaceVolume) {
842 flux[conti0EqIdx + activeOilCompIdx] += Rv * surfaceVolumeFlux;
845 flux[conti0EqIdx + activeOilCompIdx] +=
846 Rv * surfaceVolumeFlux *
847 FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx);
851 if (FluidSystem::enableVaporizedWater()) {
852 const auto& Rvw = BlackOil::getRvw_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
854 unsigned activeWaterCompIdx = Indices::canonicalToActiveComponentIndex(waterCompIdx);
855 if constexpr (blackoilConserveSurfaceVolume) {
856 flux[conti0EqIdx + activeWaterCompIdx] += Rvw * surfaceVolumeFlux;
859 flux[conti0EqIdx + activeWaterCompIdx] +=
860 Rvw * surfaceVolumeFlux *
861 FluidSystem::referenceDensity(waterPhaseIdx, pvtRegionIdx);
878 template <
class Scalar>
880 unsigned pvtRegionIdx)
882 if constexpr (!blackoilConserveSurfaceVolume) {
887 if constexpr (waterEnabled) {
888 unsigned activeWaterCompIdx = Indices::canonicalToActiveComponentIndex(waterCompIdx);
889 container[conti0EqIdx + activeWaterCompIdx] *=
890 FluidSystem::referenceDensity(waterPhaseIdx, pvtRegionIdx);
893 if constexpr (gasEnabled) {
894 unsigned activeGasCompIdx = Indices::canonicalToActiveComponentIndex(gasCompIdx);
895 container[conti0EqIdx + activeGasCompIdx] *=
896 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
899 if constexpr (oilEnabled) {
900 unsigned activeOilCompIdx = Indices::canonicalToActiveComponentIndex(oilCompIdx);
901 container[conti0EqIdx + activeOilCompIdx] *=
902 FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx);
909 {
return dirId < 0 ? FaceDir::DirEnum::Unknown : FaceDir::FromIntersectionIndex(dirId); }
Contains the classes required to extend the black-oil model by brine.
Classes required for dynamic convective mixing.
Classes required for molecular diffusion.
Classes required for mechanical dispersion.
Contains the classes required to extend the black-oil model by energy.
Contains the classes required to extend the black-oil model by solvent component. For details,...
Contains the classes required to extend the black-oil model to include the effects of foam.
Contains the classes required to extend the black-oil model by MICP.
Contains the classes required to extend the black-oil model by polymer.
Declares the properties required by the black oil model.
Contains the classes required to extend the black-oil model by solvents.
Contains the high level supplements required to extend the black oil model by brine.
Definition: blackoilbrinemodules.hh:55
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilbrinemodules.hh:162
Definition: blackoilconvectivemixingmodule.hh:64
Provides the auxiliary methods required for consideration of the diffusion equation.
Definition: blackoildiffusionmodule.hh:50
Provides the auxiliary methods required for consideration of the dispersion equation.
Definition: blackoildispersionmodule.hh:58
Contains the high level supplements required to extend the black oil model by energy.
Definition: blackoilenergymodules.hh:58
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilenergymodules.hh:153
static void addHeatFlux(RateVector &flux, const Evaluation &heatFlux)
Definition: blackoilenergymodules.hh:211
Contains the high level supplements required to extend the black oil model.
Definition: blackoilextbomodules.hh:62
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilextbomodules.hh:162
Contains the high level supplements required to extend the black oil model to include the effects of ...
Definition: blackoilfoammodules.hh:58
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilfoammodules.hh:166
Calculates the local residual of the black oil model.
Definition: blackoillocalresidualtpfa.hh:63
void computeSource(RateVector &source, const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx) const
Calculate the source term of the equation.
Definition: blackoillocalresidualtpfa.hh:751
static void computeBoundaryFlux(RateVector &bdyFlux, const Problem &problem, const BoundaryConditionData &bdyInfo, const IntensiveQuantities &insideIntQuants, unsigned globalSpaceIdx)
Definition: blackoillocalresidualtpfa.hh:532
static void computeBoundaryFluxFree(const Problem &problem, RateVector &bdyFlux, const BoundaryConditionData &bdyInfo, const IntensiveQuantities &insideIntQuants, unsigned globalSpaceIdx)
Definition: blackoillocalresidualtpfa.hh:567
static void computeBoundaryFluxRate(RateVector &bdyFlux, const BoundaryConditionData &bdyInfo)
Definition: blackoillocalresidualtpfa.hh:560
static FaceDir::DirEnum faceDirFromDirId(const int dirId)
Definition: blackoillocalresidualtpfa.hh:908
static void evalPhaseFluxes_(RateVector &flux, unsigned phaseIdx, unsigned pvtRegionIdx, const ExtensiveQuantities &extQuants, const FluidState &upFs)
Definition: blackoillocalresidualtpfa.hh:770
static void computeFlux(RateVector &flux, const ElementContext &elemCtx, unsigned scvfIdx, unsigned timeIdx)
Definition: blackoillocalresidualtpfa.hh:270
static void computeStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoillocalresidualtpfa.hh:161
static void computeFlux(RateVector &flux, RateVector &darcy, const unsigned globalIndexIn, const unsigned globalIndexEx, const IntensiveQuantities &intQuantsIn, const IntensiveQuantities &intQuantsEx, const ResidualNBInfo &nbInfo, const ModuleParams &moduleParams)
Definition: blackoillocalresidualtpfa.hh:244
static void computeBoundaryThermal(const Problem &problem, RateVector &bdyFlux, const BoundaryConditionData &bdyInfo, const IntensiveQuantities &insideIntQuants, unsigned globalSpaceIdx)
Definition: blackoillocalresidualtpfa.hh:676
static void adaptMassConservationQuantities_(Dune::FieldVector< Scalar, numEq > &container, unsigned pvtRegionIdx)
Helper function to convert the mass-related parts of a Dune::FieldVector that stores conservation qua...
Definition: blackoillocalresidualtpfa.hh:879
static void evalPhaseFluxes_(RateVector &flux, unsigned phaseIdx, unsigned pvtRegionIdx, const Eval &surfaceVolumeFlux, const FluidState &upFs)
Helper function to calculate the flux of mass in terms of conservation quantities via specific fluid ...
Definition: blackoillocalresidualtpfa.hh:786
void computeStorage(Dune::FieldVector< LhsEval, numEq > &storage, const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx) const
Evaluate the amount all conservation quantities (e.g. phase mass) within a finite sub-control volume.
Definition: blackoillocalresidualtpfa.hh:151
static void calculateFluxes_(RateVector &flux, RateVector &darcy, const IntensiveQuantities &intQuantsIn, const IntensiveQuantities &intQuantsEx, const unsigned &globalIndexIn, const unsigned &globalIndexEx, const ResidualNBInfo &nbInfo, const ModuleParams &moduleParams)
Definition: blackoillocalresidualtpfa.hh:338
static void computeSource(RateVector &source, const Problem &problem, const IntensiveQuantities &insideIntQuants, unsigned globalSpaceIdex, unsigned timeIdx)
Definition: blackoillocalresidualtpfa.hh:711
static void computeSourceDense(RateVector &source, const Problem &problem, const IntensiveQuantities &insideIntQuants, unsigned globalSpaceIdex, unsigned timeIdx)
Definition: blackoillocalresidualtpfa.hh:730
Contains the high level supplements required to extend the black oil model by MICP.
Definition: blackoilmicpmodules.hh:54
static void applyScaling(RateVector &flux)
Definition: blackoilmicpmodules.hh:200
static void addSource(RateVector &source, const Problem &problem, const IntensiveQuantities &intQuants, unsigned globalSpaceIdex)
Definition: blackoilmicpmodules.hh:243
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilmicpmodules.hh:144
Contains the high level supplements required to extend the black oil model by polymer.
Definition: blackoilpolymermodules.hh:64
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilpolymermodules.hh:238
Contains the high level supplements required to extend the black oil model by solvents.
Definition: blackoilsolventmodules.hh:66
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilsolventmodules.hh:183
@ NONE
Definition: DeferredLogger.hpp:46
Definition: blackoilboundaryratevector.hh:39
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:233
std::string to_string(const ConvergenceReport::ReservoirFailure::Type t)
Definition: blackoillocalresidualtpfa.hh:143
ConvectiveMixingModuleParam convectiveMixingModuleParam
Definition: blackoillocalresidualtpfa.hh:144
Definition: blackoillocalresidualtpfa.hh:128
FaceDir::DirEnum faceDir
Definition: blackoillocalresidualtpfa.hh:133
double faceArea
Definition: blackoillocalresidualtpfa.hh:130
ConditionalStorage< enableEnergy, double > inAlpha
Definition: blackoillocalresidualtpfa.hh:136
ConditionalStorage< enableDiffusion, double > diffusivity
Definition: blackoillocalresidualtpfa.hh:138
double dZg
Definition: blackoillocalresidualtpfa.hh:132
double Vin
Definition: blackoillocalresidualtpfa.hh:134
ConditionalStorage< enableDispersion, double > dispersivity
Definition: blackoillocalresidualtpfa.hh:139
double thpres
Definition: blackoillocalresidualtpfa.hh:131
ConditionalStorage< enableEnergy, double > outAlpha
Definition: blackoillocalresidualtpfa.hh:137
double trans
Definition: blackoillocalresidualtpfa.hh:129
double Vex
Definition: blackoillocalresidualtpfa.hh:135