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>
65template <
class TypeTag>
67 :
public GetPropType<TypeTag, Properties::DiscIntensiveQuantities>
68 ,
public GetPropType<TypeTag, Properties::FluxModule>::FluxIntensiveQuantities
92 enum { enableVapwat = getPropValue<TypeTag, Properties::EnableVapwat>() };
93 enum { enableDisgasInWater = getPropValue<TypeTag, Properties::EnableDisgasInWater>() };
94 enum { enableSaltPrecipitation = getPropValue<TypeTag, Properties::EnableSaltPrecipitation>() };
95 static constexpr EnergyModules energyModuleType = getPropValue<TypeTag, Properties::EnergyModuleType>();
97 static constexpr bool enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
98 static constexpr bool enableBrine = getPropValue<TypeTag, Properties::EnableBrine>();
99 static constexpr bool enableConvectiveMixing = getPropValue<TypeTag, Properties::EnableConvectiveMixing>();
100 static constexpr bool enableDiffusion = getPropValue<TypeTag, Properties::EnableDiffusion>();
101 static constexpr bool enableDispersion = getPropValue<TypeTag, Properties::EnableDispersion>();
102 static constexpr bool enableExtbo = getPropValue<TypeTag, Properties::EnableExtbo>();
103 static constexpr bool enableFoam = getPropValue<TypeTag, Properties::EnableFoam>();
104 static constexpr bool enablePolymer = getPropValue<TypeTag, Properties::EnablePolymer>();
105 static constexpr bool enableSolvent = getPropValue<TypeTag, Properties::EnableSolvent>();
106 static constexpr bool enableTemperature = energyModuleType != EnergyModules::NoTemperature;
108 enum { enableMech = getPropValue<TypeTag, Properties::EnableMech>() };
109 enum { enableMICP = Indices::enableMICP };
110 enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
111 enum { waterCompIdx = FluidSystem::waterCompIdx };
112 enum { oilCompIdx = FluidSystem::oilCompIdx };
113 enum { gasCompIdx = FluidSystem::gasCompIdx };
114 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
115 enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
116 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
117 enum { compositionSwitchIdx = Indices::compositionSwitchIdx };
119 static constexpr bool compositionSwitchEnabled = Indices::compositionSwitchIdx >= 0;
120 static constexpr bool waterEnabled = Indices::waterEnabled;
121 static constexpr bool gasEnabled = Indices::gasEnabled;
122 static constexpr bool oilEnabled = Indices::oilEnabled;
124 using Toolbox = MathToolbox<Evaluation>;
125 using FluxIntensiveQuantities =
typename FluxModule::FluxIntensiveQuantities;
129 using DirectionalMobilityPtr = Utility::CopyablePtr<DirectionalMobility<TypeTag>>;
130 using BrineModule = BlackOilBrineModule<TypeTag, enableBrine>;
132 using BioeffectsModule = BlackOilBioeffectsModule<TypeTag, enableBioeffects>;
138 energyModuleType != EnergyModules::NoTemperature,
139 energyModuleType == EnergyModules::FullyImplicitThermal,
140 compositionSwitchEnabled,
143 enableSaltPrecipitation,
149 energyModuleType != EnergyModules::NoTemperature,
150 energyModuleType == EnergyModules::FullyImplicitThermal,
151 compositionSwitchEnabled,
154 enableSaltPrecipitation,
162 if constexpr (compositionSwitchEnabled) {
163 fluidState_.setRs(0.0);
164 fluidState_.setRv(0.0);
166 if constexpr (enableVapwat) {
167 fluidState_.setRvw(0.0);
169 if constexpr (enableDisgasInWater) {
170 fluidState_.setRsw(0.0);
176 template<
class OtherTypeTag>
180 template<
class OtherTypeTag>
186 , referencePorosity_(other.referencePorosity_)
187 , porosity_(other.porosity_)
188 , rockCompTransMultiplier_(other.rockCompTransMultiplier_)
189 , mobility_(other.mobility_)
204 template <
class OtherTypeTag>
212 const PrimaryVariables& priVars,
213 const unsigned globalSpaceIdx,
214 const unsigned timeIdx,
217 if constexpr (enableTemperature) {
218 asImp_().updateTemperature_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
220 if constexpr (enableBrine) {
221 asImp_().updateSaltConcentration_(priVars, timeIdx, lintype);
226 const unsigned timeIdx,
231 if constexpr (waterEnabled) {
232 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
233 assert(Indices::waterSwitchIdx >= 0);
234 if constexpr (Indices::waterSwitchIdx >= 0) {
235 Sw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
238 else if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw ||
239 priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Disabled)
247 if constexpr (gasEnabled) {
248 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg) {
249 assert(Indices::compositionSwitchIdx >= 0);
250 if constexpr (compositionSwitchEnabled) {
251 Sg = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
254 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
257 else if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Disabled) {
258 if constexpr (waterEnabled) {
266 Valgrind::CheckDefined(Sg);
267 Valgrind::CheckDefined(Sw);
269 Evaluation So = 1.0 - Sw - Sg;
272 if constexpr (enableSolvent) {
273 if (priVars.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
275 So -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
278 Sg -= priVars.makeEvaluation(Indices::solventSaturationIdx, timeIdx);
284 fluidState_.setSaturation(waterPhaseIdx, Sw);
288 fluidState_.setSaturation(gasPhaseIdx, Sg);
292 fluidState_.setSaturation(oilPhaseIdx, So);
296 template <
class ...Args>
298 const PrimaryVariables& priVars,
299 const unsigned globalSpaceIdx,
300 const unsigned timeIdx,
308 if constexpr (enableSolvent) {
309 asImp_().solventPreSatFuncUpdate_(priVars, timeIdx, lintype);
313 problem.template updateRelperms<
FluidState, Args...>(mobility_, dirMob_, fluidState_, globalSpaceIdx);
316 using EvalArr = std::array<Evaluation, numPhases>;
318 const auto& materialParams = problem.materialLawParams(globalSpaceIdx);
319 MaterialLaw::template capillaryPressures<EvalArr,
FluidState, Args...>(pC, materialParams, fluidState_);
322 if constexpr (enableBrine) {
323 if (BrineModule::hasPcfactTables() &&
324 priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)
326 const unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
327 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
328 const Evaluation porosityFactor = min(1.0 - Sp, 1.0);
329 const auto& pcfactTable = BrineModule::pcfactTable(satnumRegionIdx);
330 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
331 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
333 pC[phaseIdx] *= pcFactor;
338 else if constexpr (enableBioeffects) {
339 if (BioeffectsModule::hasPcfactTables() && referencePorosity_ > 0) {
340 unsigned satnumRegionIdx = problem.satnumRegionIndex(globalSpaceIdx);
341 const Evaluation Sb = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx, timeIdx);
342 const Evaluation porosityFactor = min(1.0 - Sb/referencePorosity_, 1.0);
343 const auto& pcfactTable = BioeffectsModule::pcfactTable(satnumRegionIdx);
344 const Evaluation pcFactor = pcfactTable.eval(porosityFactor,
true);
345 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
347 pC[phaseIdx] *= pcFactor;
354 if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pg) {
355 const Evaluation& pg = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
356 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
358 fluidState_.setPressure(phaseIdx, pg + (pC[phaseIdx] - pC[gasPhaseIdx]));
362 else if (priVars.primaryVarsMeaningPressure() == PrimaryVariables::PressureMeaning::Pw) {
363 const Evaluation& pw = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
364 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
366 fluidState_.setPressure(phaseIdx, pw + (pC[phaseIdx] - pC[waterPhaseIdx]));
372 const Evaluation& po = priVars.makeEvaluation(Indices::pressureSwitchIdx, timeIdx);
373 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
375 fluidState_.setPressure(phaseIdx, po + (pC[phaseIdx] - pC[oilPhaseIdx]));
384 if constexpr (enableSolvent) {
385 asImp_().solventPostSatFuncUpdate_(problem, priVars, globalSpaceIdx, timeIdx, lintype);
390 const PrimaryVariables& priVars,
391 const unsigned globalSpaceIdx,
392 const unsigned timeIdx)
394 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
397 ? problem.maxOilVaporizationFactor(timeIdx, globalSpaceIdx)
400 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
402 const Scalar RswMax =
getFluidSystem().enableDissolvedGasInWater()
403 ? problem.maxGasDissolutionFactor(timeIdx, globalSpaceIdx)
406 Evaluation SoMax = 0.0;
408 SoMax = max(fluidState_.saturation(oilPhaseIdx),
409 problem.maxOilSaturation(globalSpaceIdx));
415 if constexpr (compositionSwitchEnabled) {
416 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rs) {
417 const auto& Rs = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
418 fluidState_.setRs(Rs);
423 if constexpr (enableExtbo) {
424 RsSat = asImp_().rs();
431 fluidState_.setRs(min(RsMax, RsSat));
434 fluidState_.setRs(0.0);
438 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
439 const auto& Rv = priVars.makeEvaluation(Indices::compositionSwitchIdx, timeIdx);
440 fluidState_.setRv(Rv);
445 if constexpr (enableExtbo) {
446 RvSat = asImp_().rv();
453 fluidState_.setRv(min(RvMax, RvSat));
456 fluidState_.setRv(0.0);
461 if constexpr (enableVapwat) {
462 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rvw) {
463 const auto& Rvw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
464 fluidState_.setRvw(Rvw);
468 const Evaluation& RvwSat =
getFluidSystem().saturatedVaporizationFactor(fluidState_,
471 fluidState_.setRvw(RvwSat);
476 if constexpr (enableDisgasInWater) {
477 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Rsw) {
478 const auto& Rsw = priVars.makeEvaluation(Indices::waterSwitchIdx, timeIdx);
479 fluidState_.setRsw(Rsw);
483 const Evaluation& RswSat =
getFluidSystem().saturatedDissolutionFactor(fluidState_,
486 fluidState_.setRsw(min(RswMax, RswSat));
495 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
499 constexpr int max_nmobilities = 4;
500 std::array<std::array<Evaluation, numPhases>*, max_nmobilities> mobilities = { &mobility_};
502 for (
int i = 0; i < 3; ++i) {
503 mobilities[nmobilities] = &(dirMob_->getArray(i));
507 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
511 const auto [b, mu] =
getFluidSystem().inverseFormationVolumeFactorAndViscosity(fluidState_, phaseIdx, pvtRegionIdx);
512 fluidState_.setInvB(phaseIdx, b);
513 for (
int i = 0; i < nmobilities; ++i) {
514 if constexpr (enableExtbo) {
515 if (phaseIdx == oilPhaseIdx) {
516 (*mobilities[i])[phaseIdx] /= asImp_().oilViscosity();
518 else if (phaseIdx == gasPhaseIdx) {
519 (*mobilities[i])[phaseIdx] /= asImp_().gasViscosity();
522 (*mobilities[i])[phaseIdx] /= mu;
526 (*mobilities[i])[phaseIdx] /= mu;
530 Valgrind::CheckDefined(mobility_);
535 const unsigned pvtRegionIdx = fluidState_.pvtRegionIndex();
540 rho = fluidState_.invB(waterPhaseIdx);
541 rho *=
getFluidSystem().referenceDensity(waterPhaseIdx, pvtRegionIdx);
543 rho += fluidState_.invB(waterPhaseIdx) *
547 fluidState_.setDensity(waterPhaseIdx, rho);
551 rho = fluidState_.invB(gasPhaseIdx);
552 rho *=
getFluidSystem().referenceDensity(gasPhaseIdx, pvtRegionIdx);
554 rho += fluidState_.invB(gasPhaseIdx) *
559 rho += fluidState_.invB(gasPhaseIdx) *
563 fluidState_.setDensity(gasPhaseIdx, rho);
567 rho = fluidState_.invB(oilPhaseIdx);
568 rho *=
getFluidSystem().referenceDensity(oilPhaseIdx, pvtRegionIdx);
570 rho += fluidState_.invB(oilPhaseIdx) *
574 fluidState_.setDensity(oilPhaseIdx, rho);
578 OPM_HOST_DEVICE
void updatePorosity(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
580 const auto& problem = elemCtx.problem();
581 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
582 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
584 referencePorosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
590 const PrimaryVariables& priVars,
591 const unsigned globalSpaceIdx,
592 const unsigned timeIdx)
595 referencePorosity_ = problem.porosity(globalSpaceIdx, timeIdx);
601 const PrimaryVariables& priVars,
602 const unsigned globalSpaceIdx,
603 const unsigned timeIdx)
605 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
608 porosity_ = referencePorosity_;
612 const Scalar rockCompressibility = problem.rockCompressibility(globalSpaceIdx);
613 if (rockCompressibility > 0.0) {
614 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
617 x = rockCompressibility * (fluidState_.pressure(oilPhaseIdx) - rockRefPressure);
620 x = rockCompressibility * (fluidState_.pressure(waterPhaseIdx) - rockRefPressure);
623 x = rockCompressibility * (fluidState_.pressure(gasPhaseIdx) - rockRefPressure);
625 porosity_ *= 1.0 + x + 0.5 * x * x;
629 porosity_ *= problem.template rockCompPoroMultiplier<Evaluation>(*
this, globalSpaceIdx);
632 if constexpr (enableBioeffects) {
633 const Evaluation biofilm_ = priVars.makeEvaluation(Indices::biofilmVolumeFractionIdx,
634 timeIdx, linearizationType);
635 Evaluation calcite_ = 0.0;
636 if constexpr (enableMICP) {
637 calcite_ = priVars.makeEvaluation(Indices::calciteVolumeFractionIdx, timeIdx, linearizationType);
639 porosity_ -= min(biofilm_ + calcite_, referencePorosity_ - 1e-8);
643 if (enableSaltPrecipitation && priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
644 const Evaluation Sp = priVars.makeEvaluation(Indices::saltConcentrationIdx, timeIdx);
645 porosity_ *= (1.0 - Sp);
650 if constexpr (enableMech) {
652 if (problem.simulator().vanguard().eclState().runspec().mechSolver().tpsa()) {
654 const Scalar rockBiot = problem.rockBiotComp(globalSpaceIdx);
655 if (rockBiot > 0.0) {
656 const Scalar rockRefPressure = problem.rockReferencePressure(globalSpaceIdx);
657 Evaluation active_pressure;
658 if (FluidSystem::phaseIsActive(oilPhaseIdx)) {
659 active_pressure = fluidState_.pressure(oilPhaseIdx) - rockRefPressure;
660 }
else if (FluidSystem::phaseIsActive(waterPhaseIdx)){
661 active_pressure = fluidState_.pressure(waterPhaseIdx) - rockRefPressure;
663 active_pressure = fluidState_.pressure(gasPhaseIdx) - rockRefPressure;
665 porosity_ += rockBiot * active_pressure;
669 porosity_ += problem.rockMechPoroChange(globalSpaceIdx, timeIdx);
677 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
682 assert(isfinite(fluidState_.density(phaseIdx)));
683 assert(isfinite(fluidState_.saturation(phaseIdx)));
684 assert(isfinite(fluidState_.temperature(phaseIdx)));
685 assert(isfinite(fluidState_.pressure(phaseIdx)));
686 assert(isfinite(fluidState_.invB(phaseIdx)));
688 assert(isfinite(fluidState_.Rs()));
689 assert(isfinite(fluidState_.Rv()));
695 template <
class ...Args>
696 OPM_HOST_DEVICE
void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
698 ParentType::update(elemCtx, dofIdx, timeIdx);
699 const auto& problem = elemCtx.problem();
700 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
701 const unsigned globalSpaceIdx = elemCtx.globalSpaceIndex(dofIdx, timeIdx);
709 if constexpr (enableSolvent) {
710 asImp_().solventPvtUpdate_(elemCtx, dofIdx, timeIdx);
712 if constexpr (enableExtbo) {
713 asImp_().zPvtUpdate_();
715 if constexpr (enablePolymer) {
716 asImp_().polymerPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
718 if constexpr (energyModuleType == EnergyModules::FullyImplicitThermal) {
719 asImp_().updateEnergyQuantities_(elemCtx, dofIdx, timeIdx);
721 if constexpr (enableFoam) {
722 asImp_().foamPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
724 if constexpr (enableBioeffects) {
725 asImp_().bioeffectsPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
727 if constexpr (enableBrine) {
728 asImp_().saltPropertiesUpdate_(elemCtx, dofIdx, timeIdx);
730 if constexpr (enableConvectiveMixing) {
733 if (!problem.simulator().vanguard().eclState().getIOConfig().initOnly()) {
734 if (problem.simulator().vanguard().eclState().runspec().co2Storage()) {
735 if (problem.drsdtconIsActive(globalSpaceIdx, problem.simulator().episodeIndex())) {
736 asImp_().updateSaturatedDissolutionFactor_();
744 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
747 if constexpr (enableDiffusion) {
748 DiffusionIntensiveQuantities::update_(fluidState_, priVars.pvtRegionIndex(), elemCtx, dofIdx, timeIdx);
752 if constexpr (enableDispersion) {
753 DispersionIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
757 template <
class ...Args>
759 const PrimaryVariables& priVars,
760 const unsigned globalSpaceIdx,
761 const unsigned timeIdx)
765 static_assert(!enableSolvent);
766 static_assert(!enableExtbo);
767 static_assert(!enablePolymer);
768 static_assert(!enableFoam);
769 static_assert(!enableMICP);
770 static_assert(!enableBrine);
771 static_assert(!enableDiffusion);
772 static_assert(!enableDispersion);
774 this->extrusionFactor_ = 1.0;
783 template <
class ...Args>
785 const PrimaryVariables& priVars,
786 const unsigned globalSpaceIdx,
787 const unsigned timeIdx)
789 OPM_TIMEBLOCK_LOCAL(blackoilIntensiveQuanititiesUpdate, Subsystem::SatProps | Subsystem::PvtProps);
791 const auto& linearizationType = problem.model().linearizer().getLinearizationType();
792 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
794 fluidState_.setPvtRegionIndex(pvtRegionIdx);
796 updateTempSalt(problem, priVars, globalSpaceIdx, timeIdx, linearizationType);
801 if constexpr (enableExtbo) {
802 asImp_().zFractionUpdate_(priVars, timeIdx);
809 rockCompTransMultiplier_ = problem.template rockCompTransMultiplier<Evaluation>(*
this, globalSpaceIdx);
820 {
return fluidState_; }
824 {
return fluidState_; }
829 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx)
const
830 {
return mobility_[phaseIdx]; }
832 OPM_HOST_DEVICE
const Evaluation&
mobility(
unsigned phaseIdx, FaceDir::DirEnum facedir)
const
834 using Dir = FaceDir::DirEnum;
836 bool constexpr usesStaticFluidSystem = std::is_empty_v<FluidSystem>;
837 if constexpr (usesStaticFluidSystem)
842 return dirMob_->getArray(0)[phaseIdx];
845 return dirMob_->getArray(1)[phaseIdx];
848 return dirMob_->getArray(2)[phaseIdx];
850 OPM_THROW(std::runtime_error,
"Unexpected face direction");
854 OPM_THROW(std::logic_error,
"Directional mobility with non-static fluid system is not supported yet");
858 return mobility_[phaseIdx];
866 {
return porosity_; }
872 {
return rockCompTransMultiplier_; }
882 {
return fluidState_.pvtRegionIndex(); }
890 return fluidState_.viscosity(phaseIdx) *
mobility(phaseIdx);
900 {
return referencePorosity_; }
904 if constexpr (enableBioeffects) {
905 return BioeffectsIntQua::permFactor();
907 else if constexpr (enableSaltPrecipitation) {
908 return BrineIntQua::permFactor();
911 OPM_THROW(std::logic_error,
"permFactor() called but salt precipitation and bioeffects are disabled");
920 return fluidState_.fluidSystem();
932 OPM_HOST_DEVICE Implementation& asImp_()
933 {
return *
static_cast<Implementation*
>(
this); }
936 Scalar referencePorosity_;
937 Evaluation porosity_;
938 Evaluation rockCompTransMultiplier_;
939 std::array<Evaluation, numPhases> mobility_;
956 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:79
OPM_HOST_DEVICE void updatePorosityImpl(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:600
OPM_HOST_DEVICE void update(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilintensivequantities.hh:696
OPM_HOST_DEVICE void updateSaturations(const PrimaryVariables &priVars, const unsigned timeIdx, const LinearizationType lintype)
Definition: blackoilintensivequantities.hh:225
OPM_HOST_DEVICE void updateCommonPart(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:784
BlackOilIntensiveQuantities(const BlackOilIntensiveQuantities< OtherTypeTag > &other, const FluidSystem &fsystem)
Definition: blackoilintensivequantities.hh:181
OPM_HOST_DEVICE Scalar referencePorosity() const
Returns the porosity of the rock at reference conditions.
Definition: blackoilintensivequantities.hh:899
OPM_HOST_DEVICE void updateMobilityAndInvB()
Definition: blackoilintensivequantities.hh:492
OPM_HOST_DEVICE BlackOilIntensiveQuantities & operator=(const BlackOilIntensiveQuantities &other)=default
auto withOtherFluidSystem(const GetPropType< OtherTypeTag, Properties::FluidSystem > &other) const
Definition: blackoilintensivequantities.hh:205
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:881
OPM_HOST_DEVICE const Evaluation & mobility(unsigned phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:829
OPM_HOST_DEVICE void updatePorosity(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilintensivequantities.hh:578
OPM_HOST_DEVICE void updatePhaseDensities()
Definition: blackoilintensivequantities.hh:533
OPM_HOST_DEVICE void updateRelpermAndPressures(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx, const LinearizationType &lintype)
Definition: blackoilintensivequantities.hh:297
OPM_HOST_DEVICE FluidState & fluidState()
Definition: blackoilintensivequantities.hh:823
OPM_HOST_DEVICE void update(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:758
OPM_HOST_DEVICE void updateTempSalt(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx, const LinearizationType &lintype)
Definition: blackoilintensivequantities.hh:211
OPM_HOST_DEVICE const auto & getFluidSystem() const
Returns the fluid system used by this intensive quantities.
Definition: blackoilintensivequantities.hh:918
GetPropType< TypeTag, Properties::Problem > Problem
Definition: blackoilintensivequantities.hh:158
BlackOilFluidState< Scalar, FluidSystem, energyModuleType !=EnergyModules::NoTemperature, energyModuleType==EnergyModules::FullyImplicitThermal, compositionSwitchEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, enableDisgasInWater, enableSolvent, Indices::numPhases > ScalarFluidState
Definition: blackoilintensivequantities.hh:157
OPM_HOST_DEVICE const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: blackoilintensivequantities.hh:819
OPM_HOST_DEVICE Evaluation relativePermeability(unsigned phaseIdx) const
Returns the relative permeability of a given phase within the control volume.
Definition: blackoilintensivequantities.hh:887
BlackOilIntensiveQuantities(const BlackOilIntensiveQuantities &other)=default
OPM_HOST_DEVICE const Evaluation & permFactor() const
Definition: blackoilintensivequantities.hh:902
OPM_HOST_DEVICE BlackOilIntensiveQuantities()
Definition: blackoilintensivequantities.hh:160
OPM_HOST_DEVICE const Evaluation & rockCompTransMultiplier() const
Definition: blackoilintensivequantities.hh:871
OPM_HOST_DEVICE void assertFiniteMembers()
Definition: blackoilintensivequantities.hh:674
OPM_HOST_DEVICE const Evaluation & mobility(unsigned phaseIdx, FaceDir::DirEnum facedir) const
Definition: blackoilintensivequantities.hh:832
OPM_HOST_DEVICE void updatePorosity(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:589
OPM_HOST_DEVICE const Evaluation & porosity() const
Returns the average porosity within the control volume.
Definition: blackoilintensivequantities.hh:865
BlackOilFluidState< Evaluation, FluidSystem, energyModuleType !=EnergyModules::NoTemperature, energyModuleType==EnergyModules::FullyImplicitThermal, compositionSwitchEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, enableDisgasInWater, enableSolvent, Indices::numPhases > FluidState
Definition: blackoilintensivequantities.hh:146
OPM_HOST_DEVICE void updateRsRvRsw(const Problem &problem, const PrimaryVariables &priVars, const unsigned globalSpaceIdx, const unsigned timeIdx)
Definition: blackoilintensivequantities.hh:389
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