72class BlackOilIntensiveQuantities
73 :
public GetPropType<TypeTag, Properties::DiscIntensiveQuantities>
74 ,
public GetPropType<TypeTag, Properties::FluxModule>::FluxIntensiveQuantities
112 enum { enableMICP = Indices::enableMICP };
114 enum { waterCompIdx = FluidSystem::waterCompIdx };
115 enum { oilCompIdx = FluidSystem::oilCompIdx };
116 enum { gasCompIdx = FluidSystem::gasCompIdx };
117 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
118 enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
119 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
120 enum { compositionSwitchIdx = Indices::compositionSwitchIdx };
122 static constexpr bool compositionSwitchEnabled = Indices::compositionSwitchIdx >= 0;
123 static constexpr bool waterEnabled = Indices::waterEnabled;
124 static constexpr bool gasEnabled = Indices::gasEnabled;
125 static constexpr bool oilEnabled = Indices::oilEnabled;
127 using Toolbox = MathToolbox<Evaluation>;
128 using FluxIntensiveQuantities =
typename FluxModule::FluxIntensiveQuantities;
132 using DirectionalMobilityPtr = Utility::CopyablePtr<DirectionalMobility<TypeTag>>;
139 using FluidState = BlackOilFluidState<Evaluation,
143 compositionSwitchEnabled,
146 enableSaltPrecipitation,
149 using ScalarFluidState = BlackOilFluidState<Scalar,
153 compositionSwitchEnabled,
156 enableSaltPrecipitation,
161 BlackOilIntensiveQuantities()
163 if constexpr (compositionSwitchEnabled) {
164 fluidState_.setRs(0.0);
165 fluidState_.setRv(0.0);
167 if constexpr (enableVapwat) {
168 fluidState_.setRvw(0.0);
170 if constexpr (enableDisgasInWater) {
171 fluidState_.setRsw(0.0);
174 BlackOilIntensiveQuantities(
const BlackOilIntensiveQuantities& other) =
default;
176 BlackOilIntensiveQuantities& operator=(
const BlackOilIntensiveQuantities& other) =
default;
178 void updateTempSalt(
const Problem& problem,
179 const PrimaryVariables& priVars,
180 const unsigned globalSpaceIdx,
181 const unsigned timeIdx,
184 if constexpr (enableTemperature || enableEnergy) {
185 asImp_().updateTemperature_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
188 if constexpr (enableBrine) {
189 asImp_().updateSaltConcentration_(priVars, timeIdx, lintype);
193 void updateSaturations(
const PrimaryVariables& priVars,
194 const unsigned timeIdx,
199 if constexpr (waterEnabled) {
200 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
201 assert(Indices::waterSwitchIdx >= 0);
202 if constexpr (Indices::waterSwitchIdx >= 0) {
203 Sw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
206 else if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw ||
207 priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Disabled)
215 if constexpr (gasEnabled) {
216 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg) {
217 assert(Indices::compositionSwitchIdx >= 0);
218 if constexpr (compositionSwitchEnabled) {
219 Sg = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
222 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
225 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Disabled) {
226 if constexpr (waterEnabled) {
234 Valgrind::CheckDefined(Sg);
235 Valgrind::CheckDefined(Sw);
237 Evaluation So = 1.0 - Sw - Sg;
240 if constexpr (enableSolvent) {
241 if (priVars.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
242 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
243 So -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
245 else if (FluidSystem::phaseIsActive(gasPhaseIdx)) {
246 Sg -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
251 if (FluidSystem::phaseIsActive(waterPhaseIdx)) {
252 fluidState_.setSaturation(waterPhaseIdx, Sw);
255 if (FluidSystem::phaseIsActive(gasPhaseIdx)) {
256 fluidState_.setSaturation(gasPhaseIdx, Sg);
259 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
260 fluidState_.setSaturation(oilPhaseIdx, So);
264 template <
class ...Args>
265 void updateRelpermAndPressures(
const Problem& problem,
266 const PrimaryVariables& priVars,
267 const unsigned globalSpaceIdx,
268 const unsigned timeIdx,
276 if constexpr (enableSolvent) {
277 asImp_().solventPreSatFuncUpdate_(priVars, timeIdx, lintype);
281 problem.template updateRelperms<FluidState, Args...>(mobility_, dirMob_, fluidState_, globalSpaceIdx);
284 using EvalArr = std::array<Evaluation, numPhases>;
286 const auto& materialParams = problem.materialLawParams(globalSpaceIdx);
287 MaterialLaw::template capillaryPressures<EvalArr, FluidState, Args...>(pC, materialParams, fluidState_);
290 if constexpr (enableBrine) {
291 if (BrineModule::hasPcfactTables() &&
292 priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)
294 const unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
295 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
296 const Evaluation porosityFactor = min(1.0 - Sp, 1.0);
297 const auto& pcfactTable = BrineModule::pcfactTable(satnumRegionIdx);
298 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
299 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
300 if (FluidSystem::phaseIsActive(phaseIdx)) {
301 pC[phaseIdx] *= pcFactor;
306 else if constexpr (enableBioeffects) {
307 if (BioeffectsModule::hasPcfactTables() && referencePorosity_ > 0) {
308 unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
309 const Evaluation Sb = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx, timeIdx);
310 const Evaluation porosityFactor = min(1.0 - Sb/referencePorosity_, 1.0);
311 const auto& pcfactTable = BioeffectsModule::pcfactTable(satnumRegionIdx);
312 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
313 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
314 if (FluidSystem::phaseIsActive(phaseIdx)) {
315 pC[phaseIdx] *= pcFactor;
322 if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pg) {
323 const Evaluation& pg = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
324 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
325 if (FluidSystem::phaseIsActive(phaseIdx)) {
326 fluidState_.setPressure(phaseIdx, pg + (pC[phaseIdx] - pC[gasPhaseIdx]));
330 else if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pw) {
331 const Evaluation& pw = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
332 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
333 if (FluidSystem::phaseIsActive(phaseIdx)) {
334 fluidState_.setPressure(phaseIdx, pw + (pC[phaseIdx] - pC[waterPhaseIdx]));
339 assert(FluidSystem::phaseIsActive(oilPhaseIdx));
340 const Evaluation& po = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
341 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
342 if (FluidSystem::phaseIsActive(phaseIdx)) {
343 fluidState_.setPressure(phaseIdx, po + (pC[phaseIdx] - pC[oilPhaseIdx]));
352 if constexpr (enableSolvent) {
353 asImp_().solventPostSatFuncUpdate_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
357 void updateRsRvRsw(
const Problem& problem,
const PrimaryVariables& priVars,
const unsigned globalSpaceIdx,
const unsigned timeIdx)
359 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
361 const Scalar RvMax = FluidSystem::enableVaporizedOil()
362 ? problem.maxOilVaporizationFactor(timeIdx, globalSpaceIdx)
364 const Scalar RsMax = FluidSystem::enableDissolvedGas()
365 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
367 const Scalar RswMax = FluidSystem::enableDissolvedGasInWater()
368 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
371 Evaluation SoMax = 0.0;
372 if (FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx)) {
373 SoMax = max(fluidState_.saturation(oilPhaseIdx),
374 problem.maxOilSaturation(globalSpaceIdx));
380 if constexpr (compositionSwitchEnabled) {
381 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rs) {
382 const auto& Rs = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
383 fluidState_.setRs(Rs);
386 if (FluidSystem::enableDissolvedGas()) {
387 const Evaluation& RsSat = enableExtbo ? asImp_().rs() :
388 FluidSystem::saturatedDissolutionFactor(fluidState_,
392 fluidState_.setRs(min(RsMax, RsSat));
395 fluidState_.setRs(0.0);
399 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
400 const auto& Rv = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
401 fluidState_.setRv(Rv);
404 if (FluidSystem::enableVaporizedOil() ) {
405 const Evaluation& RvSat = enableExtbo ? asImp_().rv() :
406 FluidSystem::saturatedDissolutionFactor(fluidState_,
410 fluidState_.setRv(min(RvMax, RvSat));
413 fluidState_.setRv(0.0);
418 if constexpr (enableVapwat) {
419 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rvw) {
420 const auto& Rvw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
421 fluidState_.setRvw(Rvw);
424 if (FluidSystem::enableVaporizedWater()) {
425 const Evaluation& RvwSat = FluidSystem::saturatedVaporizationFactor(fluidState_,
428 fluidState_.setRvw(RvwSat);
433 if constexpr (enableDisgasInWater) {
434 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw) {
435 const auto& Rsw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
436 fluidState_.setRsw(Rsw);
439 if (FluidSystem::enableDissolvedGasInWater()) {
440 const Evaluation& RswSat = FluidSystem::saturatedDissolutionFactor(fluidState_,
443 fluidState_.setRsw(min(RswMax, RswSat));
449 void updateMobilityAndInvB()
451 OPM_TIMEBLOCK_LOCAL(updateMobilityAndInvB, Subsystem::PvtProps);
452 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
456 constexpr int max_nmobilities = 4;
457 std::array<std::array<Evaluation, numPhases>*, max_nmobilities> mobilities = { &mobility_};
459 for (
int i = 0; i < 3; ++i) {
460 mobilities[nmobilities] = &(dirMob_->getArray(i));
464 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
465 if (!FluidSystem::phaseIsActive(phaseIdx)) {
468 const auto [b, mu] = FluidSystem::inverseFormationVolumeFactorAndViscosity(fluidState_, phaseIdx, pvtRegionIdx);
469 fluidState_.setInvB(phaseIdx, b);
470 for (
int i = 0; i < nmobilities; ++i) {
471 if (enableExtbo && phaseIdx == oilPhaseIdx) {
472 (*mobilities[i])[phaseIdx] /= asImp_().oilViscosity();
474 else if (enableExtbo && phaseIdx == gasPhaseIdx) {
475 (*mobilities[i])[phaseIdx] /= asImp_().gasViscosity();
478 (*mobilities[i])[phaseIdx] /= mu;
482 Valgrind::CheckDefined(mobility_);
485 void updatePhaseDensities()
487 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
491 if (FluidSystem::phaseIsActive(waterPhaseIdx)) {
492 rho = fluidState_.invB(waterPhaseIdx);
493 rho *= FluidSystem::referenceDensity(waterPhaseIdx, pvtRegionIdx);
494 if (FluidSystem::enableDissolvedGasInWater()) {
495 rho += fluidState_.invB(waterPhaseIdx) *
497 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
499 fluidState_.setDensity(waterPhaseIdx, rho);
502 if (FluidSystem::phaseIsActive(gasPhaseIdx)) {
503 rho = fluidState_.invB(gasPhaseIdx);
504 rho *= FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
505 if (FluidSystem::enableVaporizedOil()) {
506 rho += fluidState_.invB(gasPhaseIdx) *
508 FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx);
510 if (FluidSystem::enableVaporizedWater()) {
511 rho += fluidState_.invB(gasPhaseIdx) *
513 FluidSystem::referenceDensity(waterPhaseIdx, pvtRegionIdx);
515 fluidState_.setDensity(gasPhaseIdx, rho);
518 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
519 rho = fluidState_.invB(oilPhaseIdx);
520 rho *= FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx);
521 if (FluidSystem::enableDissolvedGas()) {
522 rho += fluidState_.invB(oilPhaseIdx) *
524 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
526 fluidState_.setDensity(oilPhaseIdx, rho);
530 void updatePorosity(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
532 const auto& problem = elemCtx.problem();
533 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
534 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
536 referencePorosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
538 this->updatePorosityImpl(problem, priVars, globalSpaceIdx, timeIdx);
541 void updatePorosity(
const Problem& problem,
const PrimaryVariables& priVars,
const unsigned globalSpaceIdx,
const unsigned timeIdx)
544 referencePorosity_ = problem.porosity(globalSpaceIdx, timeIdx);
546 this->updatePorosityImpl(problem, priVars, globalSpaceIdx, timeIdx);
549 void updatePorosityImpl(
const Problem& problem,
const PrimaryVariables& priVars,
const unsigned globalSpaceIdx,
const unsigned timeIdx)
551 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
554 porosity_ = referencePorosity_;
558 const Scalar rockCompressibility = problem.rockCompressibility(globalSpaceIdx);
559 if (rockCompressibility > 0.0) {
560 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
562 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
563 x = rockCompressibility * (fluidState_.pressure(oilPhaseIdx) - rockRefPressure);
565 else if (FluidSystem::phaseIsActive(waterPhaseIdx)) {
566 x = rockCompressibility * (fluidState_.pressure(waterPhaseIdx) - rockRefPressure);
569 x = rockCompressibility * (fluidState_.pressure(gasPhaseIdx) - rockRefPressure);
571 porosity_ *= 1.0 + x + 0.5 * x * x;
575 porosity_ *= problem.template rockCompPoroMultiplier<Evaluation>(*
this, globalSpaceIdx);
578 if constexpr (enableBioeffects) {
579 const Evaluation biofilm_ = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx,
580 timeIdx, linearizationType);
581 Evaluation calcite_ = 0.0;
582 if constexpr (enableMICP) {
583 calcite_ = priVars.makeEvaluation(Indices::calciteVolumeFractionIdx, timeIdx, linearizationType);
585 porosity_ -= min(biofilm_ + calcite_, referencePorosity_ - 1e-8);
589 if (enableSaltPrecipitation && priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
590 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
591 porosity_ *= (1.0 - Sp);
595 void assertFiniteMembers()
598 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
599 if (!FluidSystem::phaseIsActive(phaseIdx)) {
603 assert(isfinite(fluidState_.density(phaseIdx)));
604 assert(isfinite(fluidState_.saturation(phaseIdx)));
605 assert(isfinite(fluidState_.temperature(phaseIdx)));
606 assert(isfinite(fluidState_.pressure(phaseIdx)));
607 assert(isfinite(fluidState_.invB(phaseIdx)));
609 assert(isfinite(fluidState_.Rs()));
610 assert(isfinite(fluidState_.Rv()));
616 template <
class ...Args>
617 void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
619 ParentType::update(elemCtx, dofIdx, timeIdx);
620 const auto& problem = elemCtx.problem();
621 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
622 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
624 updateCommonPart<Args...>(problem, priVars, globalSpaceIdx, timeIdx);
626 updatePorosity(elemCtx, dofIdx, timeIdx);
630 if constexpr (enableSolvent) {
631 asImp_().solventPvtUpdate_(elemCtx, dofIdx, timeIdx);
633 if constexpr (enableExtbo) {
634 asImp_().zPvtUpdate_();
636 if constexpr (enablePolymer) {
637 asImp_().polymerPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
639 if constexpr (enableEnergy) {
640 asImp_().updateEnergyQuantities_(elemCtx, dofIdx, timeIdx);
642 if constexpr (enableFoam) {
643 asImp_().foamPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
645 if constexpr (enableBioeffects) {
646 asImp_().bioeffectsPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
648 if constexpr (enableBrine) {
649 asImp_().saltPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
651 if constexpr (enableConvectiveMixing) {
654 if (!problem.simulator().vanguard().eclState().getIOConfig().initOnly()) {
655 if (problem.simulator().vanguard().eclState().runspec().co2Storage()) {
656 if (problem.drsdtconIsActive(globalSpaceIdx, problem.simulator().episodeIndex())) {
657 asImp_().updateSaturatedDissolutionFactor_();
665 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
668 if constexpr (enableDiffusion) {
669 DiffusionIntensiveQuantities::update_(fluidState_, priVars.pvtRegionIndex(), elemCtx, dofIdx, timeIdx);
673 if constexpr (enableDispersion) {
674 DispersionIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
678 template <
class ...Args>
679 void update(
const Problem& problem,
const PrimaryVariables& priVars,
const unsigned globalSpaceIdx,
const unsigned timeIdx)
683 static_assert(!enableSolvent);
684 static_assert(!enableExtbo);
685 static_assert(!enablePolymer);
686 static_assert(!enableEnergy);
687 static_assert(!enableFoam);
688 static_assert(!enableMICP);
689 static_assert(!enableBrine);
690 static_assert(!enableDiffusion);
691 static_assert(!enableDispersion);
693 this->extrusionFactor_ = 1.0;
694 updateCommonPart<Args...>(problem, priVars, globalSpaceIdx, timeIdx);
696 updatePorosity(problem, priVars, globalSpaceIdx, timeIdx);
702 template <
class ...Args>
703 void updateCommonPart(
const Problem& problem,
const PrimaryVariables& priVars,
const unsigned globalSpaceIdx,
const unsigned timeIdx)
705 OPM_TIMEBLOCK_LOCAL(blackoilIntensiveQuanititiesUpdate, Subsystem::SatProps | Subsystem::PvtProps);
707 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
708 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
710 fluidState_.setPvtRegionIndex(pvtRegionIdx);
712 updateTempSalt(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
713 updateSaturations(priVars, timeIdx, linearizationType);
714 updateRelpermAndPressures<Args...>(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
717 if constexpr (enableExtbo) {
718 asImp_().zFractionUpdate_(priVars, timeIdx);
721 updateRsRvRsw(problem, priVars, globalSpaceIdx, timeIdx);
722 updateMobilityAndInvB();
723 updatePhaseDensities();
728 assertFiniteMembers();
736 {
return fluidState_; }
741 const Evaluation&
mobility(
unsigned phaseIdx)
const
742 {
return mobility_[phaseIdx]; }
744 const Evaluation&
mobility(
unsigned phaseIdx, FaceDir::DirEnum facedir)
const
746 using Dir = FaceDir::DirEnum;
751 return dirMob_->getArray(0)[phaseIdx];
754 return dirMob_->getArray(1)[phaseIdx];
757 return dirMob_->getArray(2)[phaseIdx];
759 throw std::runtime_error(
"Unexpected face direction");
763 return mobility_[phaseIdx];
771 {
return porosity_; }
777 {
return rockCompTransMultiplier_; }
787 {
return fluidState_.pvtRegionIndex(); }
795 return fluidState_.viscosity(phaseIdx) *
mobility(phaseIdx);
805 {
return referencePorosity_; }
807 const Evaluation& permFactor()
const
809 if constexpr (enableBioeffects) {
810 return BioeffectsIntQua::permFactor();
812 else if constexpr (enableSaltPrecipitation) {
813 return BrineIntQua::permFactor();
816 throw std::logic_error(
"permFactor() called but salt precipitation or bioeffects are disabled");
821 friend BlackOilSolventIntensiveQuantities<TypeTag, enableSolvent>;
822 friend BlackOilExtboIntensiveQuantities<TypeTag, enableExtbo>;
823 friend BlackOilPolymerIntensiveQuantities<TypeTag, enablePolymer>;
824 friend BlackOilEnergyIntensiveQuantities<TypeTag, enableEnergy>;
825 friend BlackOilFoamIntensiveQuantities<TypeTag, enableFoam>;
826 friend BlackOilBrineIntensiveQuantities<TypeTag, enableBrine>;
827 friend BlackOilBioeffectsIntensiveQuantities<TypeTag, enableBioeffects>;
829 Implementation& asImp_()
830 {
return *
static_cast<Implementation*
>(
this); }
832 FluidState fluidState_;
833 Scalar referencePorosity_;
834 Evaluation porosity_;
835 Evaluation rockCompTransMultiplier_;
836 std::array<Evaluation, numPhases> mobility_;
853 DirectionalMobilityPtr dirMob_;