28#ifndef EWOMS_BLACK_OIL_INTENSIVE_QUANTITIES_HH
29#define EWOMS_BLACK_OIL_INTENSIVE_QUANTITIES_HH
31#include <dune/common/fmatrix.hh>
33#include <opm/common/ErrorMacros.hpp>
34#include <opm/common/TimingMacros.hpp>
35#include <opm/common/utility/gpuDecorators.hpp>
37#include <opm/input/eclipse/EclipseState/Grid/FaceDir.hpp>
39#include <opm/material/fluidstates/BlackOilFluidState.hpp>
40#include <opm/material/common/Valgrind.hpp>
52#include <opm/utility/CopyablePtr.hpp>
70template <
class TypeTag>
72 :
public GetPropType<TypeTag, Properties::DiscIntensiveQuantities>
73 ,
public GetPropType<TypeTag, Properties::FluxModule>::FluxIntensiveQuantities
97 enum { enableVapwat = getPropValue<TypeTag, Properties::EnableVapwat>() };
98 enum { enableDisgasInWater = getPropValue<TypeTag, Properties::EnableDisgasInWater>() };
99 enum { enableSaltPrecipitation = getPropValue<TypeTag, Properties::EnableSaltPrecipitation>() };
100 static constexpr EnergyModules energyModuleType = getPropValue<TypeTag, Properties::EnergyModuleType>();
102 static constexpr bool enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
103 static constexpr bool enableBrine = getPropValue<TypeTag, Properties::EnableBrine>();
104 static constexpr bool enableConvectiveMixing = getPropValue<TypeTag, Properties::EnableConvectiveMixing>();
105 static constexpr bool enableDiffusion = getPropValue<TypeTag, Properties::EnableDiffusion>();
106 static constexpr bool enableDispersion = getPropValue<TypeTag, Properties::EnableDispersion>();
107 static constexpr bool enableExtbo = getPropValue<TypeTag, Properties::EnableExtbo>();
108 static constexpr bool enableFoam = getPropValue<TypeTag, Properties::EnableFoam>();
109 static constexpr bool enablePolymer = getPropValue<TypeTag, Properties::EnablePolymer>();
110 static constexpr bool enableSolvent = getPropValue<TypeTag, Properties::EnableSolvent>();
111 static constexpr bool enableTemperature = energyModuleType != EnergyModules::NoTemperature;
113 enum { enableMech = getPropValue<TypeTag, Properties::EnableMech>() };
114 enum { enableMICP = Indices::enableMICP };
115 enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
116 enum { waterCompIdx = FluidSystem::waterCompIdx };
117 enum { oilCompIdx = FluidSystem::oilCompIdx };
118 enum { gasCompIdx = FluidSystem::gasCompIdx };
119 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
120 enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
121 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
122 static constexpr unsigned compositionSwitchIdx = Indices::compositionSwitchIdx;
124 static constexpr bool compositionSwitchEnabled =
125 Indices::compositionSwitchIdx != std::numeric_limits<unsigned>::max();
126 static constexpr bool waterEnabled = Indices::waterEnabled;
127 static constexpr bool gasEnabled = Indices::gasEnabled;
128 static constexpr bool oilEnabled = Indices::oilEnabled;
130 using Toolbox = MathToolbox<Evaluation>;
131 using FluxIntensiveQuantities =
typename FluxModule::FluxIntensiveQuantities;
135 using DirectionalMobilityPtr = Utility::CopyablePtr<DirectionalMobility<TypeTag>>;
136 using BrineModule = BlackOilBrineModule<TypeTag, enableBrine>;
138 using BioeffectsModule = BlackOilBioeffectsModule<TypeTag, enableBioeffects>;
144 energyModuleType != EnergyModules::NoTemperature,
145 energyModuleType == EnergyModules::FullyImplicitThermal,
146 compositionSwitchEnabled,
149 enableSaltPrecipitation,
155 energyModuleType != EnergyModules::NoTemperature,
156 energyModuleType == EnergyModules::FullyImplicitThermal,
157 compositionSwitchEnabled,
160 enableSaltPrecipitation,
168 if constexpr (compositionSwitchEnabled) {
169 fluidState_.setRs(0.0);
170 fluidState_.setRv(0.0);
172 if constexpr (enableVapwat) {
173 fluidState_.setRvw(0.0);
175 if constexpr (enableDisgasInWater) {
176 fluidState_.setRsw(0.0);
182 template<
class OtherTypeTag>
186 template<
class OtherTypeTag>
192 , referencePorosity_(other.referencePorosity_)
193 , porosity_(other.porosity_)
194 , rockCompTransMultiplier_(other.rockCompTransMultiplier_)
195 , mobility_(other.mobility_)
210 template <
class OtherTypeTag>
225 template<
class OtherTypeTag>
229 fluidState_.assign(other.fluidState_);
231 if constexpr (energyModuleType == EnergyModules::FullyImplicitThermal) {
232 this->rockInternalEnergy_ = other.rockInternalEnergy_;
233 this->totalThermalConductivity_ = other.totalThermalConductivity_;
234 this->rockFraction_ = other.rockFraction_;
236 porosity_ = other.porosity_;
237 referencePorosity_ = other.referencePorosity_;
238 rockCompTransMultiplier_ = other.rockCompTransMultiplier_;
239 mobility_ = other.mobility_;
240 this->extrusionFactor_ = other.extrusionFactor();
244 const PrimaryVariables& priVars,
245 const unsigned globalSpaceIdx,
246 const unsigned timeIdx,
249 if constexpr (enableTemperature) {
250 asImp_().updateTemperature_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
252 if constexpr (enableBrine) {
253 asImp_().updateSaltConcentration_(priVars, timeIdx, lintype);
258 const unsigned timeIdx,
263 if constexpr (waterEnabled) {
264 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
265 assert(Indices::waterSwitchIdx != std::numeric_limits<unsigned>::max());
266 if constexpr (Indices::waterSwitchIdx != std::numeric_limits<unsigned>::max()) {
267 Sw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
270 else if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw ||
271 priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Disabled)
279 if constexpr (gasEnabled) {
280 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg) {
281 assert(Indices::compositionSwitchIdx != std::numeric_limits<unsigned>::max());
282 if constexpr (compositionSwitchEnabled) {
283 Sg = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
286 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
289 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Disabled) {
290 if constexpr (waterEnabled) {
298 Valgrind::CheckDefined(Sg);
299 Valgrind::CheckDefined(Sw);
301 Evaluation So = 1.0 - Sw - Sg;
304 if constexpr (enableSolvent) {
305 if (priVars.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
307 So -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
310 Sg -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
316 fluidState_.setSaturation(waterPhaseIdx, Sw);
320 fluidState_.setSaturation(gasPhaseIdx, Sg);
324 fluidState_.setSaturation(oilPhaseIdx, So);
328 template <
class ...Args>
330 const PrimaryVariables& priVars,
331 const unsigned globalSpaceIdx,
332 const unsigned timeIdx,
340 if constexpr (enableSolvent) {
341 asImp_().solventPreSatFuncUpdate_(priVars, timeIdx, lintype);
345 problem.template updateRelperms<
FluidState, Args...>(mobility_, dirMob_, fluidState_, globalSpaceIdx);
348 using EvalArr = std::array<Evaluation, numPhases>;
350 const auto& materialParams = problem.materialLawParams(globalSpaceIdx);
351 MaterialLaw::template capillaryPressures<EvalArr,
FluidState, Args...>(pC, materialParams, fluidState_);
354 if constexpr (enableBrine) {
355 if (BrineModule::hasPcfactTables() &&
356 priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)
358 const unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
359 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
360 const Evaluation porosityFactor = min(1.0 - Sp, 1.0);
361 const auto& pcfactTable = BrineModule::pcfactTable(satnumRegionIdx);
362 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
363 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
365 pC[phaseIdx] *= pcFactor;
370 else if constexpr (enableBioeffects) {
371 if (BioeffectsModule::hasPcfactTables() && referencePorosity_ > 0) {
372 unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
373 const Evaluation Sb = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx, timeIdx);
374 const Evaluation porosityFactor = min(1.0 - Sb/referencePorosity_, 1.0);
375 const auto& pcfactTable = BioeffectsModule::pcfactTable(satnumRegionIdx);
376 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
377 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
379 pC[phaseIdx] *= pcFactor;
386 if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pg) {
387 const Evaluation& pg = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
388 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
390 fluidState_.setPressure(phaseIdx, pg + (pC[phaseIdx] - pC[gasPhaseIdx]));
394 else if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pw) {
395 const Evaluation& pw = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
396 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
398 fluidState_.setPressure(phaseIdx, pw + (pC[phaseIdx] - pC[waterPhaseIdx]));
404 const Evaluation& po = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
405 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
407 fluidState_.setPressure(phaseIdx, po + (pC[phaseIdx] - pC[oilPhaseIdx]));
416 if constexpr (enableSolvent) {
417 asImp_().solventPostSatFuncUpdate_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
422 const PrimaryVariables& priVars,
423 const unsigned globalSpaceIdx,
424 const unsigned timeIdx)
426 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
429 ? problem.maxOilVaporizationFactor(timeIdx, globalSpaceIdx)
432 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
434 const Scalar RswMax =
getFluidSystem().enableDissolvedGasInWater()
435 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
438 Evaluation SoMax = 0.0;
440 SoMax = max(fluidState_.saturation(oilPhaseIdx),
441 problem.maxOilSaturation(globalSpaceIdx));
447 if constexpr (compositionSwitchEnabled) {
448 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rs) {
449 const auto& Rs = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
450 fluidState_.setRs(Rs);
455 if constexpr (enableExtbo) {
456 RsSat = asImp_().rs();
463 fluidState_.setRs(min(RsMax, RsSat));
466 fluidState_.setRs(0.0);
470 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
471 const auto& Rv = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
472 fluidState_.setRv(Rv);
477 if constexpr (enableExtbo) {
478 RvSat = asImp_().rv();
485 fluidState_.setRv(min(RvMax, RvSat));
488 fluidState_.setRv(0.0);
493 if constexpr (enableVapwat) {
494 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rvw) {
495 const auto& Rvw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
496 fluidState_.setRvw(Rvw);
500 const Evaluation& RvwSat =
getFluidSystem().saturatedVaporizationFactor(fluidState_,
503 fluidState_.setRvw(RvwSat);
508 if constexpr (enableDisgasInWater) {
509 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw) {
510 const auto& Rsw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
511 fluidState_.setRsw(Rsw);
515 const Evaluation& RswSat =
getFluidSystem().saturatedDissolutionFactor(fluidState_,
518 fluidState_.setRsw(min(RswMax, RswSat));
527 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
531 constexpr int max_nmobilities = 4;
532 std::array<std::array<Evaluation, numPhases>*, max_nmobilities> mobilities = { &mobility_};
534 for (
int i = 0; i < 3; ++i) {
535 mobilities[nmobilities] = &(dirMob_->getArray(i));
539 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
543 const auto [b, mu] =
getFluidSystem().inverseFormationVolumeFactorAndViscosity(fluidState_, phaseIdx, pvtRegionIdx);
544 fluidState_.setInvB(phaseIdx, b);
545 for (
int i = 0; i < nmobilities; ++i) {
546 if constexpr (enableExtbo) {
547 if (phaseIdx == oilPhaseIdx) {
548 (*mobilities[i])[phaseIdx] /= asImp_().oilViscosity();
550 else if (phaseIdx == gasPhaseIdx) {
551 (*mobilities[i])[phaseIdx] /= asImp_().gasViscosity();
554 (*mobilities[i])[phaseIdx] /= mu;
558 (*mobilities[i])[phaseIdx] /= mu;
562 Valgrind::CheckDefined(mobility_);
567 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
572 rho = fluidState_.invB(waterPhaseIdx);
573 rho *=
getFluidSystem().referenceDensity(waterPhaseIdx, pvtRegionIdx);
575 rho += fluidState_.invB(waterPhaseIdx) *
579 fluidState_.setDensity(waterPhaseIdx, rho);
583 rho = fluidState_.invB(gasPhaseIdx);
584 rho *=
getFluidSystem().referenceDensity(gasPhaseIdx, pvtRegionIdx);
586 rho += fluidState_.invB(gasPhaseIdx) *
591 rho += fluidState_.invB(gasPhaseIdx) *
595 fluidState_.setDensity(gasPhaseIdx, rho);
599 rho = fluidState_.invB(oilPhaseIdx);
600 rho *=
getFluidSystem().referenceDensity(oilPhaseIdx, pvtRegionIdx);
602 rho += fluidState_.invB(oilPhaseIdx) *
606 fluidState_.setDensity(oilPhaseIdx, rho);
610 OPM_HOST_DEVICE
void updatePorosity(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
612 const auto& problem = elemCtx.problem();
613 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
614 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
616 referencePorosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
622 const PrimaryVariables& priVars,
623 const unsigned globalSpaceIdx,
624 const unsigned timeIdx)
627 referencePorosity_ = problem.porosity(globalSpaceIdx, timeIdx);
633 const PrimaryVariables& priVars,
634 const unsigned globalSpaceIdx,
635 const unsigned timeIdx)
637 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
640 porosity_ = referencePorosity_;
644 const Scalar rockCompressibility = problem.rockCompressibility(globalSpaceIdx);
645 if (rockCompressibility > 0.0) {
646 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
649 x = rockCompressibility * (fluidState_.pressure(oilPhaseIdx) - rockRefPressure);
652 x = rockCompressibility * (fluidState_.pressure(waterPhaseIdx) - rockRefPressure);
655 x = rockCompressibility * (fluidState_.pressure(gasPhaseIdx) - rockRefPressure);
657 porosity_ *= 1.0 + x + 0.5 * x * x;
661 porosity_ *= problem.template rockCompPoroMultiplier<Evaluation>(*
this, globalSpaceIdx);
664 if constexpr (enableBioeffects) {
665 const Evaluation biofilm_ = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx,
666 timeIdx, linearizationType);
667 Evaluation calcite_ = 0.0;
668 if constexpr (enableMICP) {
669 calcite_ = priVars.makeEvaluation(Indices::calciteVolumeFractionIdx, timeIdx, linearizationType);
671 porosity_ -= min(biofilm_ + calcite_, referencePorosity_ - 1e-8);
675 if (enableSaltPrecipitation && priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
676 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
677 porosity_ *= (1.0 - Sp);
682 if constexpr (enableMech) {
684 if (problem.simulator().vanguard().eclState().runspec().mechSolver().tpsa()) {
686 const Scalar rockBiot = problem.rockBiotComp(globalSpaceIdx);
687 if (rockBiot > 0.0) {
688 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
689 Evaluation active_pressure;
690 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
691 active_pressure = fluidState_.pressure(oilPhaseIdx) - rockRefPressure;
692 }
else if (FluidSystem::phaseIsActive(waterPhaseIdx)){
693 active_pressure = fluidState_.pressure(waterPhaseIdx) - rockRefPressure;
695 active_pressure = fluidState_.pressure(gasPhaseIdx) - rockRefPressure;
697 porosity_ += rockBiot * active_pressure;
700 if constexpr (energyModuleType == EnergyModules::FullyImplicitThermal) {
701 const Scalar rockBiotTemp = problem.rockBiotTemp(globalSpaceIdx);
702 if (rockBiotTemp != 0.0) {
703 const Scalar rockRefTemp = problem.rockReferenceTemperature();
704 Evaluation active_temp = fluidState_.temperature(0) -
706 porosity_ += rockBiotTemp * active_temp;
711 porosity_ += problem.rockMechPoroChange(globalSpaceIdx, timeIdx);
719 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
724 assert(isfinite(fluidState_.density(phaseIdx)));
725 assert(isfinite(fluidState_.saturation(phaseIdx)));
726 assert(isfinite(fluidState_.temperature(phaseIdx)));
727 assert(isfinite(fluidState_.pressure(phaseIdx)));
728 assert(isfinite(fluidState_.invB(phaseIdx)));
730 assert(isfinite(fluidState_.Rs()));
731 assert(isfinite(fluidState_.Rv()));
737 template <
class ...Args>
738 OPM_HOST_DEVICE
void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
740 ParentType::update(elemCtx, dofIdx, timeIdx);
741 const auto& problem = elemCtx.problem();
742 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
743 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
751 if constexpr (enableSolvent) {
752 asImp_().solventPvtUpdate_(elemCtx, dofIdx, timeIdx);
754 if constexpr (enableExtbo) {
755 asImp_().zPvtUpdate_();
757 if constexpr (enablePolymer) {
758 asImp_().polymerPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
760 if constexpr (energyModuleType == EnergyModules::FullyImplicitThermal) {
761 asImp_().updateEnergyQuantities_(elemCtx, dofIdx, timeIdx);
763 if constexpr (enableFoam) {
764 asImp_().foamPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
766 if constexpr (enableBioeffects) {
767 asImp_().bioeffectsPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
769 if constexpr (enableBrine) {
770 asImp_().saltPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
772 if constexpr (enableConvectiveMixing) {
775 if (!problem.simulator().vanguard().eclState().getIOConfig().initOnly()) {
776 if (problem.simulator().vanguard().eclState().runspec().co2Storage()) {
777 if (problem.drsdtconIsActive(globalSpaceIdx, problem.simulator().episodeIndex())) {
778 asImp_().updateSaturatedDissolutionFactor_();
786 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
789 if constexpr (enableDiffusion) {
790 DiffusionIntensiveQuantities::update_(fluidState_, priVars.pvtRegionIndex(), elemCtx, dofIdx, timeIdx);
794 if constexpr (enableDispersion) {
795 DispersionIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
799 template <
class ...Args>
801 const PrimaryVariables& priVars,
802 const unsigned globalSpaceIdx,
803 const unsigned timeIdx)
807 static_assert(!enableSolvent);
808 static_assert(!enableExtbo);
809 static_assert(!enablePolymer);
810 static_assert(!enableFoam);
811 static_assert(!enableMICP);
812 static_assert(!enableBrine);
813 static_assert(!enableDiffusion);
814 static_assert(!enableDispersion);
816 this->extrusionFactor_ = 1.0;
825 template <
class ...Args>
827 const PrimaryVariables& priVars,
828 const unsigned globalSpaceIdx,
829 const unsigned timeIdx)
831 OPM_TIMEBLOCK_LOCAL(blackoilIntensiveQuanititiesUpdate, Subsystem::SatProps | Subsystem::PvtProps);
833 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
834 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
836 fluidState_.setPvtRegionIndex(pvtRegionIdx);
838 updateTempSalt(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
843 if constexpr (enableExtbo) {
844 asImp_().zFractionUpdate_(priVars, timeIdx);
851 rockCompTransMultiplier_ = problem.template rockCompTransMultiplier<Evaluation>(*
this, globalSpaceIdx);
862 {
return fluidState_; }
866 {
return fluidState_; }
871 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx)
const
872 {
return mobility_[phaseIdx]; }
874 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx, FaceDir::DirEnum facedir)
const
876 using Dir = FaceDir::DirEnum;
878 bool constexpr usesStaticFluidSystem = std::is_empty_v<FluidSystem>;
879 if constexpr (usesStaticFluidSystem)
884 return dirMob_->getArray(0)[phaseIdx];
887 return dirMob_->getArray(1)[phaseIdx];
890 return dirMob_->getArray(2)[phaseIdx];
892 OPM_THROW(std::runtime_error,
"Unexpected face direction");
896 OPM_THROW(std::logic_error,
"Directional mobility with non-static fluid system is not supported yet");
900 return mobility_[phaseIdx];
908 {
return porosity_; }
914 {
return rockCompTransMultiplier_; }
924 {
return fluidState_.pvtRegionIndex(); }
932 return fluidState_.viscosity(phaseIdx) *
mobility(phaseIdx);
942 {
return referencePorosity_; }
946 if constexpr (enableBioeffects) {
947 return BioeffectsIntQua::permFactor();
949 else if constexpr (enableSaltPrecipitation) {
950 return BrineIntQua::permFactor();
953 OPM_THROW(std::logic_error,
"permFactor() called but salt precipitation and bioeffects are disabled");
962 return fluidState_.fluidSystem();
974 OPM_HOST_DEVICE Implementation& asImp_()
975 {
return *
static_cast<Implementation*
>(
this); }
978 Scalar referencePorosity_;
979 Evaluation porosity_;
980 Evaluation rockCompTransMultiplier_;
981 std::array<Evaluation, numPhases> mobility_;
998 DirectionalMobilityPtr dirMob_;
Classes required for molecular diffusion.
Classes required for mechanical dispersion.
Contains the classes required to extend the black-oil model by energy.
Contains classes extending the black-oil model. \detail This file holds dummy definitions,...
Contains the classes required to extend the black-oil model by polymer.
Declares the properties required by the black oil model.
Provides the volumetric quantities required for the equations needed by the brine extension of the bl...
Provides the volumetric quantities required for the equations needed by the bioeffects extension of t...
Provides the volumetric quantities required for the equations needed by the convective mixing (DRSDTC...
Provides the volumetric quantities required for the calculation of molecular diffusive fluxes.
Provides the volumetric quantities required for the calculation of dispersive fluxes.
Provides the volumetric quantities required for the equations needed by the energys extension of the ...
Definition: blackoilmodules.hpp:68
Provides the volumetric quantities required for the equations needed by the solvents extension of the...
Provides the volumetric quantities required for the equations needed by the polymers extension of the...
Contains the quantities which are are constant within a finite volume in the black-oil model.
Definition: blackoilintensivequantities.hh:84
OPM_HOST_DEVICE void updatePorosityImpl(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:632
OPM_HOST_DEVICE void update(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilintensivequantities.hh:738
OPM_HOST_DEVICE void updateSaturations(const PrimaryVariables &priVars, const unsigned timeIdx, const LinearizationType lintype)
Definition: blackoilintensivequantities.hh:257
OPM_HOST_DEVICE void updateCommonPart(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:826
BlackOilIntensiveQuantities(const BlackOilIntensiveQuantities< OtherTypeTag > &other, const FluidSystem &fsystem)
Definition: blackoilintensivequantities.hh:187
OPM_HOST_DEVICE Scalar referencePorosity() const
Returns the porosity of the rock at reference conditions.
Definition: blackoilintensivequantities.hh:941
OPM_HOST_DEVICE void updateMobilityAndInvB()
Definition: blackoilintensivequantities.hh:524
OPM_HOST_DEVICE BlackOilIntensiveQuantities & operator=(const BlackOilIntensiveQuantities &other)=default
auto withOtherFluidSystem(const GetPropType< OtherTypeTag, Properties::FluidSystem > &other) const
Definition: blackoilintensivequantities.hh:211
OPM_HOST_DEVICE auto pvtRegionIndex() const -> decltype(std::declval< FluidState >().pvtRegionIndex())
Returns the index of the PVT region used to calculate the thermodynamic quantities.
Definition: blackoilintensivequantities.hh:923
OPM_HOST_DEVICE const Evaluation & mobility(unsigned phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:871
OPM_HOST_DEVICE void updatePorosity(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilintensivequantities.hh:610
OPM_HOST_DEVICE void updatePhaseDensities()
Definition: blackoilintensivequantities.hh:565
OPM_HOST_DEVICE void updateRelpermAndPressures(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx, const LinearizationType &lintype)
Definition: blackoilintensivequantities.hh:329
OPM_HOST_DEVICE FluidState & fluidState()
Definition: blackoilintensivequantities.hh:865
OPM_HOST_DEVICE void update(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:800
OPM_HOST_DEVICE void updateTempSalt(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx, const LinearizationType &lintype)
Definition: blackoilintensivequantities.hh:243
OPM_HOST_DEVICE const auto & getFluidSystem() const
Returns the fluid system used by this intensive quantities.
Definition: blackoilintensivequantities.hh:960
GetPropType< TypeTag, Properties::Problem > Problem
Definition: blackoilintensivequantities.hh:164
BlackOilFluidState< Scalar, FluidSystem, energyModuleType !=EnergyModules::NoTemperature, energyModuleType==EnergyModules::FullyImplicitThermal, compositionSwitchEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, enableDisgasInWater, enableSolvent, Indices::numPhases > ScalarFluidState
Definition: blackoilintensivequantities.hh:163
OPM_HOST_DEVICE const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: blackoilintensivequantities.hh:861
OPM_HOST_DEVICE Evaluation relativePermeability(unsigned phaseIdx) const
Returns the relative permeability of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:929
BlackOilIntensiveQuantities(const BlackOilIntensiveQuantities &other)=default
OPM_HOST_DEVICE const Evaluation & permFactor() const
Definition: blackoilintensivequantities.hh:944
OPM_HOST_DEVICE BlackOilIntensiveQuantities()
Definition: blackoilintensivequantities.hh:166
void overlayBlackOilFieldsFrom(const BlackOilIntensiveQuantities< OtherTypeTag > &other)
Field-by-field overlay of the BlackOil intensive-quantity values from another BlackOilIntensiveQuanti...
Definition: blackoilintensivequantities.hh:226
OPM_HOST_DEVICE const Evaluation & rockCompTransMultiplier() const
Definition: blackoilintensivequantities.hh:913
OPM_HOST_DEVICE void assertFiniteMembers()
Definition: blackoilintensivequantities.hh:716
OPM_HOST_DEVICE const Evaluation & mobility(unsigned phaseIdx, FaceDir::DirEnum facedir) const
Definition: blackoilintensivequantities.hh:874
OPM_HOST_DEVICE void updatePorosity(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:621
OPM_HOST_DEVICE const Evaluation & porosity() const
Returns the average porosity within the control volume.
Definition: blackoilintensivequantities.hh:907
BlackOilFluidState< Evaluation, FluidSystem, energyModuleType !=EnergyModules::NoTemperature, energyModuleType==EnergyModules::FullyImplicitThermal, compositionSwitchEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, enableDisgasInWater, enableSolvent, Indices::numPhases > FluidState
Definition: blackoilintensivequantities.hh:152
OPM_HOST_DEVICE void updateRsRvRsw(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:421
Provides the volumetric quantities required for the equations needed by the polymers extension of the...
Provides the volumetric quantities required for the equations needed by the solvents extension of the...
This file contains definitions related to directional mobilities.
Definition: blackoilbioeffectsmodules.hh:45
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
Definition: linearizationtype.hh:34