76 using Traits = TraitsT;
77 using Scalar =
typename Traits::Scalar;
78 enum { waterPhaseIdx = Traits::wettingPhaseIdx };
79 enum { oilPhaseIdx = Traits::nonWettingPhaseIdx };
80 enum { gasPhaseIdx = Traits::gasPhaseIdx };
81 enum { numPhases = Traits::numPhases };
92 using GasOilEffectiveTwoPhaseParams =
typename GasOilEffectiveTwoPhaseLaw::Params;
93 using OilWaterEffectiveTwoPhaseParams =
typename OilWaterEffectiveTwoPhaseLaw::Params;
94 using GasWaterEffectiveTwoPhaseParams =
typename GasWaterEffectiveTwoPhaseLaw::Params;
100 using GasOilEpsTwoPhaseParams =
typename GasOilEpsTwoPhaseLaw::Params;
101 using OilWaterEpsTwoPhaseParams =
typename OilWaterEpsTwoPhaseLaw::Params;
102 using GasWaterEpsTwoPhaseParams =
typename GasWaterEpsTwoPhaseLaw::Params;
108 using GasOilTwoPhaseHystParams =
typename GasOilTwoPhaseLaw::Params;
109 using OilWaterTwoPhaseHystParams =
typename OilWaterTwoPhaseLaw::Params;
110 using GasWaterTwoPhaseHystParams =
typename GasWaterTwoPhaseLaw::Params;
115 using MaterialLawParams =
typename MaterialLaw::Params;
116 using DirectionalMaterialLawParamsPtr = std::unique_ptr<DirectionalMaterialLawParams<MaterialLawParams>>;
123 using GasOilEffectiveParamVector = std::vector<std::shared_ptr<GasOilEffectiveTwoPhaseParams>>;
124 using OilWaterEffectiveParamVector = std::vector<std::shared_ptr<OilWaterEffectiveTwoPhaseParams>>;
125 using GasWaterEffectiveParamVector = std::vector<std::shared_ptr<GasWaterEffectiveTwoPhaseParams>>;
127 using GasOilScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
128 using OilWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
129 using GasWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
130 using OilWaterScalingInfoVector = std::vector<EclEpsScalingPointsInfo<Scalar>>;
131 using GasOilParamVector = std::vector<std::shared_ptr<GasOilTwoPhaseHystParams>>;
132 using OilWaterParamVector = std::vector<std::shared_ptr<OilWaterTwoPhaseHystParams>>;
133 using GasWaterParamVector = std::vector<std::shared_ptr<GasWaterTwoPhaseHystParams>>;
134 using MaterialLawParamsVector = std::vector<std::shared_ptr<MaterialLawParams>>;
146 void run(
const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>& fieldPropIntOnLeafAssigner,
147 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
152 void copySatnumArrays_(
const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
153 fieldPropIntOnLeafAssigner);
156 void copyIntArray_(std::vector<int>& dest,
const std::string& keyword,
157 const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
158 fieldPropIntOnLeafAssigner);
159 unsigned imbRegion_(std::vector<int>& array,
unsigned elemIdx);
161 std::vector<std::vector<int>*>& satnumArray,
162 std::vector<std::vector<int>*>& imbnumArray,
163 std::vector<std::vector<MaterialLawParams>*>& mlpArray);
164 void initMaterialLawParamVectors_();
165 void initOilWaterScaledEpsInfo_();
168 void initSatnumRegionArray_(
const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
169 fieldPropIntOnLeafAssigner);
170 void initThreePhaseParams_(
171 HystParams &hystParams,
172 MaterialLawParams& materialParams,
173 unsigned satRegionIdx,
175 void readEffectiveParameters_();
176 void readUnscaledEpsPointsVectors_();
177 template <
class Container>
178 void readUnscaledEpsPoints_(Container& dest, std::shared_ptr<EclEpsConfig> config,
EclTwoPhaseSystemType system_type);
179 unsigned satRegion_(std::vector<int>& array,
unsigned elemIdx);
180 unsigned satOrImbRegion_(std::vector<int>& array, std::vector<int>& default_vec,
unsigned elemIdx);
187 std::shared_ptr<GasOilTwoPhaseHystParams> getGasOilParams();
188 std::shared_ptr<OilWaterTwoPhaseHystParams> getOilWaterParams();
189 std::shared_ptr<GasWaterTwoPhaseHystParams> getGasWaterParams();
190 void setConfig(
unsigned satRegionIdx);
193 void setDrainageParamsOilGas(
unsigned elemIdx,
unsigned satRegionIdx,
194 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
195 void setDrainageParamsOilWater(
unsigned elemIdx,
unsigned satRegionIdx,
196 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
197 void setDrainageParamsGasWater(
unsigned elemIdx,
unsigned satRegionIdx,
198 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
199 void setImbibitionParamsOilGas(
unsigned elemIdx,
unsigned satRegionIdx,
200 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
201 void setImbibitionParamsOilWater(
unsigned elemIdx,
unsigned satRegionIdx,
202 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
203 void setImbibitionParamsGasWater(
unsigned elemIdx,
unsigned satRegionIdx,
204 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
214 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
217 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
220 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
225 std::shared_ptr<GasOilTwoPhaseHystParams> gasOilParams_;
226 std::shared_ptr<OilWaterTwoPhaseHystParams> oilWaterParams_;
227 std::shared_ptr<GasWaterTwoPhaseHystParams> gasWaterParams_;
231 class ReadEffectiveParams {
236 std::vector<double> normalizeKrValues_(
const double tolcrit,
const TableColumn& krValues)
const;
237 void readGasOilParameters_(GasOilEffectiveParamVector& dest,
unsigned satRegionIdx);
238 template <
class TableType>
239 void readGasOilFamily2_(
240 GasOilEffectiveTwoPhaseParams& effParams,
242 const double tolcrit,
243 const TableType& sofTable,
245 const std::string& columnName);
246 void readGasOilSgof_(GasOilEffectiveTwoPhaseParams& effParams,
248 const double tolcrit,
251 void readGasOilSlgof_(GasOilEffectiveTwoPhaseParams& effParams,
253 const double tolcrit,
255 void readGasWaterParameters_(GasWaterEffectiveParamVector& dest,
unsigned satRegionIdx);
256 void readOilWaterParameters_(OilWaterEffectiveParamVector& dest,
unsigned satRegionIdx);
265 size_t numCompressedElems_;
267 std::unique_ptr<EclEpsGridProperties> epsImbGridProperties_;
268 std::unique_ptr<EclEpsGridProperties> epsGridProperties_;
279 void initParamsForElements(
const EclipseState& eclState,
size_t numCompressedElems,
280 const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
281 fieldPropIntOnLeafAssigner,
282 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
292 std::pair<Scalar, bool>
307 bool enableEndPointScaling()
const
308 {
return enableEndPointScaling_; }
310 bool enablePpcwmax()
const
311 {
return enablePpcwmax_; }
313 bool enableHysteresis()
const
314 {
return hysteresisConfig_->enableHysteresis(); }
316 bool enablePCHysteresis()
const
317 {
return (enableHysteresis() && hysteresisConfig_->pcHysteresisModel() >= 0); }
319 bool enableWettingHysteresis()
const
320 {
return (enableHysteresis() && hysteresisConfig_->krHysteresisModel() >= 4); }
322 bool enableNonWettingHysteresis()
const
323 {
return (enableHysteresis() && hysteresisConfig_->krHysteresisModel() >= 0); }
325 MaterialLawParams& materialLawParams(
unsigned elemIdx)
327 assert(elemIdx < materialLawParams_.size());
328 return materialLawParams_[elemIdx];
331 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const
333 assert(elemIdx < materialLawParams_.size());
334 return materialLawParams_[elemIdx];
337 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const
339 return materialLawParamsFunc_(elemIdx, facedir);
342 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
344 return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir));
357 int satnumRegionIdx(
unsigned elemIdx)
const
358 {
return satnumRegionArray_[elemIdx]; }
360 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
362 bool hasDirectionalRelperms()
const
364 return !krnumXArray_.empty() || !krnumYArray_.empty() || !krnumZArray_.empty();
367 bool hasDirectionalImbnum()
const {
368 if (imbnumXArray_.size() > 0 || imbnumYArray_.size() > 0 || imbnumZArray_.size() > 0) {
374 int imbnumRegionIdx(
unsigned elemIdx)
const
375 {
return imbnumRegionArray_[elemIdx]; }
377 template <
class Flu
idState>
378 bool updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
380 OPM_TIMEFUNCTION_LOCAL();
381 if (!enableHysteresis())
384 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
385 using Dir = FaceDir::DirEnum;
386 constexpr int ndim = 3;
387 Dir facedirs[ndim] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
388 for (
int i = 0; i<ndim; i++) {
390 changed = changed || ischanged;
396 void oilWaterHysteresisParams(Scalar& soMax,
399 unsigned elemIdx)
const;
401 void setOilWaterHysteresisParams(
const Scalar& soMax,
406 void gasOilHysteresisParams(Scalar& sgmax,
409 unsigned elemIdx)
const;
411 void setGasOilHysteresisParams(
const Scalar& sgmax,
419 {
return oilWaterScaledEpsInfoDrainage_[elemIdx]; }
421 template<
class Serializer>
428 for (
auto& mat : materialLawParams_) {
434 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
436 void readGlobalEpsOptions_(
const EclipseState& eclState);
438 void readGlobalHysteresisOptions_(
const EclipseState& state);
440 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
442 bool enableEndPointScaling_;
443 std::shared_ptr<EclHysteresisConfig> hysteresisConfig_;
444 std::vector<std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>> wagHystersisConfig_;
447 std::shared_ptr<EclEpsConfig> oilWaterEclEpsConfig_;
448 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
449 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage_;
451 std::shared_ptr<EclEpsConfig> gasWaterEclEpsConfig_;
453 GasOilScalingPointsVector gasOilUnscaledPointsVector_;
454 OilWaterScalingPointsVector oilWaterUnscaledPointsVector_;
455 GasWaterScalingPointsVector gasWaterUnscaledPointsVector_;
457 GasOilEffectiveParamVector gasOilEffectiveParamVector_;
458 OilWaterEffectiveParamVector oilWaterEffectiveParamVector_;
459 GasWaterEffectiveParamVector gasWaterEffectiveParamVector_;
461 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
463 enum EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
465 std::vector<MaterialLawParams> materialLawParams_;
466 DirectionalMaterialLawParamsPtr dirMaterialLawParams_;
468 std::vector<int> satnumRegionArray_;
469 std::vector<int> krnumXArray_;
470 std::vector<int> krnumYArray_;
471 std::vector<int> krnumZArray_;
472 std::vector<int> imbnumXArray_;
473 std::vector<int> imbnumYArray_;
474 std::vector<int> imbnumZArray_;
475 std::vector<int> imbnumRegionArray_;
476 std::vector<Scalar> stoneEtas_;
479 std::vector<Scalar> maxAllowPc_;
480 std::vector<bool> modifySwl_;
486 std::shared_ptr<EclEpsConfig> gasOilConfig_;
487 std::shared_ptr<EclEpsConfig> oilWaterConfig_;
488 std::shared_ptr<EclEpsConfig> gasWaterConfig_;