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>
66template <
class TypeTag>
68 :
public GetPropType<TypeTag, Properties::DiscIntensiveQuantities>
69 ,
public GetPropType<TypeTag, Properties::FluxModule>::FluxIntensiveQuantities
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>;
134 using BioeffectsModule = BlackOilBioeffectsModule<TypeTag, enableBioeffects>;
140 energyModuleType != EnergyModules::NoTemperature,
141 energyModuleType == EnergyModules::FullyImplicitThermal,
142 compositionSwitchEnabled,
145 enableSaltPrecipitation,
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>
188 , referencePorosity_(other.referencePorosity_)
189 , porosity_(other.porosity_)
190 , rockCompTransMultiplier_(other.rockCompTransMultiplier_)
191 , mobility_(other.mobility_)
206 template <
class OtherTypeTag>
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);
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>
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);
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));
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_);
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);
592 const PrimaryVariables& priVars,
593 const unsigned globalSpaceIdx,
594 const unsigned timeIdx)
597 referencePorosity_ = problem.porosity(globalSpaceIdx, timeIdx);
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);
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);
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>
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;
785 template <
class ...Args>
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);
803 if constexpr (enableExtbo) {
804 asImp_().zFractionUpdate_(priVars, timeIdx);
811 rockCompTransMultiplier_ = problem.template rockCompTransMultiplier<Evaluation>(*
this, globalSpaceIdx);
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_; }
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();
934 OPM_HOST_DEVICE Implementation& asImp_()
935 {
return *
static_cast<Implementation*
>(
this); }
938 Scalar referencePorosity_;
939 Evaluation porosity_;
940 Evaluation rockCompTransMultiplier_;
941 std::array<Evaluation, numPhases> mobility_;
958 DirectionalMobilityPtr dirMob_;
Contains classes extending the black-oil model. \detail This file holds dummy definitions,...
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:80
OPM_HOST_DEVICE void updatePorosityImpl(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:602
OPM_HOST_DEVICE void update(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilintensivequantities.hh:698
OPM_HOST_DEVICE void updateSaturations(const PrimaryVariables &priVars, const unsigned timeIdx, const LinearizationType lintype)
Definition: blackoilintensivequantities.hh:227
OPM_HOST_DEVICE void updateCommonPart(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:786
BlackOilIntensiveQuantities(const BlackOilIntensiveQuantities< OtherTypeTag > &other, const FluidSystem &fsystem)
Definition: blackoilintensivequantities.hh:183
OPM_HOST_DEVICE Scalar referencePorosity() const
Returns the porosity of the rock at reference conditions.
Definition: blackoilintensivequantities.hh:901
OPM_HOST_DEVICE void updateMobilityAndInvB()
Definition: blackoilintensivequantities.hh:494
OPM_HOST_DEVICE BlackOilIntensiveQuantities & operator=(const BlackOilIntensiveQuantities &other)=default
auto withOtherFluidSystem(const GetPropType< OtherTypeTag, Properties::FluidSystem > &other) const
Definition: blackoilintensivequantities.hh:207
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 const Evaluation & mobility(unsigned phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:831
OPM_HOST_DEVICE void updatePorosity(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilintensivequantities.hh:580
OPM_HOST_DEVICE void updatePhaseDensities()
Definition: blackoilintensivequantities.hh:535
OPM_HOST_DEVICE void updateRelpermAndPressures(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx, const LinearizationType &lintype)
Definition: blackoilintensivequantities.hh:299
OPM_HOST_DEVICE FluidState & fluidState()
Definition: blackoilintensivequantities.hh:825
OPM_HOST_DEVICE void update(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:760
OPM_HOST_DEVICE void updateTempSalt(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx, const LinearizationType &lintype)
Definition: blackoilintensivequantities.hh:213
OPM_HOST_DEVICE const auto & getFluidSystem() const
Returns the fluid system used by this intensive quantities.
Definition: blackoilintensivequantities.hh:920
GetPropType< TypeTag, Properties::Problem > Problem
Definition: blackoilintensivequantities.hh:160
BlackOilFluidState< Scalar, FluidSystem, energyModuleType !=EnergyModules::NoTemperature, energyModuleType==EnergyModules::FullyImplicitThermal, compositionSwitchEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, enableDisgasInWater, enableSolvent, Indices::numPhases > ScalarFluidState
Definition: blackoilintensivequantities.hh:159
OPM_HOST_DEVICE const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: blackoilintensivequantities.hh:821
OPM_HOST_DEVICE Evaluation relativePermeability(unsigned phaseIdx) const
Returns the relative permeability of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:889
BlackOilIntensiveQuantities(const BlackOilIntensiveQuantities &other)=default
OPM_HOST_DEVICE const Evaluation & permFactor() const
Definition: blackoilintensivequantities.hh:904
OPM_HOST_DEVICE BlackOilIntensiveQuantities()
Definition: blackoilintensivequantities.hh:162
OPM_HOST_DEVICE const Evaluation & rockCompTransMultiplier() const
Definition: blackoilintensivequantities.hh:873
OPM_HOST_DEVICE void assertFiniteMembers()
Definition: blackoilintensivequantities.hh:676
OPM_HOST_DEVICE const Evaluation & mobility(unsigned phaseIdx, FaceDir::DirEnum facedir) const
Definition: blackoilintensivequantities.hh:834
OPM_HOST_DEVICE void updatePorosity(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:591
OPM_HOST_DEVICE const Evaluation & porosity() const
Returns the average porosity within the control volume.
Definition: blackoilintensivequantities.hh:867
BlackOilFluidState< Evaluation, FluidSystem, energyModuleType !=EnergyModules::NoTemperature, energyModuleType==EnergyModules::FullyImplicitThermal, compositionSwitchEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, enableDisgasInWater, enableSolvent, Indices::numPhases > FluidState
Definition: blackoilintensivequantities.hh:148
OPM_HOST_DEVICE void updateRsRvRsw(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:391
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