78 using Traits = TraitsT;
79 using Scalar =
typename Traits::Scalar;
80 static constexpr int gasPhaseIdx = Traits::gasPhaseIdx;
81 static constexpr int oilPhaseIdx = Traits::nonWettingPhaseIdx;
82 static constexpr int waterPhaseIdx = Traits::wettingPhaseIdx;
83 static constexpr int numPhases = Traits::numPhases;
84 using GasOilEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilEffectiveParamVector;
85 using GasWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterEffectiveParamVector;
86 using OilWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterEffectiveParamVector;
91 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilLaw,
92 typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterLaw,
93 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterLaw>;
94 using MaterialLawParams =
typename MaterialLaw::Params;
95 using DirectionalMaterialLawParamsPtr = std::unique_ptr<DirectionalMaterialLawParams<MaterialLawParams>>;
98 using GasOilScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
99 using OilWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
100 using GasWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
101 using OilWaterScalingInfoVector = std::vector<EclEpsScalingPointsInfo<Scalar>>;
102 using MaterialLawParamsVector = std::vector<std::shared_ptr<MaterialLawParams>>;
107 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage{};
108 GasOilEffectiveParamVector gasOilEffectiveParamVector{};
109 OilWaterEffectiveParamVector oilWaterEffectiveParamVector{};
110 GasWaterEffectiveParamVector gasWaterEffectiveParamVector{};
111 GasOilScalingPointsVector gasOilUnscaledPointsVector{};
112 OilWaterScalingPointsVector oilWaterUnscaledPointsVector{};
113 GasWaterScalingPointsVector gasWaterUnscaledPointsVector{};
114 std::vector<int> krnumXArray{};
115 std::vector<int> krnumYArray{};
116 std::vector<int> krnumZArray{};
117 std::vector<int> imbnumXArray{};
118 std::vector<int> imbnumYArray{};
119 std::vector<int> imbnumZArray{};
120 std::vector<int> satnumRegionArray{};
121 std::vector<int> imbnumRegionArray{};
122 std::vector<MaterialLawParams> materialLawParams{};
123 DirectionalMaterialLawParamsPtr dirMaterialLawParams{};
124 bool onlyPiecewiseLinear =
true;
126 bool hasDirectionalRelperms()
const
128 return !krnumXArray.empty() ||
129 !krnumYArray.empty() ||
130 !krnumZArray.empty();
133 bool hasDirectionalImbnum()
const
135 return !imbnumXArray.empty() ||
136 !imbnumYArray.empty() ||
137 !imbnumZArray.empty();
147 void initParamsForElements(
const EclipseState& eclState,
size_t numCompressedElems,
148 const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
149 fieldPropIntOnLeafAssigner,
150 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
160 std::pair<Scalar, bool>
175 bool enableEndPointScaling()
const
176 {
return enableEndPointScaling_; }
178 bool enablePpcwmax()
const
179 {
return enablePpcwmax_; }
182 {
return hysteresisConfig_; }
184 bool enableHysteresis()
const
187 bool enablePCHysteresis()
const
188 {
return hysteresisConfig_.enablePCHysteresis(); }
190 bool enableWettingHysteresis()
const
191 {
return hysteresisConfig_.enableWettingHysteresis(); }
193 bool enableNonWettingHysteresis()
const
194 {
return hysteresisConfig_.enableNonWettingHysteresis(); }
202 bool hasWater()
const
203 {
return hasWater_; }
205 const EclEpsScalingPointsInfo<Scalar>& unscaledEpsInfo(
unsigned satRegionIdx)
const
206 {
return unscaledEpsInfo_[satRegionIdx]; }
208 std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>
209 wagHystersisConfig(
unsigned satRegionIdx)
const
210 {
return wagHystersisConfig_[satRegionIdx]; }
212 const EclEpsConfig& gasOilConfig()
const
213 {
return gasOilConfig_; }
215 const EclEpsConfig& gasWaterConfig()
const
216 {
return gasWaterConfig_; }
218 const EclEpsConfig& oilWaterConfig()
const
219 {
return oilWaterConfig_; }
221 MaterialLawParams& materialLawParams(
unsigned elemIdx)
223 assert(elemIdx < params_.materialLawParams.size());
224 return params_.materialLawParams[elemIdx];
227 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const
229 assert(elemIdx < params_.materialLawParams.size());
230 return params_.materialLawParams[elemIdx];
233 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const
234 {
return materialLawParamsFunc_(elemIdx, facedir); }
236 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
237 {
return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir)); }
249 int satnumRegionIdx(
unsigned elemIdx)
const
250 {
return params_.satnumRegionArray[elemIdx]; }
252 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
254 bool hasDirectionalRelperms()
const
255 {
return params_.hasDirectionalRelperms(); }
257 bool hasDirectionalImbnum()
const
258 {
return params_.hasDirectionalImbnum(); }
260 int imbnumRegionIdx(
unsigned elemIdx)
const
261 {
return params_.imbnumRegionArray[elemIdx]; }
263 EclMultiplexerApproach threePhaseApproach()
const
264 {
return threePhaseApproach_; }
266 EclTwoPhaseApproach twoPhaseApproach()
const
267 {
return twoPhaseApproach_; }
269 const std::vector<Scalar>& stoneEtas()
const
270 {
return stoneEtas_; }
272 template <
class Flu
idState>
273 bool updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
275 OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
276 if (!enableHysteresis())
279 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
280 using Dir = FaceDir::DirEnum;
281 constexpr int ndim = 3;
282 const Dir facedirs[] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
283 for (
int i = 0; i<ndim; i++) {
284 const bool ischanged =
286 changed = changed || ischanged;
292 void oilWaterHysteresisParams(Scalar& soMax,
295 unsigned elemIdx)
const;
297 void setOilWaterHysteresisParams(
const Scalar& soMax,
302 void gasOilHysteresisParams(Scalar& sgmax,
305 unsigned elemIdx)
const;
307 void setGasOilHysteresisParams(
const Scalar& sgmax,
312 EclEpsScalingPoints<Scalar>& oilWaterScaledEpsPointsDrainage(
unsigned elemIdx);
314 const EclEpsScalingPointsInfo<Scalar>& oilWaterScaledEpsInfoDrainage(
size_t elemIdx)
const
315 {
return params_.oilWaterScaledEpsInfoDrainage[elemIdx]; }
317 template<
class Serializer>
318 void serializeOp(Serializer& serializer)
324 for (
auto& mat : params_.materialLawParams) {
329 bool satCurveIsAllPiecewiseLinear()
const
331 return this->params_.onlyPiecewiseLinear;
335 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
337 void readGlobalEpsOptions_(
const EclipseState& eclState);
339 void readGlobalHysteresisOptions_(
const EclipseState& state);
341 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
343 bool enableEndPointScaling_{
false};
344 EclHysteresisConfig hysteresisConfig_;
345 std::vector<std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>> wagHystersisConfig_;
347 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
351 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
353 EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
355 std::vector<Scalar> stoneEtas_;
357 bool enablePpcwmax_{
false};
358 std::vector<Scalar> maxAllowPc_;
359 std::vector<bool> modifySwl_;
363 bool hasWater_{
true};
365 EclEpsConfig gasOilConfig_;
366 EclEpsConfig oilWaterConfig_;
367 EclEpsConfig gasWaterConfig_;