28 #ifndef OPM_ECL_MATERIAL_LAW_MANAGER_HPP 29 #define OPM_ECL_MATERIAL_LAW_MANAGER_HPP 31 #include <opm/input/eclipse/EclipseState/Grid/FaceDir.hpp> 32 #include <opm/input/eclipse/EclipseState/WagHysteresisConfig.hpp> 52 class EclEpsGridProperties;
53 template<
class Scalar>
class EclEpsScalingPoints;
54 template<
class Scalar>
struct EclEpsScalingPointsInfo;
55 class EclHysteresisConfig;
57 class FieldPropsManager;
68 template<
class Traits>
class InitParams;
76 template <
class TraitsT>
79 using Traits = TraitsT;
80 using Scalar =
typename Traits::Scalar;
81 static constexpr
int gasPhaseIdx = Traits::gasPhaseIdx;
82 static constexpr
int oilPhaseIdx = Traits::nonWettingPhaseIdx;
83 static constexpr
int waterPhaseIdx = Traits::wettingPhaseIdx;
84 static constexpr
int numPhases = Traits::numPhases;
85 using GasOilEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilEffectiveParamVector;
86 using GasWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterEffectiveParamVector;
87 using OilWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterEffectiveParamVector;
91 using MaterialLaw = EclMultiplexerMaterial<Traits,
92 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilLaw,
93 typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterLaw,
94 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterLaw>;
95 using MaterialLawParams =
typename MaterialLaw::Params;
96 using DirectionalMaterialLawParamsPtr = std::unique_ptr<DirectionalMaterialLawParams<MaterialLawParams>>;
99 using GasOilScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
100 using OilWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
101 using GasWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
102 using OilWaterScalingInfoVector = std::vector<EclEpsScalingPointsInfo<Scalar>>;
103 using MaterialLawParamsVector = std::vector<std::shared_ptr<MaterialLawParams>>;
108 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage{};
109 GasOilEffectiveParamVector gasOilEffectiveParamVector{};
110 OilWaterEffectiveParamVector oilWaterEffectiveParamVector{};
111 GasWaterEffectiveParamVector gasWaterEffectiveParamVector{};
112 GasOilScalingPointsVector gasOilUnscaledPointsVector{};
113 OilWaterScalingPointsVector oilWaterUnscaledPointsVector{};
114 GasWaterScalingPointsVector gasWaterUnscaledPointsVector{};
115 std::vector<int> krnumXArray{};
116 std::vector<int> krnumYArray{};
117 std::vector<int> krnumZArray{};
118 std::vector<int> imbnumXArray{};
119 std::vector<int> imbnumYArray{};
120 std::vector<int> imbnumZArray{};
121 std::vector<int> satnumRegionArray{};
122 std::vector<int> imbnumRegionArray{};
123 std::vector<MaterialLawParams> materialLawParams{};
124 DirectionalMaterialLawParamsPtr dirMaterialLawParams{};
125 bool onlyPiecewiseLinear =
true;
127 bool hasDirectionalRelperms()
const 129 return !krnumXArray.empty() ||
130 !krnumYArray.empty() ||
131 !krnumZArray.empty();
134 bool hasDirectionalImbnum()
const 136 return !imbnumXArray.empty() ||
137 !imbnumYArray.empty() ||
138 !imbnumZArray.empty();
148 void initParamsForElements(
const EclipseState& eclState, std::size_t numCompressedElems,
149 const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
150 fieldPropIntOnLeafAssigner,
151 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
161 std::pair<Scalar, bool>
176 bool enableEndPointScaling()
const 177 {
return enableEndPointScaling_; }
179 bool enablePpcwmax()
const 180 {
return enablePpcwmax_; }
183 {
return hysteresisConfig_; }
185 bool enableHysteresis()
const 188 bool enablePCHysteresis()
const 189 {
return hysteresisConfig_.enablePCHysteresis(); }
191 bool enableWettingHysteresis()
const 192 {
return hysteresisConfig_.enableWettingHysteresis(); }
194 bool enableNonWettingHysteresis()
const 195 {
return hysteresisConfig_.enableNonWettingHysteresis(); }
203 bool hasWater()
const 204 {
return hasWater_; }
206 const EclEpsScalingPointsInfo<Scalar>& unscaledEpsInfo(
unsigned satRegionIdx)
const 207 {
return unscaledEpsInfo_[satRegionIdx]; }
209 std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>
210 wagHystersisConfig(
unsigned satRegionIdx)
const 211 {
return wagHystersisConfig_[satRegionIdx]; }
213 const EclEpsConfig& gasOilConfig()
const 214 {
return gasOilConfig_; }
216 const EclEpsConfig& gasWaterConfig()
const 217 {
return gasWaterConfig_; }
219 const EclEpsConfig& oilWaterConfig()
const 220 {
return oilWaterConfig_; }
222 MaterialLawParams& materialLawParams(
unsigned elemIdx)
224 assert(elemIdx < params_.materialLawParams.size());
225 return params_.materialLawParams[elemIdx];
228 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const 230 assert(elemIdx < params_.materialLawParams.size());
231 return params_.materialLawParams[elemIdx];
234 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const 235 {
return materialLawParamsFunc_(elemIdx, facedir); }
237 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
238 {
return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir)); }
250 int satnumRegionIdx(
unsigned elemIdx)
const 251 {
return params_.satnumRegionArray[elemIdx]; }
253 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
255 bool hasDirectionalRelperms()
const 256 {
return params_.hasDirectionalRelperms(); }
258 bool hasDirectionalImbnum()
const 259 {
return params_.hasDirectionalImbnum(); }
261 int imbnumRegionIdx(
unsigned elemIdx)
const 262 {
return params_.imbnumRegionArray[elemIdx]; }
264 EclMultiplexerApproach threePhaseApproach()
const 265 {
return threePhaseApproach_; }
267 EclTwoPhaseApproach twoPhaseApproach()
const 268 {
return twoPhaseApproach_; }
270 const std::vector<Scalar>& stoneEtas()
const 271 {
return stoneEtas_; }
273 template <
class Flu
idState>
274 bool updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
276 OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
277 if (!enableHysteresis())
280 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
281 using Dir = FaceDir::DirEnum;
282 constexpr
int ndim = 3;
283 const Dir facedirs[] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
284 for (
int i = 0; i<ndim; i++) {
285 const bool ischanged =
287 changed = changed || ischanged;
293 void oilWaterHysteresisParams(Scalar& soMax,
296 unsigned elemIdx)
const;
298 void setOilWaterHysteresisParams(
const Scalar& soMax,
303 void gasOilHysteresisParams(Scalar& sgmax,
306 unsigned elemIdx)
const;
308 void setGasOilHysteresisParams(
const Scalar& sgmax,
313 EclEpsScalingPoints<Scalar>& oilWaterScaledEpsPointsDrainage(
unsigned elemIdx);
315 const EclEpsScalingPointsInfo<Scalar>& oilWaterScaledEpsInfoDrainage(std::size_t elemIdx)
const 316 {
return params_.oilWaterScaledEpsInfoDrainage[elemIdx]; }
318 template<
class Serializer>
319 void serializeOp(Serializer& serializer)
325 for (
auto& mat : params_.materialLawParams) {
330 bool satCurveIsAllPiecewiseLinear()
const 332 return this->params_.onlyPiecewiseLinear;
336 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
338 void readGlobalEpsOptions_(
const EclipseState& eclState);
340 void readGlobalHysteresisOptions_(
const EclipseState& state);
342 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
344 bool enableEndPointScaling_{
false};
345 EclHysteresisConfig hysteresisConfig_;
346 std::vector<std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>> wagHystersisConfig_;
348 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
352 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
354 EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
356 std::vector<Scalar> stoneEtas_;
358 bool enablePpcwmax_{
false};
359 std::vector<Scalar> maxAllowPc_;
360 std::vector<bool> modifySwl_;
364 bool hasWater_{
true};
366 EclEpsConfig gasOilConfig_;
367 EclEpsConfig oilWaterConfig_;
368 EclEpsConfig gasWaterConfig_;
This material law implements the hysteresis model of the ECL file format.
EclTwoPhaseSystemType
Specified which fluids are involved in a given twophase material law for endpoint scaling...
Definition: EclEpsConfig.hpp:42
static bool updateHysteresis(Params ¶ms, const FluidState &fluidState)
Update the hysteresis parameters after a time step.
Definition: EclMultiplexerMaterial.hpp:577
Definition: EclMaterialLawHystParams.cpp:28
This file contains definitions related to directional material law parameters.
Definition: FieldPropsManager.hpp:42
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
This file contains helper classes for the material laws.
Definition: EclipseState.hpp:66
This material law takes a material law defined for unscaled saturation and converts it to a material ...
const MaterialLawParams & connectionMaterialLawParams(unsigned satRegionIdx, unsigned elemIdx) const
Returns a material parameter object for a given element and saturation region.
Definition: EclMaterialLawManager.cpp:246
Specifies the configuration used by the ECL kr/pC hysteresis code.
Definition: EclHysteresisConfig.hpp:39
Specifies the configuration used by the endpoint scaling code.
std::pair< Scalar, bool > applySwatinit(unsigned elemIdx, Scalar pcow, Scalar Sw)
Modify the initial condition according to the SWATINIT keyword.
Definition: EclMaterialLawManager.cpp:138
bool enableHysteresis() const
Returns whether hysteresis is enabled.
Definition: EclHysteresisConfig.hpp:51
Implements a multiplexer class that provides all three phase capillary pressure laws used by the ECLi...
void applyRestartSwatInit(const unsigned elemIdx, const Scalar maxPcow)
Apply SWATINIT-like scaling of oil/water capillary pressure curve at simulation restart.
Definition: EclMaterialLawManager.cpp:213
Definition: EclMaterialLawManager.hpp:106
Implements a multiplexer class that provides LET curves and piecewise linear saturation functions...