81 using Traits = TraitsT;
82 using Scalar =
typename Traits::Scalar;
83 static constexpr int gasPhaseIdx = Traits::gasPhaseIdx;
84 static constexpr int oilPhaseIdx = Traits::nonWettingPhaseIdx;
85 static constexpr int waterPhaseIdx = Traits::wettingPhaseIdx;
86 static constexpr int numPhases = Traits::numPhases;
87 using GasOilEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilEffectiveParamVector;
88 using GasWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterEffectiveParamVector;
89 using OilWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterEffectiveParamVector;
94 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilLaw,
95 typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterLaw,
96 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterLaw>;
97 using MaterialLawParams =
typename MaterialLaw::Params;
98 using DirectionalMaterialLawParamsPtr = std::unique_ptr<DirectionalMaterialLawParams<MaterialLawParams>>;
101 using GasOilScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
102 using OilWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
103 using GasWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
104 using OilWaterScalingInfoVector = std::vector<EclEpsScalingPointsInfo<Scalar>>;
105 using MaterialLawParamsVector = std::vector<std::shared_ptr<MaterialLawParams>>;
110 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage{};
111 GasOilEffectiveParamVector gasOilEffectiveParamVector{};
112 OilWaterEffectiveParamVector oilWaterEffectiveParamVector{};
113 GasWaterEffectiveParamVector gasWaterEffectiveParamVector{};
114 GasOilScalingPointsVector gasOilUnscaledPointsVector{};
115 OilWaterScalingPointsVector oilWaterUnscaledPointsVector{};
116 GasWaterScalingPointsVector gasWaterUnscaledPointsVector{};
117 std::vector<int> krnumXArray{};
118 std::vector<int> krnumYArray{};
119 std::vector<int> krnumZArray{};
120 std::vector<int> imbnumXArray{};
121 std::vector<int> imbnumYArray{};
122 std::vector<int> imbnumZArray{};
123 std::vector<int> satnumRegionArray{};
124 std::vector<int> imbnumRegionArray{};
125 std::vector<MaterialLawParams> materialLawParams{};
126 DirectionalMaterialLawParamsPtr dirMaterialLawParams{};
127 bool onlyPiecewiseLinear =
true;
129 bool hasDirectionalRelperms()
const
131 return !krnumXArray.empty() ||
132 !krnumYArray.empty() ||
133 !krnumZArray.empty();
136 bool hasDirectionalImbnum()
const
138 return !imbnumXArray.empty() ||
139 !imbnumYArray.empty() ||
140 !imbnumZArray.empty();
150 void initParamsForElements(
const EclipseState& eclState,
size_t numCompressedElems,
151 const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
152 fieldPropIntOnLeafAssigner,
153 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
163 std::pair<Scalar, bool>
178 bool enableEndPointScaling()
const
179 {
return enableEndPointScaling_; }
181 bool enablePpcwmax()
const
182 {
return enablePpcwmax_; }
185 {
return hysteresisConfig_; }
187 bool enableHysteresis()
const
190 bool enablePCHysteresis()
const
191 {
return hysteresisConfig_.enablePCHysteresis(); }
193 bool enableWettingHysteresis()
const
194 {
return hysteresisConfig_.enableWettingHysteresis(); }
196 bool enableNonWettingHysteresis()
const
197 {
return hysteresisConfig_.enableNonWettingHysteresis(); }
205 bool hasWater()
const
206 {
return hasWater_; }
208 const EclEpsScalingPointsInfo<Scalar>& unscaledEpsInfo(
unsigned satRegionIdx)
const
209 {
return unscaledEpsInfo_[satRegionIdx]; }
211 std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>
212 wagHystersisConfig(
unsigned satRegionIdx)
const
213 {
return wagHystersisConfig_[satRegionIdx]; }
215 const EclEpsConfig& gasOilConfig()
const
216 {
return gasOilConfig_; }
218 const EclEpsConfig& gasWaterConfig()
const
219 {
return gasWaterConfig_; }
221 const EclEpsConfig& oilWaterConfig()
const
222 {
return oilWaterConfig_; }
224 MaterialLawParams& materialLawParams(
unsigned elemIdx)
226 assert(elemIdx < params_.materialLawParams.size());
227 return params_.materialLawParams[elemIdx];
230 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const
232 assert(elemIdx < params_.materialLawParams.size());
233 return params_.materialLawParams[elemIdx];
236 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const
237 {
return materialLawParamsFunc_(elemIdx, facedir); }
239 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
240 {
return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir)); }
252 int satnumRegionIdx(
unsigned elemIdx)
const
253 {
return params_.satnumRegionArray[elemIdx]; }
255 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
257 bool hasDirectionalRelperms()
const
258 {
return params_.hasDirectionalRelperms(); }
260 bool hasDirectionalImbnum()
const
261 {
return params_.hasDirectionalImbnum(); }
263 int imbnumRegionIdx(
unsigned elemIdx)
const
264 {
return params_.imbnumRegionArray[elemIdx]; }
266 EclMultiplexerApproach threePhaseApproach()
const
267 {
return threePhaseApproach_; }
269 EclTwoPhaseApproach twoPhaseApproach()
const
270 {
return twoPhaseApproach_; }
272 const std::vector<Scalar>& stoneEtas()
const
273 {
return stoneEtas_; }
275 template <
class Flu
idState>
276 bool updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
278 OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
279 if (!enableHysteresis())
282 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
283 using Dir = FaceDir::DirEnum;
284 constexpr int ndim = 3;
285 const Dir facedirs[] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
286 for (
int i = 0; i<ndim; i++) {
287 const bool ischanged =
289 changed = changed || ischanged;
295 void oilWaterHysteresisParams(Scalar& soMax,
298 unsigned elemIdx)
const;
300 void setOilWaterHysteresisParams(
const Scalar& soMax,
305 void gasOilHysteresisParams(Scalar& sgmax,
308 unsigned elemIdx)
const;
310 void setGasOilHysteresisParams(
const Scalar& sgmax,
315 EclEpsScalingPoints<Scalar>& oilWaterScaledEpsPointsDrainage(
unsigned elemIdx);
317 const EclEpsScalingPointsInfo<Scalar>& oilWaterScaledEpsInfoDrainage(
size_t elemIdx)
const
318 {
return params_.oilWaterScaledEpsInfoDrainage[elemIdx]; }
320 template<
class Serializer>
321 void serializeOp(Serializer& serializer)
327 for (
auto& mat : params_.materialLawParams) {
332 bool satCurveIsAllPiecewiseLinear()
const
334 return this->params_.onlyPiecewiseLinear;
338 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
340 void readGlobalEpsOptions_(
const EclipseState& eclState);
342 void readGlobalHysteresisOptions_(
const EclipseState& state);
344 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
346 bool enableEndPointScaling_{
false};
347 EclHysteresisConfig hysteresisConfig_;
348 std::vector<std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>> wagHystersisConfig_;
350 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
354 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
356 EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
358 std::vector<Scalar> stoneEtas_;
360 bool enablePpcwmax_{
false};
361 std::vector<Scalar> maxAllowPc_;
362 std::vector<bool> modifySwl_;
366 bool hasWater_{
true};
368 EclEpsConfig gasOilConfig_;
369 EclEpsConfig oilWaterConfig_;
370 EclEpsConfig gasWaterConfig_;