387 using ConstEvaluation =
typename std::remove_reference<typename FluidState::Scalar>::type;
388 using FsEvaluation =
typename std::remove_const<ConstEvaluation>::type;
391 bool gasPresent = FluidSystem::phaseIsActive(gasPhaseIdx)?(fluidState.saturation(gasPhaseIdx) > 0.0):
false;
392 bool oilPresent = FluidSystem::phaseIsActive(oilPhaseIdx)?(fluidState.saturation(oilPhaseIdx) > 0.0):
false;
393 bool waterPresent = FluidSystem::phaseIsActive(waterPhaseIdx)?(fluidState.saturation(waterPhaseIdx) > 0.0):
false;
394 const auto& saltSaturation = BlackOil::getSaltSaturation_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
404 primaryVarsMeaningPressure_ = PressureMeaning::Pg;
405 }
else if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
406 primaryVarsMeaningPressure_ = PressureMeaning::Po;
408 primaryVarsMeaningPressure_ = PressureMeaning::Pw;
409 }
else if (FluidSystem::phaseIsActive(gasPhaseIdx)) {
410 primaryVarsMeaningPressure_ = PressureMeaning::Pg;
412 assert(FluidSystem::phaseIsActive(waterPhaseIdx));
413 primaryVarsMeaningPressure_ = PressureMeaning::Pw;
421 primaryVarsMeaningWater_ = WaterMeaning::Sw;
422 }
else if (
gasPresent && FluidSystem::enableVaporizedWater()) {
423 primaryVarsMeaningWater_ = WaterMeaning::Rvw;
424 }
else if (
waterPresent && FluidSystem::enableDissolvedGasInWater()) {
425 primaryVarsMeaningWater_ = WaterMeaning::Rsw;
426 }
else if (FluidSystem::phaseIsActive(waterPhaseIdx) && !
oneActivePhases) {
427 primaryVarsMeaningWater_ = WaterMeaning::Sw;
429 primaryVarsMeaningWater_ = WaterMeaning::Disabled;
438 primaryVarsMeaningGas_ = GasMeaning::Sg;
439 }
else if (
oilPresent && FluidSystem::enableDissolvedGas()) {
440 primaryVarsMeaningGas_ = GasMeaning::Rs;
441 }
else if (
gasPresent && FluidSystem::enableVaporizedOil()){
442 primaryVarsMeaningGas_ = GasMeaning::Rv;
443 }
else if (FluidSystem::phaseIsActive(gasPhaseIdx) && FluidSystem::phaseIsActive(oilPhaseIdx)) {
444 primaryVarsMeaningGas_ = GasMeaning::Sg;
446 primaryVarsMeaningGas_ = GasMeaning::Disabled;
450 if constexpr (enableSaltPrecipitation){
452 primaryVarsMeaningBrine_ = BrineMeaning::Sp;
454 primaryVarsMeaningBrine_ = BrineMeaning::Cs;
456 primaryVarsMeaningBrine_ = BrineMeaning::Disabled;
461 case PressureMeaning::Po:
462 this->setScaledPressure_(FsToolbox::value(fluidState.pressure(oilPhaseIdx)));
464 case PressureMeaning::Pg:
465 this->setScaledPressure_(FsToolbox::value(fluidState.pressure(gasPhaseIdx)));
467 case PressureMeaning::Pw:
468 this->setScaledPressure_(FsToolbox::value(fluidState.pressure(waterPhaseIdx)));
471 throw std::logic_error(
"No valid primary variable selected for pressure");
474 case WaterMeaning::Sw:
476 (*this)[waterSwitchIdx] = FsToolbox::value(fluidState.saturation(waterPhaseIdx));
479 case WaterMeaning::Rvw:
481 const auto& rvw = BlackOil::getRvw_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
482 (*this)[waterSwitchIdx] = rvw;
485 case WaterMeaning::Rsw:
487 const auto& Rsw = BlackOil::getRsw_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
488 (*this)[waterSwitchIdx] = Rsw;
491 case WaterMeaning::Disabled:
496 throw std::logic_error(
"No valid primary variable selected for water");
501 (*this)[compositionSwitchIdx] = FsToolbox::value(fluidState.saturation(gasPhaseIdx));
506 const auto& rs = BlackOil::getRs_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
507 (*this)[compositionSwitchIdx] = rs;
512 const auto& rv = BlackOil::getRv_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
513 (*this)[compositionSwitchIdx] = rv;
516 case GasMeaning::Disabled:
521 throw std::logic_error(
"No valid primary variable selected for composision");
537 unsigned globalDofIdx,
556 Scalar saltConcentration = 0.0;
557 const Scalar& T = asImp_().temperature_(problem, globalDofIdx);
559 sw = (*this)[waterSwitchIdx];
561 sg = (*this)[compositionSwitchIdx];
570 if constexpr (enableSaltPrecipitation) {
572 if (primaryVarsMeaningBrine() == BrineMeaning::Sp) {
573 saltConcentration = saltSolubility;
574 Scalar
saltSat = (*this)[saltConcentrationIdx];
577 (*this)[saltConcentrationIdx] = saltSolubility;
580 else if (primaryVarsMeaningBrine() == BrineMeaning::Cs) {
581 saltConcentration = (*this)[saltConcentrationIdx];
582 if (saltConcentration > saltSolubility +
eps){
584 (*this)[saltConcentrationIdx] = 0.0;
592 if constexpr (enableSolvent) {
593 if (SolventModule::isSolubleInWater()) {
594 Scalar
p = (*this)[pressureSwitchIdx];
596 if (primaryVarsMeaningSolvent() == SolventMeaning::Ss) {
597 Scalar
solSat = (*this)[solventSaturationIdx];
600 (*this)[solventSaturationIdx] =
solLimit;
604 else if (primaryVarsMeaningSolvent() == SolventMeaning::Rsolw) {
605 Scalar
rsolw = (*this)[solventSaturationIdx];
608 (*this)[solventSaturationIdx] = 0.0;
626 if constexpr (waterEnabled) {
627 (*this)[Indices::waterSwitchIdx] = std::min(
swMaximum,
sw);
631 if constexpr (compositionSwitchEnabled)
632 (*
this)[Indices::compositionSwitchIdx] = 0.0;
636 if constexpr (compositionSwitchEnabled)
644 if (BrineModule::hasPcfactTables() && primaryVarsMeaningBrine() == BrineMeaning::Sp) {
646 Scalar Sp = saltConcentration_();
656 case WaterMeaning::Sw:
660 Scalar
p = this->pressure_();
662 std::array<Scalar, numPhases>
pC = { 0.0 };
663 const MaterialLawParams&
matParams = problem.materialLawParams(globalDofIdx);
664 Scalar
so = 1.0 - sg - solventSaturation_();
665 computeCapillaryPressures_(
pC,
so, sg + solventSaturation_(), 0.0,
matParams);
666 p += pcFactor_ * (
pC[gasPhaseIdx] -
pC[oilPhaseIdx]);
668 Scalar
rvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_,
673 (*this)[Indices::waterSwitchIdx] =
rvwSat;
680 const Scalar pg = this->pressure_();
682 std::array<Scalar, numPhases>
pC = { 0.0 };
683 const MaterialLawParams&
matParams = problem.materialLawParams(globalDofIdx);
684 Scalar
so = 1.0 -
sw - solventSaturation_();
686 Scalar pw = pg + pcFactor_ * (
pC[waterPhaseIdx] -
pC[gasPhaseIdx]);
687 Scalar
rswSat = FluidSystem::waterPvt().saturatedGasDissolutionFactor(pvtRegionIdx_,
692 Scalar
rswMax = problem.maxGasDissolutionFactor(0, globalDofIdx);
695 this->setScaledPressure_(pw);
701 case WaterMeaning::Rvw:
703 const Scalar& rvw = (*this)[waterSwitchIdx];
704 Scalar
p = this->pressure_();
706 std::array<Scalar, numPhases>
pC = { 0.0 };
707 const MaterialLawParams&
matParams = problem.materialLawParams(globalDofIdx);
708 Scalar
so = 1.0 - sg - solventSaturation_();
709 computeCapillaryPressures_(
pC,
so, sg + solventSaturation_(), 0.0,
matParams);
710 p += pcFactor_ * (
pC[gasPhaseIdx] -
pC[oilPhaseIdx]);
712 Scalar
rvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_,
719 (*this)[Indices::waterSwitchIdx] = 0.0;
724 case WaterMeaning::Rsw:
729 const Scalar& pw = this->pressure_();
731 Scalar
rswSat = FluidSystem::waterPvt().saturatedGasDissolutionFactor(pvtRegionIdx_,
736 Scalar rsw = (*this)[Indices::waterSwitchIdx];
737 Scalar
rswMax = problem.maxGasDissolutionFactor(0, globalDofIdx);
741 (*this)[Indices::waterSwitchIdx] = 1.0;
743 std::array<Scalar, numPhases>
pC = { 0.0 };
744 const MaterialLawParams&
matParams = problem.materialLawParams(globalDofIdx);
745 computeCapillaryPressures_(
pC, 0.0, 0.0, 1.0,
matParams);
746 Scalar pg = pw + pcFactor_ * (
pC[gasPhaseIdx] -
pC[waterPhaseIdx]);
747 this->setScaledPressure_(pg);
752 case WaterMeaning::Disabled:
757 throw std::logic_error(
"No valid primary variable selected for water");
771 Scalar s = 1.0 -
sw - solventSaturation_();
773 const Scalar po = this->pressure_();
775 Scalar
soMax = std::max(s, problem.maxOilSaturation(globalDofIdx));
776 Scalar
rsMax = problem.maxGasDissolutionFactor(0, globalDofIdx);
780 : FluidSystem::oilPvt().saturatedGasDissolutionFactor(pvtRegionIdx_,
785 (*this)[Indices::compositionSwitchIdx] = std::min(
rsMax,
rsSat);
788 Scalar
so = 1.0 -
sw - solventSaturation_() - sg;
794 const Scalar po = this->pressure_();
795 std::array<Scalar, numPhases>
pC = { 0.0 };
796 const MaterialLawParams&
matParams = problem.materialLawParams(globalDofIdx);
797 computeCapillaryPressures_(
pC, 0.0, sg + solventSaturation_(),
sw,
matParams);
798 Scalar pg = po + pcFactor_ * (
pC[gasPhaseIdx] -
pC[oilPhaseIdx]);
803 this->setScaledPressure_(pg);
804 Scalar
soMax = problem.maxOilSaturation(globalDofIdx);
805 Scalar
rvMax = problem.maxOilVaporizationFactor(0, globalDofIdx);
809 : FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
815 (*this)[Indices::compositionSwitchIdx] = std::min(
rvMax,
rvSat);
825 const Scalar po = this->pressure_();
826 Scalar
so = 1.0 -
sw - solventSaturation_();
827 Scalar
soMax = std::max(
so, problem.maxOilSaturation(globalDofIdx));
828 Scalar
rsMax = problem.maxGasDissolutionFactor(0, globalDofIdx);
832 : FluidSystem::oilPvt().saturatedGasDissolutionFactor(pvtRegionIdx_,
838 Scalar rs = (*this)[Indices::compositionSwitchIdx];
842 (*this)[Indices::compositionSwitchIdx] = 0.0;
853 const Scalar pg = this->pressure_();
854 Scalar
soMax = problem.maxOilSaturation(globalDofIdx);
855 Scalar
rvMax = problem.maxOilVaporizationFactor(0, globalDofIdx);
859 : FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
865 Scalar rv = (*this)[Indices::compositionSwitchIdx];
870 Scalar
sg2 = 1.0 -
sw - solventSaturation_();
871 std::array<Scalar, numPhases>
pC = { 0.0 };
872 const MaterialLawParams&
matParams = problem.materialLawParams(globalDofIdx);
873 computeCapillaryPressures_(
pC,
875 sg2 + solventSaturation_(),
878 Scalar po = pg + pcFactor_ * (
pC[oilPhaseIdx] -
pC[gasPhaseIdx]);
882 this->setScaledPressure_(po);
883 (*this)[Indices::compositionSwitchIdx] =
sg2;
888 case GasMeaning::Disabled:
893 throw std::logic_error(
"No valid primary variable selected for water");