00001
00010 #ifndef BS_WELLS_WELL_RATE_PROD_MOBILITY_H_
00011 #define BS_WELLS_WELL_RATE_PROD_MOBILITY_H_
00012
00013 #include "calc_model.h"
00014 #include "calc_model_data_accessors.h"
00015 #include "well_rate_compute_params.h"
00016
00017 namespace blue_sky
00018 {
00019 namespace wells
00020 {
00021
00022 template <typename strategy_type>
00023 struct mobility_calc_prod
00024 {
00025 public:
00026 typedef strategy_type strategy_t;
00027 typedef typename strategy_t::item_t item_t;
00028 typedef typename strategy_t::index_t index_t;
00029 typedef typename strategy_t::item_array_t item_array_t;
00030
00031 typedef calc_model <strategy_t> calc_model_t;
00032 typedef typename calc_model_t::data_t data_t;
00033 typedef jacobian_matrix <strategy_t> jmatrix_t;
00034 typedef well <strategy_t> well_t;
00035 typedef well_controller <strategy_t> well_controller_t;
00036 typedef compute_params <strategy_t> params_t;
00037
00038 typedef typename calc_model_t::data_array_t data_array_t;
00039 typedef typename calc_model_t::phase_d_t phase_d_t;
00040 typedef typename calc_model_t::main_var_array_t main_var_array_t;
00041
00042 typedef typename wells::type_helper <strategy_t> type_helper_t;
00043 typedef typename type_helper_t::item_rhs_block_t item_rhs_block_t;
00044
00045 typedef smart_ptr <calc_model_t, true> sp_calc_model_t;
00046 typedef smart_ptr <jmatrix_t, true> sp_jmatrix_t;
00047 typedef smart_ptr <well_t, true> sp_well_t;
00048 typedef smart_ptr <well_controller_t, true> sp_well_controller_t;
00049
00050 enum { mult = -1, };
00051 enum { is_inj = 0, };
00052
00053 public:
00054
00055 BS_FORCE_INLINE item_t
00056 get_mult () const
00057 {
00058 return item_t (mult);
00059 }
00060
00061 static BS_FORCE_INLINE bool
00062 is_oil_injection (const params_t ¶ms)
00063 {
00064 return true;
00065 }
00066 static BS_FORCE_INLINE bool
00067 is_water_injection (const params_t ¶ms)
00068 {
00069 return true;
00070 }
00071 static BS_FORCE_INLINE bool
00072 is_gas_injection (const params_t ¶ms)
00073 {
00074 return true;
00075 }
00076 static BS_FORCE_INLINE bool
00077 is_o_ctrl (const params_t ¶ms)
00078 {
00079 return params.prod_params_.is_o_ctrl;
00080 }
00081 static BS_FORCE_INLINE bool
00082 is_w_ctrl (const params_t ¶ms)
00083 {
00084 return params.prod_params_.is_w_ctrl;
00085 }
00086 static BS_FORCE_INLINE bool
00087 is_g_ctrl (const params_t ¶ms)
00088 {
00089 return params.prod_params_.is_g_ctrl;
00090 }
00091
00092 BS_FORCE_INLINE item_t
00093 get_oil_mobility (const data_t &data, const params_t ¶ms) const
00094 {
00095 return MOBILITY (data, params.phase_d, FI_PHASE_OIL);
00096 }
00097 BS_FORCE_INLINE item_t
00098 get_water_mobility (const data_t &data, const params_t ¶ms) const
00099 {
00100 return MOBILITY (data, params.phase_d, FI_PHASE_WATER);
00101 }
00102 BS_FORCE_INLINE item_t
00103 get_gas_mobility (const data_t &data, const params_t ¶ms) const
00104 {
00105 return MOBILITY (data, params.phase_d, FI_PHASE_GAS);
00106 }
00107
00108 BS_FORCE_INLINE item_t
00109 get_mo_po_deriv (const data_t &data, const params_t ¶ms) const
00110 {
00111 return P_DERIV_MOBILITY_O;
00112
00113
00114
00115
00116
00117 }
00118
00119 BS_FORCE_INLINE item_t
00120 get_mo_sw_deriv (const data_t &data, const params_t ¶ms) const
00121 {
00122 return S_DERIV_MOBILITY_OW;
00123
00124
00125
00126
00127
00128 }
00129
00130 BS_FORCE_INLINE item_t
00131 get_mo_so_deriv (const data_t &data, const params_t ¶ms) const
00132 {
00133 return S_DERIV_MOBILITY_OO;
00134 }
00135
00136 BS_FORCE_INLINE item_t
00137 get_mo_sg_deriv (const data_t &data, const params_t ¶ms) const
00138 {
00139
00140
00141 if (params.main_var == FI_SG_VAR)
00142 {
00143 return get_mo_sg_deriv_sg_var (data, params);
00144 }
00145 else
00146 {
00147 return get_mo_sg_deriv_ro_var (data, params);
00148 }
00149 }
00150
00151 BS_FORCE_INLINE item_t
00152 get_mo_sg_deriv_sg_var (const data_t &data, const params_t ¶ms) const
00153 {
00154 return S_DERIV_MOBILITY_OG;
00155
00156 item_t dkro_dsg = S_DERIV_RELATIVE_PERM (data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_GAS);
00157 item_t epso = INVERS_VISC_FVF (data, params.phase_d, FI_PHASE_OIL);
00158
00159 return dkro_dsg * epso;
00160 }
00161 BS_FORCE_INLINE item_t
00162 get_mo_sg_deriv_ro_var (const data_t &data, const params_t ¶ms) const
00163 {
00164 item_t kro = RELATIVE_PERM (data, params.phase_d, FI_PHASE_OIL);
00165 item_t depso_dro = GOR_DERIV_INVERS_VISC_FVF (data);
00166
00167 return kro * depso_dro;
00168 }
00169
00170 BS_FORCE_INLINE item_t
00171 get_mw_po_deriv (const data_t &data, const params_t ¶ms) const
00172 {
00173 return P_DERIV_MOBILITY_W;
00174
00175
00176
00177
00178
00179 }
00180 BS_FORCE_INLINE item_t
00181 get_mw_sw_deriv (const data_t &data, const params_t ¶ms) const
00182 {
00183 return S_DERIV_MOBILITY_WW;
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 }
00196 BS_FORCE_INLINE item_t
00197 get_mw_so_deriv (const data_t &data, const params_t ¶ms) const
00198 {
00199 return S_DERIV_MOBILITY_WO;
00200 }
00201 BS_FORCE_INLINE item_t
00202 get_mw_sg_deriv (const data_t &data, const params_t ¶ms) const
00203 {
00204 return S_DERIV_MOBILITY_WG;
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 BS_FORCE_INLINE item_t
00222 get_gas_sw_deriv (const data_t &data, const params_t ¶ms) const
00223 {
00224 return S_DERIV_MOBILITY_GW * params.Pg + S_DERIV_MOBILITY_OW * GAS_OIL_RATIO (data) * params.Po;
00225 }
00226
00227 BS_FORCE_INLINE item_t
00228 get_gas_so_deriv (const data_t &data, const params_t ¶ms) const
00229 {
00230 return S_DERIV_MOBILITY_GO * params.Pg + S_DERIV_MOBILITY_OO * GAS_OIL_RATIO (data) * params.Po;
00231 }
00232
00233 BS_FORCE_INLINE item_t
00234 get_gas_po_deriv (const data_t &data, const params_t ¶ms) const
00235 {
00236 item_t gw = params.gw;
00237 item_t mo = MOBILITY (data, params.phase_d, FI_PHASE_OIL);
00238 item_t Po = params.Po;
00239 item_t dmo_dpo = P_DERIV_MOBILITY_O;
00240 item_t Rso = GAS_OIL_RATIO (data);
00241 item_t ro_deriv = Rso * (dmo_dpo * Po - mo);
00242
00243 item_t po_deriv = 0;
00244 if (params.main_var == FI_SG_VAR)
00245 {
00246 item_t dmg_dpo = P_DERIV_MOBILITY_G;
00247 item_t Pg = params.Pg;
00248 item_t mg = MOBILITY (data, params.phase_d, FI_PHASE_GAS);
00249 item_t dRso_dpo = P_DERIV_GAS_OIL_RATIO (data);
00250
00251 po_deriv = -gw * (dmg_dpo * Pg - mg + dRso_dpo * mo * Po + ro_deriv);
00252 }
00253 else
00254 {
00255 po_deriv = -gw * ro_deriv;
00256 }
00257 return po_deriv;
00258 }
00259 BS_FORCE_INLINE item_t
00260 get_gas_sg_deriv (const data_t &data, const params_t ¶ms) const
00261 {
00262 if (params.main_var == FI_SG_VAR)
00263 {
00264 item_t gw = params.gw;
00265 item_t Pg = params.Pg;
00266 item_t Po = params.Po;
00267
00268
00269
00270
00271
00272
00273
00274 item_t dpcgo_dsg = S_DERIV_CAP_PRESSURE_G;
00275 item_t Rso = GAS_OIL_RATIO (data);
00276 item_t mg = MOBILITY_G;
00277 item_t dmg_dsg = S_DERIV_MOBILITY_GG;
00278 item_t dmo_dsg = S_DERIV_MOBILITY_OG;
00279
00280 return -gw * (dmg_dsg * Pg - mg * dpcgo_dsg + Rso * dmo_dsg * Po);
00281 }
00282 else
00283 {
00284 item_t gw = params.gw;
00285 item_t Po = params.Po;
00286 item_t Ro = GAS_OIL_RATIO (data);
00287 item_t mo = MOBILITY_O;
00288 item_t dmo_dsg = S_DERIV_MOBILITY_OG;
00289
00290 item_t ro_deriv = -gw * (mo + Ro * dmo_dsg) * Po;
00291 return ro_deriv;
00292 }
00293 }
00294 BS_FORCE_INLINE item_t
00295 get_gas_pref_deriv (const data_t &data, const params_t ¶ms) const
00296 {
00297 if (params.main_var == FI_SG_VAR)
00298 {
00299 item_t gw = params.gw;
00300 item_t mg = MOBILITY (data, params.phase_d, FI_PHASE_GAS);
00301 item_t mo = MOBILITY (data, params.phase_d, FI_PHASE_OIL);
00302 item_t Rso = GAS_OIL_RATIO (data);
00303
00304 item_t pref_deriv = -gw * (mg + Rso * mo);
00305 return pref_deriv;
00306 }
00307 else
00308 {
00309 item_t gw = params.gw;
00310 item_t Ro = GAS_OIL_RATIO (data);
00311 item_t mo = MOBILITY (data, params.phase_d, FI_PHASE_OIL);
00312
00313 item_t pref_deriv = -gw * Ro * mo;
00314 return pref_deriv;
00315 }
00316 }
00317 BS_FORCE_INLINE item_t
00318 get_gas_rate (const data_t &data, const params_t ¶ms) const
00319 {
00320 const item_t &gw = params.gw;
00321 const item_t &Pg = params.Pg;
00322 const item_t &Po = params.Po;
00323 const item_t &mg = MOBILITY (data, params.phase_d, FI_PHASE_GAS);
00324 const item_t &mo = MOBILITY (data, params.phase_d, FI_PHASE_OIL);
00325 const item_t &Rso = GAS_OIL_RATIO (data);
00326
00327 #ifdef _DEBUG
00328 BOSOUT (section::wells, level::debug) << boost::format ("[%s : %d] qg (%.20e) gw: %.20e mg: %.20e pg: %.20e gor: %.20e") % params.well_->name ().c_str () % params.n_block % (gw * (mg * Pg + Rso * mo * Po)) % gw % mg % Pg % Rso << bs_end;
00329 #endif
00330
00331 return gw * (mg * Pg + Rso * mo * Po);
00332 }
00333
00334 BS_FORCE_INLINE item_t
00335 get_free_gas_rate (const data_t &data, const params_t ¶ms) const
00336 {
00337 const item_t &gw = params.gw;
00338 const item_t &Pg = params.Pg;
00339 const item_t &mg = MOBILITY (data, params.phase_d, FI_PHASE_GAS);
00340
00341 return gw * mg * Pg;
00342 }
00343
00344 BS_FORCE_INLINE item_t
00345 get_solution_gas_rate (const data_t &data, const params_t ¶ms) const
00346 {
00347 const item_t &gw = params.gw;
00348 const item_t &Po = params.Po;
00349 const item_t &mo = MOBILITY (data, params.phase_d, FI_PHASE_OIL);
00350 const item_t &Rso = GAS_OIL_RATIO (data);
00351
00352 return gw * Rso * mo * Po;
00353 }
00354 };
00355
00356 }
00357 }
00358
00359 #endif // #ifndef BS_WELLS_WELL_RATE_PROD_MOBILITY_H_
00360