28 #ifndef OPM_EQUIL_INITIALIZER_HPP 29 #define OPM_EQUIL_INITIALIZER_HPP 31 #include <opm/grid/common/CartesianIndexMapper.hpp> 33 #include <opm/material/fluidmatrixinteractions/EclMaterialLawManager.hpp> 34 #include <opm/material/fluidstates/BlackOilFluidState.hpp> 57 template <
class TypeTag>
67 enum { numPhases = FluidSystem::numPhases };
68 enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
69 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
70 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
72 enum { numComponents = FluidSystem::numComponents };
73 enum { oilCompIdx = FluidSystem::oilCompIdx };
74 enum { gasCompIdx = FluidSystem::gasCompIdx };
75 enum { waterCompIdx = FluidSystem::waterCompIdx };
77 enum { dimWorld = GridView::dimensionworld };
78 enum { enableDissolution = Indices::compositionSwitchIdx >= 0 };
79 enum { enableBrine = getPropValue<TypeTag, Properties::EnableBrine>() };
80 enum { enableVapwat = getPropValue<TypeTag, Properties::EnableVapwat>() };
81 enum { enableSaltPrecipitation = getPropValue<TypeTag, Properties::EnableSaltPrecipitation>() };
82 enum { enableDisgasInWater = getPropValue<TypeTag, Properties::EnableDisgasInWater>() };
83 enum { enableDissolvedGas = Indices::compositionSwitchIdx >= 0 };
84 enum { enableSolvent = getPropValue<TypeTag, Properties::EnableSolvent>() };
85 static constexpr EnergyModules energyModuleType = getPropValue<TypeTag, Properties::EnergyModuleType>();
90 using ScalarFluidState = BlackOilFluidState<Scalar,
92 energyModuleType != EnergyModules::NoTemperature,
93 energyModuleType == EnergyModules::FullyImplicitThermal,
97 enableSaltPrecipitation,
103 template <
class EclMaterialLawManager>
105 EclMaterialLawManager& materialLawManager)
106 : simulator_(simulator)
108 const auto& vanguard = simulator.vanguard();
109 const auto& eclState = vanguard.eclState();
111 unsigned numElems = vanguard.grid().size(0);
119 CartesianIndexMapper>;
121 Initializer initialState(materialLawManager,
125 vanguard.cartesianMapper(),
126 simulator.problem().gravity()[dimWorld - 1],
127 simulator.problem().numPressurePointsEquil());
130 initialFluidStates_.resize(numElems);
131 for (
unsigned int elemIdx = 0; elemIdx < numElems; ++elemIdx) {
132 auto& fluidState = initialFluidStates_[elemIdx];
135 unsigned regionIdx = simulator_.problem().pvtRegionIndex(elemIdx);
136 fluidState.setPvtRegionIndex(regionIdx);
139 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
140 if (FluidSystem::phaseIsActive(phaseIdx))
141 fluidState.setSaturation(phaseIdx, initialState.saturation()[phaseIdx][elemIdx]);
142 else if (Indices::numPhases == 3)
143 fluidState.setSaturation(phaseIdx, 0.0);
146 if constexpr (enableDissolvedGas) {
147 if (FluidSystem::enableDissolvedGas())
148 fluidState.setRs(initialState.rs()[elemIdx]);
149 else if (Indices::gasEnabled && Indices::oilEnabled)
150 fluidState.setRs(0.0);
151 if (FluidSystem::enableVaporizedOil())
152 fluidState.setRv(initialState.rv()[elemIdx]);
153 else if (Indices::gasEnabled && Indices::oilEnabled)
154 fluidState.setRv(0.0);
157 if constexpr (enableVapwat) {
158 if (FluidSystem::enableVaporizedWater())
159 fluidState.setRvw(initialState.rvw()[elemIdx]);
163 if constexpr (energyModuleType != EnergyModules::NoTemperature)
164 fluidState.setTemperature(initialState.temperature()[elemIdx]);
167 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
168 if (!FluidSystem::phaseIsActive(phaseIdx))
170 fluidState.setPressure(phaseIdx, initialState.press()[phaseIdx][elemIdx]);
172 const auto& b = FluidSystem::inverseFormationVolumeFactor(fluidState, phaseIdx, regionIdx);
173 fluidState.setInvB(phaseIdx, b);
175 const auto& rho = FluidSystem::density(fluidState, phaseIdx, regionIdx);
176 fluidState.setDensity(phaseIdx, rho);
178 if constexpr (energyModuleType == EnergyModules::FullyImplicitThermal) {
179 const auto& h = FluidSystem::enthalpy(fluidState, phaseIdx, regionIdx);
180 fluidState.setEnthalpy(phaseIdx, h);
185 if constexpr (enableBrine)
186 fluidState.setSaltConcentration(initialState.saltConcentration()[elemIdx]);
189 if constexpr (enableSaltPrecipitation)
190 fluidState.setSaltSaturation(initialState.saltSaturation()[elemIdx]);
202 return initialFluidStates_[elemIdx];
208 std::vector<ScalarFluidState> initialFluidStates_;
212 #endif // OPM_EQUIL_INITIALIZER_HPP 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
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
const ScalarFluidState & initialFluidState(unsigned elemIdx) const
Return the initial thermodynamic state which should be used as the initial condition.
Definition: EquilInitializer.hpp:200
Definition: InitStateEquil.hpp:703
Declares the properties required by the black oil model.
Declare the properties used by the infrastructure code of the finite volume discretizations.
Computes the initial condition based on the EQUIL keyword from ECL.
Definition: EquilInitializer.hpp:58
The Opm property system, traits with inheritance.
Routines that actually solve the ODEs that emerge from the hydrostatic equilibrium problem...
Contains the classes required to extend the black-oil model by energy.
Definition: CollectDataOnIORank.hpp:49
Manages the initializing and running of time dependent problems.
Definition: simulator.hh:83