00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #ifndef OPM_ECL_HYSTERESIS_TWO_PHASE_LAW_PARAMS_HPP
00028 #define OPM_ECL_HYSTERESIS_TWO_PHASE_LAW_PARAMS_HPP
00029
00030 #include "EclHysteresisConfig.hpp"
00031 #include "EclEpsScalingPoints.hpp"
00032
00033 #if HAVE_OPM_PARSER
00034 #include <opm/parser/eclipse/Deck/Deck.hpp>
00035 #include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
00036 #endif
00037
00038 #include <string>
00039 #include <memory>
00040 #include <cassert>
00041 #include <algorithm>
00042
00043 #include <opm/material/common/EnsureFinalized.hpp>
00044
00045 namespace Opm {
00052 template <class EffLawT>
00053 class EclHysteresisTwoPhaseLawParams : public EnsureFinalized
00054 {
00055 typedef typename EffLawT::Params EffLawParams;
00056 typedef typename EffLawParams::Traits::Scalar Scalar;
00057
00058 public:
00059 typedef typename EffLawParams::Traits Traits;
00060
00061 EclHysteresisTwoPhaseLawParams()
00062 {
00063
00064
00065
00066 pcSwMdc_ = 2.0;
00067 krnSwMdc_ = 2.0;
00068
00069
00070 deltaSwImbKrn_ = 0.0;
00071
00072 }
00073
00078 void finalize()
00079 {
00080 if (config().enableHysteresis()) {
00081
00082
00083 updateDynamicParams_();
00084 }
00085
00086 EnsureFinalized :: finalize();
00087 }
00088
00092 void setConfig(std::shared_ptr<EclHysteresisConfig> value)
00093 { config_ = value; }
00094
00098 const EclHysteresisConfig& config() const
00099 { return *config_; }
00100
00104 void setDrainageParams(std::shared_ptr<EffLawParams> value,
00105 const EclEpsScalingPointsInfo<Scalar>& ,
00106 EclTwoPhaseSystemType )
00107
00108 {
00109 drainageParams_ = *value;
00110 }
00111
00115 const EffLawParams& drainageParams() const
00116 { return drainageParams_; }
00117
00118 EffLawParams& drainageParams()
00119 { return drainageParams_; }
00120
00124 void setImbibitionParams(std::shared_ptr<EffLawParams> value,
00125 const EclEpsScalingPointsInfo<Scalar>& ,
00126 EclTwoPhaseSystemType )
00127 {
00128 imbibitionParams_ = *value;
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 }
00140
00144 const EffLawParams& imbibitionParams() const
00145 { return imbibitionParams_; }
00146
00147 EffLawParams& imbibitionParams()
00148 { return imbibitionParams_; }
00149
00154 void setPcSwMdc(Scalar value)
00155 { pcSwMdc_ = value; }
00156
00161 Scalar pcSwMdc() const
00162 { return pcSwMdc_; }
00163
00169 void setKrwSwMdc(Scalar )
00170 {}
00171
00172
00178 Scalar krwSwMdc() const
00179 { return 2.0; }
00180
00181
00187 void setKrnSwMdc(Scalar value)
00188 { krnSwMdc_ = value; }
00189
00195 Scalar krnSwMdc() const
00196 { return krnSwMdc_; }
00197
00205 void setDeltaSwImbKrw(Scalar )
00206 {}
00207
00208
00216 Scalar deltaSwImbKrw() const
00217 { return 0.0; }
00218
00219
00227 void setDeltaSwImbKrn(Scalar value)
00228 { deltaSwImbKrn_ = value; }
00229
00237 Scalar deltaSwImbKrn() const
00238 { return deltaSwImbKrn_; }
00239
00246 void update(Scalar pcSw, Scalar , Scalar krnSw)
00247 {
00248 bool updateParams = false;
00249 if (pcSw < pcSwMdc_) {
00250 pcSwMdc_ = pcSw;
00251 updateParams = true;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267 if (krnSw < krnSwMdc_) {
00268 krnSwMdc_ = krnSw;
00269 updateParams = true;
00270 }
00271
00272 if (updateParams)
00273 updateDynamicParams_();
00274 }
00275
00276 private:
00277 void updateDynamicParams_()
00278 {
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 Scalar krnMdcDrainage = EffLawT::twoPhaseSatKrn(drainageParams(), krnSwMdc_);
00289 Scalar SwKrnMdcImbibition = EffLawT::twoPhaseSatKrnInv(imbibitionParams(), krnMdcDrainage);
00290 deltaSwImbKrn_ = SwKrnMdcImbibition - krnSwMdc_;
00291
00292
00293
00294
00295
00296
00297
00298 assert(std::abs(EffLawT::twoPhaseSatKrn(imbibitionParams(), krnSwMdc_ + deltaSwImbKrn_)
00299 - EffLawT::twoPhaseSatKrn(drainageParams(), krnSwMdc_)) < 1e-8);
00300
00301
00302
00303 #if 0
00304 Scalar Snhy = 1.0 - SwMdc_;
00305
00306 Sncrt_ = Sncrd_ + (Snhy - Sncrd_)/(1 + C_*(Snhy - Sncrd_));
00307 #endif
00308 }
00309
00310 std::shared_ptr<EclHysteresisConfig> config_;
00311 EffLawParams imbibitionParams_;
00312 EffLawParams drainageParams_;
00313
00314
00315
00316
00317
00318 Scalar krnSwMdc_;
00319 Scalar pcSwMdc_;
00320
00321
00322
00323
00324
00325 Scalar deltaSwImbKrn_;
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 };
00344
00345 }
00346
00347 #endif