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> 48 #include <opm/utility/CopyablePtr.hpp> 66 template <
class TypeTag>
68 :
public GetPropType<TypeTag, Properties::DiscIntensiveQuantities>
69 ,
public GetPropType<TypeTag, Properties::FluxModule>::FluxIntensiveQuantities
76 ,
public BlackOilBrineIntensiveQuantities<TypeTag, getPropValue<TypeTag, Properties::EnableBrine>()>
93 enum { enableVapwat = getPropValue<TypeTag, Properties::EnableVapwat>() };
94 enum { enableDisgasInWater = getPropValue<TypeTag, Properties::EnableDisgasInWater>() };
95 enum { enableSaltPrecipitation = getPropValue<TypeTag, Properties::EnableSaltPrecipitation>() };
96 static constexpr EnergyModules energyModuleType = getPropValue<TypeTag, Properties::EnergyModuleType>();
98 static constexpr
bool enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
99 static constexpr
bool enableBrine = getPropValue<TypeTag, Properties::EnableBrine>();
100 static constexpr
bool enableConvectiveMixing = getPropValue<TypeTag, Properties::EnableConvectiveMixing>();
101 static constexpr
bool enableDiffusion = getPropValue<TypeTag, Properties::EnableDiffusion>();
102 static constexpr
bool enableDispersion = getPropValue<TypeTag, Properties::EnableDispersion>();
103 static constexpr
bool enableExtbo = getPropValue<TypeTag, Properties::EnableExtbo>();
104 static constexpr
bool enableFoam = getPropValue<TypeTag, Properties::EnableFoam>();
105 static constexpr
bool enablePolymer = getPropValue<TypeTag, Properties::EnablePolymer>();
106 static constexpr
bool enableSolvent = getPropValue<TypeTag, Properties::EnableSolvent>();
107 static constexpr
bool enableTemperature = energyModuleType != EnergyModules::NoTemperature;
109 enum { enableMech = getPropValue<TypeTag, Properties::EnableMech>() };
110 enum { enableMICP = Indices::enableMICP };
111 enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
112 enum { waterCompIdx = FluidSystem::waterCompIdx };
113 enum { oilCompIdx = FluidSystem::oilCompIdx };
114 enum { gasCompIdx = FluidSystem::gasCompIdx };
115 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
116 enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
117 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
118 static constexpr
unsigned compositionSwitchIdx = Indices::compositionSwitchIdx;
120 static constexpr
bool compositionSwitchEnabled =
121 Indices::compositionSwitchIdx != std::numeric_limits<unsigned>::max();
122 static constexpr
bool waterEnabled = Indices::waterEnabled;
123 static constexpr
bool gasEnabled = Indices::gasEnabled;
124 static constexpr
bool oilEnabled = Indices::oilEnabled;
126 using Toolbox = MathToolbox<Evaluation>;
127 using FluxIntensiveQuantities =
typename FluxModule::FluxIntensiveQuantities;
131 using DirectionalMobilityPtr = Utility::CopyablePtr<DirectionalMobility<TypeTag>>;
132 using BrineModule = BlackOilBrineModule<TypeTag, enableBrine>;
133 using BrineIntQua = BlackOilBrineIntensiveQuantities<TypeTag, enableSaltPrecipitation>;
134 using BioeffectsModule = BlackOilBioeffectsModule<TypeTag, enableBioeffects>;
138 using FluidState = BlackOilFluidState<Evaluation,
140 energyModuleType != EnergyModules::NoTemperature,
141 energyModuleType == EnergyModules::FullyImplicitThermal,
142 compositionSwitchEnabled,
145 enableSaltPrecipitation,
149 using ScalarFluidState = BlackOilFluidState<Scalar,
151 energyModuleType != EnergyModules::NoTemperature,
152 energyModuleType == EnergyModules::FullyImplicitThermal,
153 compositionSwitchEnabled,
156 enableSaltPrecipitation,
164 if constexpr (compositionSwitchEnabled) {
165 fluidState_.setRs(0.0);
166 fluidState_.setRv(0.0);
168 if constexpr (enableVapwat) {
169 fluidState_.setRvw(0.0);
171 if constexpr (enableDisgasInWater) {
172 fluidState_.setRsw(0.0);
178 template<
class OtherTypeTag>
182 template<
class OtherTypeTag>
185 : fluidState_(other.fluidState_.template withOtherFluidSystem<FluidSystem>(fsystem))
188 , referencePorosity_(other.referencePorosity_)
189 , porosity_(other.porosity_)
190 , rockCompTransMultiplier_(other.rockCompTransMultiplier_)
191 , mobility_(other.mobility_)
206 template <
class OtherTypeTag>
213 OPM_HOST_DEVICE
void updateTempSalt(
const Problem& problem,
214 const PrimaryVariables& priVars,
215 const unsigned globalSpaceIdx,
216 const unsigned timeIdx,
219 if constexpr (enableTemperature) {
220 asImp_().updateTemperature_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
222 if constexpr (enableBrine) {
223 asImp_().updateSaltConcentration_(priVars, timeIdx, lintype);
227 OPM_HOST_DEVICE
void updateSaturations(
const PrimaryVariables& priVars,
228 const unsigned timeIdx,
233 if constexpr (waterEnabled) {
234 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
235 assert(Indices::waterSwitchIdx != std::numeric_limits<unsigned>::max());
236 if constexpr (Indices::waterSwitchIdx != std::numeric_limits<unsigned>::max()) {
237 Sw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
240 else if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw ||
241 priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Disabled)
249 if constexpr (gasEnabled) {
250 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg) {
251 assert(Indices::compositionSwitchIdx != std::numeric_limits<unsigned>::max());
252 if constexpr (compositionSwitchEnabled) {
253 Sg = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
256 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
259 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Disabled) {
260 if constexpr (waterEnabled) {
268 Valgrind::CheckDefined(Sg);
269 Valgrind::CheckDefined(Sw);
271 Evaluation So = 1.0 - Sw - Sg;
274 if constexpr (enableSolvent) {
275 if (priVars.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
277 So -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
280 Sg -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
286 fluidState_.setSaturation(waterPhaseIdx, Sw);
290 fluidState_.setSaturation(gasPhaseIdx, Sg);
294 fluidState_.setSaturation(oilPhaseIdx, So);
298 template <
class ...Args>
299 OPM_HOST_DEVICE
void updateRelpermAndPressures(
const Problem& problem,
300 const PrimaryVariables& priVars,
301 const unsigned globalSpaceIdx,
302 const unsigned timeIdx,
310 if constexpr (enableSolvent) {
311 asImp_().solventPreSatFuncUpdate_(priVars, timeIdx, lintype);
315 problem.template updateRelperms<FluidState, Args...>(mobility_, dirMob_, fluidState_, globalSpaceIdx);
318 using EvalArr = std::array<Evaluation, numPhases>;
320 const auto& materialParams = problem.materialLawParams(globalSpaceIdx);
321 MaterialLaw::template capillaryPressures<EvalArr, FluidState, Args...>(pC, materialParams, fluidState_);
324 if constexpr (enableBrine) {
325 if (BrineModule::hasPcfactTables() &&
326 priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)
328 const unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
329 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
330 const Evaluation porosityFactor = min(1.0 - Sp, 1.0);
331 const auto& pcfactTable = BrineModule::pcfactTable(satnumRegionIdx);
332 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
333 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
335 pC[phaseIdx] *= pcFactor;
340 else if constexpr (enableBioeffects) {
341 if (BioeffectsModule::hasPcfactTables() && referencePorosity_ > 0) {
342 unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
343 const Evaluation Sb = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx, timeIdx);
344 const Evaluation porosityFactor = min(1.0 - Sb/referencePorosity_, 1.0);
345 const auto& pcfactTable = BioeffectsModule::pcfactTable(satnumRegionIdx);
346 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
347 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
349 pC[phaseIdx] *= pcFactor;
356 if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pg) {
357 const Evaluation& pg = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
358 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
360 fluidState_.setPressure(phaseIdx, pg + (pC[phaseIdx] - pC[gasPhaseIdx]));
364 else if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pw) {
365 const Evaluation& pw = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
366 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
368 fluidState_.setPressure(phaseIdx, pw + (pC[phaseIdx] - pC[waterPhaseIdx]));
374 const Evaluation& po = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
375 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
377 fluidState_.setPressure(phaseIdx, po + (pC[phaseIdx] - pC[oilPhaseIdx]));
386 if constexpr (enableSolvent) {
387 asImp_().solventPostSatFuncUpdate_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
391 OPM_HOST_DEVICE
void updateRsRvRsw(
const Problem& problem,
392 const PrimaryVariables& priVars,
393 const unsigned globalSpaceIdx,
394 const unsigned timeIdx)
396 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
399 ? problem.maxOilVaporizationFactor(timeIdx, globalSpaceIdx)
402 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
404 const Scalar RswMax =
getFluidSystem().enableDissolvedGasInWater()
405 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
408 Evaluation SoMax = 0.0;
410 SoMax = max(fluidState_.saturation(oilPhaseIdx),
411 problem.maxOilSaturation(globalSpaceIdx));
417 if constexpr (compositionSwitchEnabled) {
418 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rs) {
419 const auto& Rs = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
420 fluidState_.setRs(Rs);
425 if constexpr (enableExtbo) {
426 RsSat = asImp_().rs();
433 fluidState_.setRs(min(RsMax, RsSat));
436 fluidState_.setRs(0.0);
440 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
441 const auto& Rv = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
442 fluidState_.setRv(Rv);
447 if constexpr (enableExtbo) {
448 RvSat = asImp_().rv();
455 fluidState_.setRv(min(RvMax, RvSat));
458 fluidState_.setRv(0.0);
463 if constexpr (enableVapwat) {
464 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rvw) {
465 const auto& Rvw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
466 fluidState_.setRvw(Rvw);
470 const Evaluation& RvwSat =
getFluidSystem().saturatedVaporizationFactor(fluidState_,
473 fluidState_.setRvw(RvwSat);
478 if constexpr (enableDisgasInWater) {
479 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw) {
480 const auto& Rsw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
481 fluidState_.setRsw(Rsw);
485 const Evaluation& RswSat =
getFluidSystem().saturatedDissolutionFactor(fluidState_,
488 fluidState_.setRsw(min(RswMax, RswSat));
494 OPM_HOST_DEVICE
void updateMobilityAndInvB()
496 OPM_TIMEBLOCK_LOCAL(updateMobilityAndInvB, Subsystem::PvtProps);
497 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
501 constexpr
int max_nmobilities = 4;
502 std::array<std::array<Evaluation, numPhases>*, max_nmobilities> mobilities = { &mobility_};
504 for (
int i = 0; i < 3; ++i) {
505 mobilities[nmobilities] = &(dirMob_->getArray(i));
509 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
513 const auto [b, mu] =
getFluidSystem().inverseFormationVolumeFactorAndViscosity(fluidState_, phaseIdx, pvtRegionIdx);
514 fluidState_.setInvB(phaseIdx, b);
515 for (
int i = 0; i < nmobilities; ++i) {
516 if constexpr (enableExtbo) {
517 if (phaseIdx == oilPhaseIdx) {
518 (*mobilities[i])[phaseIdx] /= asImp_().oilViscosity();
520 else if (phaseIdx == gasPhaseIdx) {
521 (*mobilities[i])[phaseIdx] /= asImp_().gasViscosity();
524 (*mobilities[i])[phaseIdx] /= mu;
528 (*mobilities[i])[phaseIdx] /= mu;
532 Valgrind::CheckDefined(mobility_);
535 OPM_HOST_DEVICE
void updatePhaseDensities()
537 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
542 rho = fluidState_.invB(waterPhaseIdx);
543 rho *=
getFluidSystem().referenceDensity(waterPhaseIdx, pvtRegionIdx);
545 rho += fluidState_.invB(waterPhaseIdx) *
549 fluidState_.setDensity(waterPhaseIdx, rho);
553 rho = fluidState_.invB(gasPhaseIdx);
554 rho *=
getFluidSystem().referenceDensity(gasPhaseIdx, pvtRegionIdx);
556 rho += fluidState_.invB(gasPhaseIdx) *
561 rho += fluidState_.invB(gasPhaseIdx) *
565 fluidState_.setDensity(gasPhaseIdx, rho);
569 rho = fluidState_.invB(oilPhaseIdx);
570 rho *=
getFluidSystem().referenceDensity(oilPhaseIdx, pvtRegionIdx);
572 rho += fluidState_.invB(oilPhaseIdx) *
576 fluidState_.setDensity(oilPhaseIdx, rho);
580 OPM_HOST_DEVICE
void updatePorosity(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
582 const auto& problem = elemCtx.problem();
583 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
584 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
586 referencePorosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
588 this->updatePorosityImpl(problem, priVars, globalSpaceIdx, timeIdx);
591 OPM_HOST_DEVICE
void updatePorosity(
const Problem& problem,
592 const PrimaryVariables& priVars,
593 const unsigned globalSpaceIdx,
594 const unsigned timeIdx)
597 referencePorosity_ = problem.porosity(globalSpaceIdx, timeIdx);
599 this->updatePorosityImpl(problem, priVars, globalSpaceIdx, timeIdx);
602 OPM_HOST_DEVICE
void updatePorosityImpl(
const Problem& problem,
603 const PrimaryVariables& priVars,
604 const unsigned globalSpaceIdx,
605 const unsigned timeIdx)
607 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
610 porosity_ = referencePorosity_;
614 const Scalar rockCompressibility = problem.rockCompressibility(globalSpaceIdx);
615 if (rockCompressibility > 0.0) {
616 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
619 x = rockCompressibility * (fluidState_.pressure(oilPhaseIdx) - rockRefPressure);
622 x = rockCompressibility * (fluidState_.pressure(waterPhaseIdx) - rockRefPressure);
625 x = rockCompressibility * (fluidState_.pressure(gasPhaseIdx) - rockRefPressure);
627 porosity_ *= 1.0 + x + 0.5 * x * x;
631 porosity_ *= problem.template rockCompPoroMultiplier<Evaluation>(*
this, globalSpaceIdx);
634 if constexpr (enableBioeffects) {
635 const Evaluation biofilm_ = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx,
636 timeIdx, linearizationType);
637 Evaluation calcite_ = 0.0;
638 if constexpr (enableMICP) {
639 calcite_ = priVars.makeEvaluation(Indices::calciteVolumeFractionIdx, timeIdx, linearizationType);
641 porosity_ -= min(biofilm_ + calcite_, referencePorosity_ - 1e-8);
645 if (enableSaltPrecipitation && priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
646 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
647 porosity_ *= (1.0 - Sp);
652 if constexpr (enableMech) {
654 if (problem.simulator().vanguard().eclState().runspec().mechSolver().tpsa()) {
656 const Scalar rockBiot = problem.rockBiotComp(globalSpaceIdx);
657 if (rockBiot > 0.0) {
658 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
659 Evaluation active_pressure;
660 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
661 active_pressure = fluidState_.pressure(oilPhaseIdx) - rockRefPressure;
662 }
else if (FluidSystem::phaseIsActive(waterPhaseIdx)){
663 active_pressure = fluidState_.pressure(waterPhaseIdx) - rockRefPressure;
665 active_pressure = fluidState_.pressure(gasPhaseIdx) - rockRefPressure;
667 porosity_ += rockBiot * active_pressure;
671 porosity_ += problem.rockMechPoroChange(globalSpaceIdx, timeIdx);
676 OPM_HOST_DEVICE
void assertFiniteMembers()
679 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
684 assert(isfinite(fluidState_.density(phaseIdx)));
685 assert(isfinite(fluidState_.saturation(phaseIdx)));
686 assert(isfinite(fluidState_.temperature(phaseIdx)));
687 assert(isfinite(fluidState_.pressure(phaseIdx)));
688 assert(isfinite(fluidState_.invB(phaseIdx)));
690 assert(isfinite(fluidState_.Rs()));
691 assert(isfinite(fluidState_.Rv()));
697 template <
class ...Args>
698 OPM_HOST_DEVICE
void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
700 ParentType::update(elemCtx, dofIdx, timeIdx);
701 const auto& problem = elemCtx.problem();
702 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
703 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
705 updateCommonPart<Args...>(problem, priVars, globalSpaceIdx, timeIdx);
707 updatePorosity(elemCtx, dofIdx, timeIdx);
711 if constexpr (enableSolvent) {
712 asImp_().solventPvtUpdate_(elemCtx, dofIdx, timeIdx);
714 if constexpr (enableExtbo) {
715 asImp_().zPvtUpdate_();
717 if constexpr (enablePolymer) {
718 asImp_().polymerPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
720 if constexpr (energyModuleType == EnergyModules::FullyImplicitThermal) {
721 asImp_().updateEnergyQuantities_(elemCtx, dofIdx, timeIdx);
723 if constexpr (enableFoam) {
724 asImp_().foamPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
726 if constexpr (enableBioeffects) {
727 asImp_().bioeffectsPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
729 if constexpr (enableBrine) {
730 asImp_().saltPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
732 if constexpr (enableConvectiveMixing) {
735 if (!problem.simulator().vanguard().eclState().getIOConfig().initOnly()) {
736 if (problem.simulator().vanguard().eclState().runspec().co2Storage()) {
737 if (problem.drsdtconIsActive(globalSpaceIdx, problem.simulator().episodeIndex())) {
738 asImp_().updateSaturatedDissolutionFactor_();
746 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
749 if constexpr (enableDiffusion) {
750 DiffusionIntensiveQuantities::update_(fluidState_, priVars.pvtRegionIndex(), elemCtx, dofIdx, timeIdx);
754 if constexpr (enableDispersion) {
755 DispersionIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
759 template <
class ...Args>
760 OPM_HOST_DEVICE
void update(
const Problem& problem,
761 const PrimaryVariables& priVars,
762 const unsigned globalSpaceIdx,
763 const unsigned timeIdx)
767 static_assert(!enableSolvent);
768 static_assert(!enableExtbo);
769 static_assert(!enablePolymer);
770 static_assert(!enableFoam);
771 static_assert(!enableMICP);
772 static_assert(!enableBrine);
773 static_assert(!enableDiffusion);
774 static_assert(!enableDispersion);
776 this->extrusionFactor_ = 1.0;
777 updateCommonPart<Args...>(problem, priVars, globalSpaceIdx, timeIdx);
779 updatePorosity(problem, priVars, globalSpaceIdx, timeIdx);
785 template <
class ...Args>
786 OPM_HOST_DEVICE
void updateCommonPart(
const Problem& problem,
787 const PrimaryVariables& priVars,
788 const unsigned globalSpaceIdx,
789 const unsigned timeIdx)
791 OPM_TIMEBLOCK_LOCAL(blackoilIntensiveQuanititiesUpdate, Subsystem::SatProps | Subsystem::PvtProps);
793 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
794 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
796 fluidState_.setPvtRegionIndex(pvtRegionIdx);
798 updateTempSalt(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
799 updateSaturations(priVars, timeIdx, linearizationType);
800 updateRelpermAndPressures<Args...>(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
803 if constexpr (enableExtbo) {
804 asImp_().zFractionUpdate_(priVars, timeIdx);
807 updateRsRvRsw(problem, priVars, globalSpaceIdx, timeIdx);
808 updateMobilityAndInvB();
809 updatePhaseDensities();
811 rockCompTransMultiplier_ = problem.template rockCompTransMultiplier<Evaluation>(*
this, globalSpaceIdx);
814 assertFiniteMembers();
822 {
return fluidState_; }
826 {
return fluidState_; }
831 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx)
const 832 {
return mobility_[phaseIdx]; }
834 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx, FaceDir::DirEnum facedir)
const 836 using Dir = FaceDir::DirEnum;
838 bool constexpr usesStaticFluidSystem = std::is_empty_v<FluidSystem>;
839 if constexpr (usesStaticFluidSystem)
844 return dirMob_->getArray(0)[phaseIdx];
847 return dirMob_->getArray(1)[phaseIdx];
850 return dirMob_->getArray(2)[phaseIdx];
852 OPM_THROW(std::runtime_error,
"Unexpected face direction");
856 OPM_THROW(std::logic_error,
"Directional mobility with non-static fluid system is not supported yet");
860 return mobility_[phaseIdx];
868 {
return porosity_; }
874 {
return rockCompTransMultiplier_; }
884 {
return fluidState_.pvtRegionIndex(); }
892 return fluidState_.viscosity(phaseIdx) *
mobility(phaseIdx);
902 {
return referencePorosity_; }
904 OPM_HOST_DEVICE
const Evaluation& permFactor()
const 906 if constexpr (enableBioeffects) {
907 return BioeffectsIntQua::permFactor();
909 else if constexpr (enableSaltPrecipitation) {
910 return BrineIntQua::permFactor();
913 OPM_THROW(std::logic_error,
"permFactor() called but salt precipitation and bioeffects are disabled");
922 return fluidState_.fluidSystem();
931 friend BlackOilBrineIntensiveQuantities<TypeTag, enableBrine>;
934 OPM_HOST_DEVICE Implementation& asImp_()
935 {
return *
static_cast<Implementation*
>(
this); }
937 FluidState fluidState_;
938 Scalar referencePorosity_;
939 Evaluation porosity_;
940 Evaluation rockCompTransMultiplier_;
941 std::array<Evaluation, numPhases> mobility_;
958 DirectionalMobilityPtr dirMob_;
Provides the volumetric quantities required for the equations needed by the convective mixing (DRSDTC...
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
OPM_HOST_DEVICE const Evaluation & porosity() const
Returns the average porosity within the control volume.
Definition: blackoilintensivequantities.hh:867
OPM_HOST_DEVICE Evaluation relativePermeability(unsigned phaseIdx) const
Returns the relative permeability of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:889
Provides the volumetric quantities required for the calculation of molecular diffusive fluxes...
Contains the quantities which are are constant within a finite volume in the black-oil model...
Definition: blackoilintensivequantities.hh:67
OPM_HOST_DEVICE const Evaluation & rockCompTransMultiplier() const
The pressure-dependent transmissibility multiplier due to rock compressibility.
Definition: blackoilintensivequantities.hh:873
Structs needed for tpfalinearizer and its gpuparams struct extracted to be defined in one place that ...
Definition: blackoilbioeffectsmodules.hh:45
Contains classes extending the black-oil model.
Declares the properties required by the black oil model.
Provides the volumetric quantities required for the equations needed by the energys extension of the ...
Definition: blackoilmodules.hpp:67
OPM_HOST_DEVICE const auto & getFluidSystem() const
Returns the fluid system used by this intensive quantities.
Definition: blackoilintensivequantities.hh:920
Definition: linearizationtype.hh:33
OPM_HOST_DEVICE const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: blackoilintensivequantities.hh:821
Provides the volumetric quantities required for the calculation of dispersive fluxes.
The common code for the linearizers of non-linear systems of equations.
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 polymers extension of the...
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:883
OPM_HOST_DEVICE void update(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilintensivequantities.hh:698
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 solvents extension of the...
This file contains definitions related to directional mobilities.
OPM_HOST_DEVICE const Evaluation & mobility(unsigned phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:831
Provides the volumetric quantities required for the equations needed by the bioeffects extension of t...
OPM_HOST_DEVICE Scalar referencePorosity() const
Returns the porosity of the rock at reference conditions.
Definition: blackoilintensivequantities.hh:901