74class BlackOilIntensiveQuantities
75 :
public GetPropType<TypeTag, Properties::DiscIntensiveQuantities>
76 ,
public GetPropType<TypeTag, Properties::FluxModule>::FluxIntensiveQuantities
114 enum { enableMICP = Indices::enableMICP };
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 enum { compositionSwitchIdx = Indices::compositionSwitchIdx };
124 static constexpr bool compositionSwitchEnabled = Indices::compositionSwitchIdx >= 0;
125 static constexpr bool waterEnabled = Indices::waterEnabled;
126 static constexpr bool gasEnabled = Indices::gasEnabled;
127 static constexpr bool oilEnabled = Indices::oilEnabled;
129 using Toolbox = MathToolbox<Evaluation>;
130 using FluxIntensiveQuantities =
typename FluxModule::FluxIntensiveQuantities;
134 using DirectionalMobilityPtr = Utility::CopyablePtr<DirectionalMobility<TypeTag>>;
141 using FluidState = BlackOilFluidState<Evaluation,
143 energyModuleType != EnergyModules::NoTemperature,
144 energyModuleType == EnergyModules::FullyImplicitThermal,
145 compositionSwitchEnabled,
148 enableSaltPrecipitation,
152 using ScalarFluidState = BlackOilFluidState<Scalar,
154 energyModuleType != EnergyModules::NoTemperature,
155 energyModuleType == EnergyModules::FullyImplicitThermal,
156 compositionSwitchEnabled,
159 enableSaltPrecipitation,
165 OPM_HOST_DEVICE BlackOilIntensiveQuantities()
167 if constexpr (compositionSwitchEnabled) {
168 fluidState_.setRs(0.0);
169 fluidState_.setRv(0.0);
171 if constexpr (enableVapwat) {
172 fluidState_.setRvw(0.0);
174 if constexpr (enableDisgasInWater) {
175 fluidState_.setRsw(0.0);
178 BlackOilIntensiveQuantities(
const BlackOilIntensiveQuantities& other) =
default;
180 BlackOilIntensiveQuantities& operator=(
const BlackOilIntensiveQuantities& other) =
default;
182 template<
class OtherTypeTag>
183 friend class BlackOilIntensiveQuantities;
186 template<
class OtherTypeTag>
187 explicit BlackOilIntensiveQuantities(
188 const BlackOilIntensiveQuantities<OtherTypeTag>& other,
const FluidSystem& fsystem)
189 : fluidState_(other.fluidState_.withOtherFluidSystem(fsystem))
191 other.rockInternalEnergy_, other.totalThermalConductivity_, other.rockFraction_)
193 other.tortuosities(), other.diffusionCoefficients())
194 , referencePorosity_(other.referencePorosity_)
195 , porosity_(other.porosity_)
196 , rockCompTransMultiplier_(other.rockCompTransMultiplier_)
197 , mobility_(other.mobility_)
200 static_assert(!enableSolvent);
201 static_assert(!enableExtbo);
202 static_assert(!enablePolymer);
203 static_assert(!enableFoam);
204 static_assert(!enableMICP);
205 static_assert(!enableBrine);
206 static_assert(!enableDispersion);
217 template <
class OtherTypeTag>
220 BlackOilIntensiveQuantities<OtherTypeTag> newIntQuants(*
this, other);
224 OPM_HOST_DEVICE
void updateTempSalt(
const Problem& problem,
225 const PrimaryVariables& priVars,
226 const unsigned globalSpaceIdx,
227 const unsigned timeIdx,
230 asImp_().updateTemperature_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
231 if constexpr (enableBrine) {
232 asImp_().updateSaltConcentration_(priVars, timeIdx, lintype);
236 OPM_HOST_DEVICE
void updateSaturations(
const PrimaryVariables& priVars,
237 const unsigned timeIdx,
242 if constexpr (waterEnabled) {
243 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
244 assert(Indices::waterSwitchIdx >= 0);
245 if constexpr (Indices::waterSwitchIdx >= 0) {
246 Sw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
249 else if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw ||
250 priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Disabled)
258 if constexpr (gasEnabled) {
259 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg) {
260 assert(Indices::compositionSwitchIdx >= 0);
261 if constexpr (compositionSwitchEnabled) {
262 Sg = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
265 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
268 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Disabled) {
269 if constexpr (waterEnabled) {
277 Valgrind::CheckDefined(Sg);
278 Valgrind::CheckDefined(Sw);
280 Evaluation So = 1.0 - Sw - Sg;
283 if constexpr (enableSolvent) {
284 if (priVars.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
286 So -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
289 Sg -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
295 fluidState_.setSaturation(waterPhaseIdx, Sw);
299 fluidState_.setSaturation(gasPhaseIdx, Sg);
303 fluidState_.setSaturation(oilPhaseIdx, So);
307 template <
class ...Args>
308 OPM_HOST_DEVICE
void updateRelpermAndPressures(
const Problem& problem,
309 const PrimaryVariables& priVars,
310 const unsigned globalSpaceIdx,
311 const unsigned timeIdx,
319 if constexpr (enableSolvent) {
320 asImp_().solventPreSatFuncUpdate_(priVars, timeIdx, lintype);
324 problem.template updateRelperms<FluidState, Args...>(mobility_, dirMob_, fluidState_, globalSpaceIdx);
327 using EvalArr = std::array<Evaluation, numPhases>;
329 const auto& materialParams = problem.materialLawParams(globalSpaceIdx);
330 MaterialLaw::template capillaryPressures<EvalArr, FluidState, Args...>(pC, materialParams, fluidState_);
333 if constexpr (enableBrine) {
334 if (BrineModule::hasPcfactTables() &&
335 priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)
337 const unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
338 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
339 const Evaluation porosityFactor = min(1.0 - Sp, 1.0);
340 const auto& pcfactTable = BrineModule::pcfactTable(satnumRegionIdx);
341 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
342 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
344 pC[phaseIdx] *= pcFactor;
349 else if constexpr (enableBioeffects) {
350 if (BioeffectsModule::hasPcfactTables() && referencePorosity_ > 0) {
351 unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
352 const Evaluation Sb = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx, timeIdx);
353 const Evaluation porosityFactor = min(1.0 - Sb/referencePorosity_, 1.0);
354 const auto& pcfactTable = BioeffectsModule::pcfactTable(satnumRegionIdx);
355 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
356 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
358 pC[phaseIdx] *= pcFactor;
365 if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pg) {
366 const Evaluation& pg = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
367 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
369 fluidState_.setPressure(phaseIdx, pg + (pC[phaseIdx] - pC[gasPhaseIdx]));
373 else if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pw) {
374 const Evaluation& pw = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
375 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
377 fluidState_.setPressure(phaseIdx, pw + (pC[phaseIdx] - pC[waterPhaseIdx]));
383 const Evaluation& po = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
384 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
386 fluidState_.setPressure(phaseIdx, po + (pC[phaseIdx] - pC[oilPhaseIdx]));
395 if constexpr (enableSolvent) {
396 asImp_().solventPostSatFuncUpdate_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
400 OPM_HOST_DEVICE
void updateRsRvRsw(
const Problem& problem,
401 const PrimaryVariables& priVars,
402 const unsigned globalSpaceIdx,
403 const unsigned timeIdx)
405 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
408 ? problem.maxOilVaporizationFactor(timeIdx, globalSpaceIdx)
411 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
413 const Scalar RswMax =
getFluidSystem().enableDissolvedGasInWater()
414 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
417 Evaluation SoMax = 0.0;
419 SoMax = max(fluidState_.saturation(oilPhaseIdx),
420 problem.maxOilSaturation(globalSpaceIdx));
426 if constexpr (compositionSwitchEnabled) {
427 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rs) {
428 const auto& Rs = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
429 fluidState_.setRs(Rs);
433 const Evaluation& RsSat = enableExtbo ? asImp_().rs() :
438 fluidState_.setRs(min(RsMax, RsSat));
441 fluidState_.setRs(0.0);
445 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
446 const auto& Rv = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
447 fluidState_.setRv(Rv);
451 const Evaluation& RvSat = enableExtbo ? asImp_().rv() :
456 fluidState_.setRv(min(RvMax, RvSat));
459 fluidState_.setRv(0.0);
464 if constexpr (enableVapwat) {
465 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rvw) {
466 const auto& Rvw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
467 fluidState_.setRvw(Rvw);
471 const Evaluation& RvwSat =
getFluidSystem().saturatedVaporizationFactor(fluidState_,
474 fluidState_.setRvw(RvwSat);
479 if constexpr (enableDisgasInWater) {
480 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw) {
481 const auto& Rsw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
482 fluidState_.setRsw(Rsw);
486 const Evaluation& RswSat =
getFluidSystem().saturatedDissolutionFactor(fluidState_,
489 fluidState_.setRsw(min(RswMax, RswSat));
495 OPM_HOST_DEVICE
void updateMobilityAndInvB()
497 OPM_TIMEBLOCK_LOCAL(updateMobilityAndInvB, Subsystem::PvtProps);
498 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
502 constexpr int max_nmobilities = 4;
503 std::array<std::array<Evaluation, numPhases>*, max_nmobilities> mobilities = { &mobility_};
505 for (
int i = 0; i < 3; ++i) {
506 mobilities[nmobilities] = &(dirMob_->getArray(i));
510 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
514 const auto [b, mu] =
getFluidSystem().inverseFormationVolumeFactorAndViscosity(fluidState_, phaseIdx, pvtRegionIdx);
515 fluidState_.setInvB(phaseIdx, b);
516 for (
int i = 0; i < nmobilities; ++i) {
517 if (enableExtbo && phaseIdx == oilPhaseIdx) {
518 (*mobilities[i])[phaseIdx] /= asImp_().oilViscosity();
520 else if (enableExtbo && phaseIdx == gasPhaseIdx) {
521 (*mobilities[i])[phaseIdx] /= asImp_().gasViscosity();
524 (*mobilities[i])[phaseIdx] /= mu;
528 Valgrind::CheckDefined(mobility_);
531 OPM_HOST_DEVICE
void updatePhaseDensities()
533 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
538 rho = fluidState_.invB(waterPhaseIdx);
539 rho *=
getFluidSystem().referenceDensity(waterPhaseIdx, pvtRegionIdx);
541 rho += fluidState_.invB(waterPhaseIdx) *
545 fluidState_.setDensity(waterPhaseIdx, rho);
549 rho = fluidState_.invB(gasPhaseIdx);
550 rho *=
getFluidSystem().referenceDensity(gasPhaseIdx, pvtRegionIdx);
552 rho += fluidState_.invB(gasPhaseIdx) *
557 rho += fluidState_.invB(gasPhaseIdx) *
561 fluidState_.setDensity(gasPhaseIdx, rho);
565 rho = fluidState_.invB(oilPhaseIdx);
566 rho *=
getFluidSystem().referenceDensity(oilPhaseIdx, pvtRegionIdx);
568 rho += fluidState_.invB(oilPhaseIdx) *
572 fluidState_.setDensity(oilPhaseIdx, rho);
576 OPM_HOST_DEVICE
void updatePorosity(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
578 const auto& problem = elemCtx.problem();
579 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
580 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
582 referencePorosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
584 this->updatePorosityImpl(problem, priVars, globalSpaceIdx, timeIdx);
587 OPM_HOST_DEVICE
void updatePorosity(
const Problem& problem,
588 const PrimaryVariables& priVars,
589 const unsigned globalSpaceIdx,
590 const unsigned timeIdx)
593 referencePorosity_ = problem.porosity(globalSpaceIdx, timeIdx);
595 this->updatePorosityImpl(problem, priVars, globalSpaceIdx, timeIdx);
598 OPM_HOST_DEVICE
void updatePorosityImpl(
const Problem& problem,
599 const PrimaryVariables& priVars,
600 const unsigned globalSpaceIdx,
601 const unsigned timeIdx)
603 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
606 porosity_ = referencePorosity_;
610 const Scalar rockCompressibility = problem.rockCompressibility(globalSpaceIdx);
611 if (rockCompressibility > 0.0) {
612 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
615 x = rockCompressibility * (fluidState_.pressure(oilPhaseIdx) - rockRefPressure);
618 x = rockCompressibility * (fluidState_.pressure(waterPhaseIdx) - rockRefPressure);
621 x = rockCompressibility * (fluidState_.pressure(gasPhaseIdx) - rockRefPressure);
623 porosity_ *= 1.0 + x + 0.5 * x * x;
627 porosity_ *= problem.template rockCompPoroMultiplier<Evaluation>(*
this, globalSpaceIdx);
630 if constexpr (enableBioeffects) {
631 const Evaluation biofilm_ = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx,
632 timeIdx, linearizationType);
633 Evaluation calcite_ = 0.0;
634 if constexpr (enableMICP) {
635 calcite_ = priVars.makeEvaluation(Indices::calciteVolumeFractionIdx, timeIdx, linearizationType);
637 porosity_ -= min(biofilm_ + calcite_, referencePorosity_ - 1e-8);
641 if (enableSaltPrecipitation && priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
642 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
643 porosity_ *= (1.0 - Sp);
648 if constexpr (enableMech) {
650 if (problem.simulator().vanguard().eclState().runspec().mechSolver().tpsa()) {
652 const Scalar rockBiot = problem.rockBiotComp(globalSpaceIdx);
653 if (rockBiot > 0.0) {
654 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
655 Evaluation active_pressure;
656 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
657 active_pressure = fluidState_.pressure(oilPhaseIdx) - rockRefPressure;
658 }
else if (FluidSystem::phaseIsActive(waterPhaseIdx)){
659 active_pressure = fluidState_.pressure(waterPhaseIdx) - rockRefPressure;
661 active_pressure = fluidState_.pressure(gasPhaseIdx) - rockRefPressure;
663 porosity_ += rockBiot * active_pressure;
667 porosity_ += problem.rockMechPoroChange(globalSpaceIdx, timeIdx);
672 OPM_HOST_DEVICE
void assertFiniteMembers()
675 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
680 assert(isfinite(fluidState_.density(phaseIdx)));
681 assert(isfinite(fluidState_.saturation(phaseIdx)));
682 assert(isfinite(fluidState_.temperature(phaseIdx)));
683 assert(isfinite(fluidState_.pressure(phaseIdx)));
684 assert(isfinite(fluidState_.invB(phaseIdx)));
686 assert(isfinite(fluidState_.Rs()));
687 assert(isfinite(fluidState_.Rv()));
693 template <
class ...Args>
694 OPM_HOST_DEVICE
void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
696 ParentType::update(elemCtx, dofIdx, timeIdx);
697 const auto& problem = elemCtx.problem();
698 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
699 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
701 updateCommonPart<Args...>(problem, priVars, globalSpaceIdx, timeIdx);
703 updatePorosity(elemCtx, dofIdx, timeIdx);
707 if constexpr (enableSolvent) {
708 asImp_().solventPvtUpdate_(elemCtx, dofIdx, timeIdx);
710 if constexpr (enableExtbo) {
711 asImp_().zPvtUpdate_();
713 if constexpr (enablePolymer) {
714 asImp_().polymerPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
716 if constexpr (energyModuleType == EnergyModules::FullyImplicitThermal) {
717 asImp_().updateEnergyQuantities_(elemCtx, dofIdx, timeIdx);
719 if constexpr (enableFoam) {
720 asImp_().foamPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
722 if constexpr (enableBioeffects) {
723 asImp_().bioeffectsPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
725 if constexpr (enableBrine) {
726 asImp_().saltPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
728 if constexpr (enableConvectiveMixing) {
731 if (!problem.simulator().vanguard().eclState().getIOConfig().initOnly()) {
732 if (problem.simulator().vanguard().eclState().runspec().co2Storage()) {
733 if (problem.drsdtconIsActive(globalSpaceIdx, problem.simulator().episodeIndex())) {
734 asImp_().updateSaturatedDissolutionFactor_();
742 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
745 if constexpr (enableDiffusion) {
746 DiffusionIntensiveQuantities::update_(fluidState_, priVars.pvtRegionIndex(), elemCtx, dofIdx, timeIdx);
750 if constexpr (enableDispersion) {
751 DispersionIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
755 template <
class ...Args>
756 OPM_HOST_DEVICE
void update(
const Problem& problem,
757 const PrimaryVariables& priVars,
758 const unsigned globalSpaceIdx,
759 const unsigned timeIdx)
763 static_assert(!enableSolvent);
764 static_assert(!enableExtbo);
765 static_assert(!enablePolymer);
766 static_assert(!enableFoam);
767 static_assert(!enableMICP);
768 static_assert(!enableBrine);
769 static_assert(!enableDiffusion);
770 static_assert(!enableDispersion);
772 this->extrusionFactor_ = 1.0;
773 updateCommonPart<Args...>(problem, priVars, globalSpaceIdx, timeIdx);
775 updatePorosity(problem, priVars, globalSpaceIdx, timeIdx);
781 template <
class ...Args>
782 OPM_HOST_DEVICE
void updateCommonPart(
const Problem& problem,
783 const PrimaryVariables& priVars,
784 const unsigned globalSpaceIdx,
785 const unsigned timeIdx)
787 OPM_TIMEBLOCK_LOCAL(blackoilIntensiveQuanititiesUpdate, Subsystem::SatProps | Subsystem::PvtProps);
789 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
790 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
792 fluidState_.setPvtRegionIndex(pvtRegionIdx);
794 updateTempSalt(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
795 updateSaturations(priVars, timeIdx, linearizationType);
796 updateRelpermAndPressures<Args...>(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
799 if constexpr (enableExtbo) {
800 asImp_().zFractionUpdate_(priVars, timeIdx);
803 updateRsRvRsw(problem, priVars, globalSpaceIdx, timeIdx);
804 updateMobilityAndInvB();
805 updatePhaseDensities();
810 assertFiniteMembers();
818 {
return fluidState_; }
822 {
return fluidState_; }
827 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx)
const
828 {
return mobility_[phaseIdx]; }
830 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx, FaceDir::DirEnum facedir)
const
832 using Dir = FaceDir::DirEnum;
834 bool constexpr usesStaticFluidSystem = std::is_empty_v<FluidSystem>;
835 if constexpr (usesStaticFluidSystem)
840 return dirMob_->getArray(0)[phaseIdx];
843 return dirMob_->getArray(1)[phaseIdx];
846 return dirMob_->getArray(2)[phaseIdx];
848 throw std::runtime_error(
"Unexpected face direction");
852 OPM_THROW(std::logic_error,
"Directional mobility with non-static fluid system is not supported yet");
856 return mobility_[phaseIdx];
864 {
return porosity_; }
870 {
return rockCompTransMultiplier_; }
880 {
return fluidState_.pvtRegionIndex(); }
888 return fluidState_.viscosity(phaseIdx) *
mobility(phaseIdx);
898 {
return referencePorosity_; }
900 OPM_HOST_DEVICE
const Evaluation& permFactor()
const
902 if constexpr (enableBioeffects) {
903 return BioeffectsIntQua::permFactor();
905 else if constexpr (enableSaltPrecipitation) {
906 return BrineIntQua::permFactor();
909 throw std::logic_error(
"permFactor() called but salt precipitation or bioeffects are disabled");
918 return fluidState_.fluidSystem();
930 OPM_HOST_DEVICE Implementation& asImp_()
931 {
return *
static_cast<Implementation*
>(
this); }
933 FluidState fluidState_;
934 Scalar referencePorosity_;
935 Evaluation porosity_;
936 Evaluation rockCompTransMultiplier_;
937 std::array<Evaluation, numPhases> mobility_;
954 DirectionalMobilityPtr dirMob_;