00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef OPM_POLYMERPROPERTIES_HEADER_INCLUDED
00021 #define OPM_POLYMERPROPERTIES_HEADER_INCLUDED
00022
00023 #include <opm/parser/eclipse/Deck/Deck.hpp>
00024 #include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
00025 #include <opm/parser/eclipse/EclipseState/Tables/PlyadsTable.hpp>
00026 #include <opm/parser/eclipse/EclipseState/Tables/PlymaxTable.hpp>
00027 #include <opm/parser/eclipse/EclipseState/Tables/PlyrockTable.hpp>
00028 #include <opm/parser/eclipse/EclipseState/Tables/PlyshlogTable.hpp>
00029 #include <opm/parser/eclipse/EclipseState/Tables/PlyviscTable.hpp>
00030 #include <opm/parser/eclipse/EclipseState/Tables/TableManager.hpp>
00031 #include <opm/parser/eclipse/Units/Dimension.hpp>
00032 #include <opm/parser/eclipse/Units/UnitSystem.hpp>
00033
00034
00035 #include <cmath>
00036 #include <vector>
00037 #include <opm/common/ErrorMacros.hpp>
00038
00039
00040 namespace Opm
00041 {
00042
00043 class PolymerProperties
00044 {
00045 public:
00046 PolymerProperties()
00047 {
00048 }
00049
00050 enum AdsorptionBehaviour { Desorption = 1, NoDesorption = 2 };
00051
00065 PolymerProperties(double c_max,
00066 double mix_param,
00067 double rock_density,
00068 double dead_pore_vol,
00069 double res_factor,
00070 double c_max_ads,
00071 AdsorptionBehaviour ads_index,
00072 const std::vector<double>& c_vals_visc,
00073 const std::vector<double>& visc_mult_vals,
00074 const std::vector<double>& c_vals_ads,
00075 const std::vector<double>& ads_vals,
00076 const std::vector<double>& water_vel_vals,
00077 const std::vector<double>& shear_vrf_vals
00078 )
00079 : c_max_(c_max),
00080 mix_param_(mix_param),
00081 rock_density_(rock_density),
00082 dead_pore_vol_(dead_pore_vol),
00083 res_factor_(res_factor),
00084 c_max_ads_(c_max_ads),
00085 ads_index_(ads_index),
00086 c_vals_visc_(c_vals_visc),
00087 visc_mult_vals_(visc_mult_vals),
00088 c_vals_ads_(c_vals_ads),
00089 ads_vals_(ads_vals),
00090 water_vel_vals_(water_vel_vals),
00091 shear_vrf_vals_(shear_vrf_vals)
00092 {
00093 }
00094
00095 PolymerProperties(const Opm::Deck& deck, const Opm::EclipseState& eclipseState)
00096 {
00097 readFromDeck(deck, eclipseState);
00098 }
00099
00100 void set(double c_max,
00101 double mix_param,
00102 double rock_density,
00103 double dead_pore_vol,
00104 double res_factor,
00105 double c_max_ads,
00106 AdsorptionBehaviour ads_index,
00107 const std::vector<double>& c_vals_visc,
00108 const std::vector<double>& visc_mult_vals,
00109 const std::vector<double>& c_vals_ads,
00110 const std::vector<double>& ads_vals,
00111 const std::vector<double>& water_vel_vals,
00112 const std::vector<double>& shear_vrf_vals
00113 )
00114 {
00115 c_max_ = c_max;
00116 mix_param_ = mix_param;
00117 rock_density_ = rock_density;
00118 dead_pore_vol_ = dead_pore_vol;
00119 res_factor_ = res_factor;
00120 c_max_ads_ = c_max_ads;
00121 c_vals_visc_ = c_vals_visc;
00122 visc_mult_vals_ = visc_mult_vals;
00123 c_vals_ads_ = c_vals_ads;
00124 ads_vals_ = ads_vals;
00125 ads_index_ = ads_index;
00126 water_vel_vals_ = water_vel_vals;
00127 shear_vrf_vals_ = shear_vrf_vals;
00128 }
00129
00130 void readFromDeck(const Opm::Deck& deck, const Opm::EclipseState& eclipseState)
00131 {
00132
00133 const auto& tables = eclipseState.getTableManager();
00134 const auto& plymaxTable = tables.getPlymaxTables().getTable<PlymaxTable>(0);
00135 const auto& plmixparRecord = deck.getKeyword("PLMIXPAR").getRecord(0);
00136
00137
00138 assert(plymaxTable.numRows() == 1);
00139
00140 c_max_ = plymaxTable.getPolymerConcentrationColumn()[0];
00141 mix_param_ = plmixparRecord.getItem("TODD_LONGSTAFF").getSIDouble(0);
00142
00143
00144 const auto& plyrockTable = tables.getPlyrockTables().getTable<PlyrockTable>(0);
00145
00146
00147 assert(plyrockTable.numRows() == 1);
00148
00149 dead_pore_vol_ = plyrockTable.getDeadPoreVolumeColumn()[0];
00150 res_factor_ = plyrockTable.getResidualResistanceFactorColumn()[0];
00151 rock_density_ = plyrockTable.getRockDensityFactorColumn()[0];
00152 ads_index_ = static_cast<AdsorptionBehaviour>(plyrockTable.getAdsorbtionIndexColumn()[0]);
00153 c_max_ads_ = plyrockTable.getMaxAdsorbtionColumn()[0];
00154
00155
00156 const auto& plyviscTable = tables.getPlyviscTables().getTable<PlyviscTable>(0);
00157
00158
00159 c_vals_visc_ = plyviscTable.getPolymerConcentrationColumn().vectorCopy( );
00160 visc_mult_vals_ = plyviscTable.getViscosityMultiplierColumn().vectorCopy( );
00161
00162
00163 const auto& plyadsTable = tables.getPlyadsTables().getTable<PlyadsTable>(0);
00164
00165 c_vals_ads_ = plyadsTable.getPolymerConcentrationColumn().vectorCopy( );
00166 ads_vals_ = plyadsTable.getAdsorbedPolymerColumn().vectorCopy( );
00167
00168 has_plyshlog_ = deck.hasKeyword("PLYSHLOG");
00169 has_shrate_ = deck.hasKeyword("SHRATE");
00170
00171 if (has_plyshlog_) {
00172
00173 const auto& plyshlogTable = tables.getPlyshlogTables().getTable<PlyshlogTable>(0);
00174
00175 water_vel_vals_ = plyshlogTable.getWaterVelocityColumn().vectorCopy( );
00176 shear_vrf_vals_ = plyshlogTable.getShearMultiplierColumn().vectorCopy( );
00177
00178
00179 Opm::UnitSystem unitSystem = deck.getActiveUnitSystem();
00180 double siFactor;
00181 if (has_shrate_) {
00182 siFactor = unitSystem.parse("1/Time").getSIScaling();
00183 const auto& shrateKeyword = deck.getKeyword("SHRATE");
00184 std::vector<double> shrate_readin = shrateKeyword.getSIDoubleData();
00185 if (shrate_readin.size() == 1) {
00186 shrate_ = shrate_readin[0];
00187 } else if (shrate_readin.size() == 0) {
00188 shrate_ = 4.8;
00189 } else {
00190 OPM_THROW(std::logic_error, "Only NTPVT == 1 is allowed for SHRATE keyword now !\n");
00191 }
00192 } else {
00193 siFactor = unitSystem.parse("Length/Time").getSIScaling();
00194 }
00195
00196 for (size_t i = 0; i < water_vel_vals_.size(); ++i) {
00197 water_vel_vals_[i] *= siFactor;
00198 }
00199
00200
00201 plyshlog_ref_conc_ = plyshlogTable.getRefPolymerConcentration();
00202
00203 if (plyshlogTable.hasRefSalinity()) {
00204 has_plyshlog_ref_salinity_ = true;
00205 plyshlog_ref_salinity_ = plyshlogTable.getRefSalinity();
00206 } else {
00207 has_plyshlog_ref_salinity_ = false;
00208 }
00209
00210 if (plyshlogTable.hasRefTemperature()) {
00211 has_plyshlog_ref_temp_ = true;
00212 plyshlog_ref_temp_ = plyshlogTable.getRefTemperature();
00213 } else {
00214 has_plyshlog_ref_temp_ = false;
00215 }
00216 }
00217 }
00218
00219 double cMax() const;
00220
00221 double mixParam() const;
00222
00223 double rockDensity() const;
00224
00225 double deadPoreVol() const;
00226
00227 double resFactor() const;
00228
00229 double cMaxAds() const;
00230
00231 int adsIndex() const;
00232
00234 bool hasPlyshlog() const;
00235
00237 const std::vector<double>& shearWaterVelocity() const;
00238
00240 const std::vector<double>& shearViscosityReductionFactor() const;
00241
00243 double plyshlogRefConc() const;
00244
00246 bool hasPlyshlogRefSalinity() const;
00247
00249 bool hasPlyshlogRefTemp() const;
00250
00252 double plyshlogRefSalinity() const;
00253
00255 double plyshlogRefTemp() const;
00256
00258 bool hasShrate() const;
00259
00261 double shrate() const;
00262
00263 double shearVrf(const double velocity) const;
00264
00265 double shearVrfWithDer(const double velocity, double& der) const;
00266
00267 double viscMult(double c) const;
00268
00269 double viscMultWithDer(double c, double* der) const;
00270
00271 void simpleAdsorption(double c, double& c_ads) const;
00272
00273 void simpleAdsorptionWithDer(double c, double& c_ads,
00274 double& dc_ads_dc) const;
00275
00276 void adsorption(double c, double cmax, double& c_ads) const;
00277
00278 void adsorptionWithDer(double c, double cmax,
00279 double& c_ads, double& dc_ads_dc) const;
00280
00281 void effectiveVisc(const double c, const double mu_w,
00282 double& mu_w_eff) const;
00283
00284 void effectiveViscWithDer(const double c, const double visc
00285 , double& mu_w_eff
00286 , double dmu_w_eff_dc) const;
00287
00288 void effectiveInvVisc(const double c, const double mu_w,
00289 double& inv_mu_w_eff) const;
00290
00291 void effectiveInvViscWithDer(const double c,
00292 const double mu_w,
00293 double& inv_mu_w_eff,
00294 double& dinv_mu_w_eff_dc) const;
00295
00296 void effectiveInvPolyVisc(const double c,
00297 const double mu_w,
00298 double& inv_mu_p_eff) const;
00299
00300 void effectiveInvPolyViscWithDer(const double c,
00301 const double mu_w,
00302 double& inv_mu_p_eff,
00303 double& d_inv_mu_p_eff_dc) const;
00304
00305 void effectiveRelperm(const double c,
00306 const double cmax,
00307 const double* relperm,
00308 double& eff_relperm_wat) const;
00309
00310 void effectiveRelpermWithDer (const double c,
00311 const double cmax,
00312 const double* relperm,
00313 const double* drelperm_ds,
00314 double& eff_relperm_wat,
00315 double& deff_relperm_wat_ds,
00316 double& deff_relperm_wat_dc) const;
00317
00318 void effectiveMobilities(const double c,
00319 const double cmax,
00320 const double* visc,
00321 const double* relperm,
00322 double* mob) const;
00323
00324 void effectiveMobilitiesWithDer(const double c,
00325 const double cmax,
00326 const double* visc,
00327 const double* relperm,
00328 const double* drelpermds,
00329 double* mob,
00330 double* dmob_ds,
00331 double& dmobwatdc) const;
00332
00333 void effectiveMobilitiesBoth(const double c,
00334 const double cmax,
00335 const double* visc,
00336 const double* relperm,
00337 const double* drelperm_ds,
00338 double* mob,
00339 double* dmob_ds,
00340 double& dmobwat_dc,
00341 bool if_with_der) const;
00342
00343 void effectiveTotalMobility(const double c,
00344 const double cmax,
00345 const double* visc,
00346 const double* relperm,
00347 double& totmob) const;
00348
00349 void effectiveTotalMobilityWithDer(const double c,
00350 const double cmax,
00351 const double* visc,
00352 const double* relperm,
00353 const double* drelpermds,
00354 double& totmob,
00355 double* dtotmob_dsdc) const;
00356
00357 void effectiveTotalMobilityBoth(const double c,
00358 const double cmax,
00359 const double* visc,
00360 const double* relperm,
00361 const double* drelperm_ds,
00362 double& totmob,
00363 double* dtotmob_dsdc,
00364 bool if_with_der) const;
00365
00366 void computeMc(const double& c, double& mc) const;
00367
00368 void computeMcWithDer(const double& c, double& mc,
00369 double& dmc_dc) const;
00370
00371 void computeMcBoth(const double& c, double& mc,
00372 double& dmc_dc, bool if_with_der) const;
00373
00375 bool computeShearMultLog(std::vector<double>& water_vel, std::vector<double>& visc_mult, std::vector<double>& shear_mult) const;
00376
00377 private:
00378 double c_max_;
00379 double mix_param_;
00380 double rock_density_;
00381 double dead_pore_vol_;
00382 double res_factor_;
00383 double c_max_ads_;
00384
00385 bool has_plyshlog_;
00386 bool has_shrate_;
00387
00388
00389
00390 double shrate_;
00391 AdsorptionBehaviour ads_index_;
00392 std::vector<double> c_vals_visc_;
00393 std::vector<double> visc_mult_vals_;
00394 std::vector<double> c_vals_ads_;
00395 std::vector<double> ads_vals_;
00396 std::vector<double> water_vel_vals_;
00397 std::vector<double> shear_vrf_vals_;
00398
00399 double plyshlog_ref_conc_;
00400 double plyshlog_ref_salinity_;
00401 double plyshlog_ref_temp_;
00402 bool has_plyshlog_ref_salinity_;
00403 bool has_plyshlog_ref_temp_;
00404
00405
00406 void simpleAdsorptionBoth(double c, double& c_ads,
00407 double& dc_ads_dc, bool if_with_der) const;
00408 void adsorptionBoth(double c, double cmax,
00409 double& c_ads, double& dc_ads_dc,
00410 bool if_with_der) const;
00411
00412 void effectiveInvViscBoth(const double c, const double mu_w,
00413 double& inv_mu_w_eff,
00414 double& dinv_mu_w_eff_dc, bool if_with_der) const;
00415
00416 void effectiveInvPolyViscBoth(const double c,
00417 const double mu_w,
00418 double& inv_mu_p_eff,
00419 double& dinv_mu_p_eff_dc,
00420 const bool if_with_der) const;
00421
00422 void effectiveRelpermBoth(const double c,
00423 const double cmax,
00424 const double* relperm,
00425 const double* drelperm_ds,
00426 double& eff_relperm_wat,
00427 double& deff_relperm_wat_ds,
00428 double& deff_relperm_wat_dc,
00429 bool if_with_der) const;
00430
00431 };
00432
00433 }
00434
00435 #endif // OPM_POLYMERPROPERTIES_HEADER_INCLUDED