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 MaterialLawParams& materialLawParams(
unsigned elemIdx)
318 assert(elemIdx < materialLawParams_.size());
319 return materialLawParams_[elemIdx];
322 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const
324 assert(elemIdx < materialLawParams_.size());
325 return materialLawParams_[elemIdx];
328 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const
330 return materialLawParamsFunc_(elemIdx, facedir);
333 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
335 return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir));
348 int satnumRegionIdx(
unsigned elemIdx)
const
349 {
return satnumRegionArray_[elemIdx]; }
351 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
353 bool hasDirectionalRelperms()
const
355 return !krnumXArray_.empty() || !krnumYArray_.empty() || !krnumZArray_.empty();
358 bool hasDirectionalImbnum()
const {
359 if (imbnumXArray_.size() > 0 || imbnumYArray_.size() > 0 || imbnumZArray_.size() > 0) {
365 int imbnumRegionIdx(
unsigned elemIdx)
const
366 {
return imbnumRegionArray_[elemIdx]; }
368 template <
class Flu
idState>
369 bool updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
371 OPM_TIMEFUNCTION_LOCAL();
372 if (!enableHysteresis())
375 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
376 using Dir = FaceDir::DirEnum;
377 constexpr int ndim = 3;
378 Dir facedirs[ndim] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
379 for (
int i = 0; i<ndim; i++) {
381 changed = changed || ischanged;
387 void oilWaterHysteresisParams(Scalar& pcSwMdc,
389 unsigned elemIdx)
const;
391 void setOilWaterHysteresisParams(
const Scalar& pcSwMdc,
392 const Scalar& krnSwMdc,
395 void gasOilHysteresisParams(Scalar& pcSwMdc,
397 unsigned elemIdx)
const;
399 void setGasOilHysteresisParams(
const Scalar& pcSwMdc,
400 const Scalar& krnSwMdc,
406 {
return oilWaterScaledEpsInfoDrainage_[elemIdx]; }
408 template<
class Serializer>
415 for (
auto& mat : materialLawParams_) {
421 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
423 void readGlobalEpsOptions_(
const EclipseState& eclState);
425 void readGlobalHysteresisOptions_(
const EclipseState& state);
427 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
429 bool enableEndPointScaling_;
430 std::shared_ptr<EclHysteresisConfig> hysteresisConfig_;
431 std::vector<std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>> wagHystersisConfig_;
434 std::shared_ptr<EclEpsConfig> oilWaterEclEpsConfig_;
435 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
436 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage_;
438 std::shared_ptr<EclEpsConfig> gasWaterEclEpsConfig_;
440 GasOilScalingPointsVector gasOilUnscaledPointsVector_;
441 OilWaterScalingPointsVector oilWaterUnscaledPointsVector_;
442 GasWaterScalingPointsVector gasWaterUnscaledPointsVector_;
444 GasOilEffectiveParamVector gasOilEffectiveParamVector_;
445 OilWaterEffectiveParamVector oilWaterEffectiveParamVector_;
446 GasWaterEffectiveParamVector gasWaterEffectiveParamVector_;
448 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
450 enum EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
452 std::vector<MaterialLawParams> materialLawParams_;
453 DirectionalMaterialLawParamsPtr dirMaterialLawParams_;
455 std::vector<int> satnumRegionArray_;
456 std::vector<int> krnumXArray_;
457 std::vector<int> krnumYArray_;
458 std::vector<int> krnumZArray_;
459 std::vector<int> imbnumXArray_;
460 std::vector<int> imbnumYArray_;
461 std::vector<int> imbnumZArray_;
462 std::vector<int> imbnumRegionArray_;
463 std::vector<Scalar> stoneEtas_;
466 std::vector<Scalar> maxAllowPc_;
467 std::vector<bool> modifySwl_;
473 std::shared_ptr<EclEpsConfig> gasOilConfig_;
474 std::shared_ptr<EclEpsConfig> oilWaterConfig_;
475 std::shared_ptr<EclEpsConfig> gasWaterConfig_;