00001
00010 #ifndef BS_WELLS_WELL_RATE_INJ_MOBILITY_H_
00011 #define BS_WELLS_WELL_RATE_INJ_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_inj
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 = 1, };
00052
00053 public:
00054
00055 BS_FORCE_INLINE item_t
00056 get_mult () const
00057 {
00058 return 1.0;
00059 }
00060
00061 static BS_FORCE_INLINE bool
00062 is_oil_injection (const params_t ¶ms)
00063 {
00064 return params.inj_params_.is_oil_injection;
00065 }
00066 static BS_FORCE_INLINE bool
00067 is_water_injection (const params_t ¶ms)
00068 {
00069 return params.inj_params_.is_water_injection;
00070 }
00071 static BS_FORCE_INLINE bool
00072 is_gas_injection (const params_t ¶ms)
00073 {
00074 return params.inj_params_.is_gas_injection;
00075 }
00076 static BS_FORCE_INLINE bool
00077 is_o_ctrl (const params_t ¶ms)
00078 {
00079 return params.inj_params_.is_o_ctrl;
00080 }
00081 static BS_FORCE_INLINE bool
00082 is_w_ctrl (const params_t ¶ms)
00083 {
00084 return params.inj_params_.is_w_ctrl;
00085 }
00086 static BS_FORCE_INLINE bool
00087 is_g_ctrl (const params_t ¶ms)
00088 {
00089 return params.inj_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 const item_t &krp_tetap = params.inj_params_.krp_tetap;
00096 const item_t &bo = INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00097 item_t mo = params.main_var == FI_SG_VAR ? bo * krp_tetap : bo * params.inj_params_.krow_tetaow;
00098 return mo;
00099 }
00100 BS_FORCE_INLINE item_t
00101 get_water_mobility (const data_t &data, const params_t ¶ms) const
00102 {
00103 item_t krp_tetap = params.inj_params_.krp_tetap;
00104 item_t bw = INVERS_FVF (data, params.phase_d, FI_PHASE_WATER);
00105 item_t mw = params.main_var == FI_SG_VAR ? bw * krp_tetap : bw * params.inj_params_.krow_tetaow;
00106 return mw;
00107 }
00108 BS_FORCE_INLINE item_t
00109 get_gas_mobility (const data_t &data, const params_t ¶ms) const
00110 {
00111 const item_t &krp_tetap = params.inj_params_.krp_tetap;
00112
00113 const item_t &bg = INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00114 item_t mg = params.main_var == FI_SG_VAR ? bg * krp_tetap : bg * params.inj_params_.krow_tetaow;
00115 return mg;
00116 }
00117
00118 BS_FORCE_INLINE item_t
00119 get_mo_po_deriv (const data_t &data, const params_t ¶ms) const
00120 {
00121 const item_t &dbo_dpo = P_DERIV_INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00122 const item_t &krp_tetap = params.inj_params_.krp_tetap;
00123 const item_t &krp_dtetap_dpp = params.inj_params_.krp_dtetap_dpp;
00124 const item_t &bo = INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00125
00126 return dbo_dpo * krp_tetap + bo * krp_dtetap_dpp;
00127 }
00128
00129 BS_FORCE_INLINE item_t
00130 get_mo_sw_deriv (const data_t &data, const params_t ¶ms) const
00131 {
00132 const item_t &bo = INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00133 const item_t &x = params.inj_params_.dkrow_dsw_tetaow_krw_dtetaw_dsw;
00134
00135 return bo * x;
00136 }
00137
00138 BS_FORCE_INLINE item_t
00139 get_mo_so_deriv (const data_t &data, const params_t ¶ms) const
00140 {
00141 const item_t &dbo_dso = 0;
00142 const item_t &krp_tetap = params.inj_params_.krp_tetap;
00143 const item_t &bo = INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00144 const item_t &dkro_dso = S_DERIV_RELATIVE_PERM (data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_OIL);
00145
00146 return dbo_dso * krp_tetap + bo * dkro_dso;
00147 }
00148
00149 BS_FORCE_INLINE item_t
00150 get_mo_sg_deriv (const data_t &data, const params_t ¶ms) const
00151 {
00152 if (params.main_var == FI_SG_VAR)
00153 {
00154 return get_mo_sg_deriv_sg_var (data, params);
00155 }
00156 else
00157 {
00158 return get_mo_sg_deriv_ro_var (data, params);
00159 }
00160 }
00161
00162 BS_FORCE_INLINE item_t
00163 get_mo_sg_deriv_sg_var (const data_t &data, const params_t ¶ms) const
00164 {
00165 item_t bo = INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00166 item_t x = params.inj_params_.dkrog_dsg_tetaog_krg_dtetag_dsg;
00167
00168 return bo * x;
00169 }
00170 BS_FORCE_INLINE item_t
00171 get_mo_sg_deriv_ro_var (const data_t &data, const params_t ¶ms) const
00172 {
00173 item_t kro = RELATIVE_PERM (data, params.phase_d, FI_PHASE_OIL);
00174 item_t bo = INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00175 item_t dtetao_dro = GOR_DERIV_INVERS_VISCOSITY (data);
00176 item_t tetao = INVERS_VISCOSITY (data, params.phase_d, FI_PHASE_OIL);
00177 item_t dbo_dro = GOR_DERIV_INVERS_FVF (data);
00178
00179 return kro * (bo * dtetao_dro + tetao * dbo_dro);
00180 }
00181
00182 BS_FORCE_INLINE item_t
00183 get_mw_po_deriv (const data_t &data, const params_t ¶ms) const
00184 {
00185 return (RELATIVE_PERM_O * P_DERIV_INVERS_VISCOSITY_O +
00186 RELATIVE_PERM_W * P_DERIV_INVERS_VISCOSITY_W) -
00187 (INVERS_FVF_W * params.inj_params_.krp_tetap * P_DERIV_INVERS_FVF_W);
00188
00189
00190
00191
00192
00193
00194
00195 }
00196 BS_FORCE_INLINE item_t
00197 get_mw_sw_deriv (const data_t &data, const params_t ¶ms) const
00198 {
00199 return (S_DERIV_RELATIVE_PERM_WW * INVERS_VISCOSITY_W +
00200 S_DERIV_RELATIVE_PERM_OW * INVERS_VISCOSITY_O +
00201 RELATIVE_PERM_W * S_DERIV_INVERS_VISCOSITY_W) -
00202 (INVERS_FVF_W * params.inj_params_.krp_tetap * P_DERIV_INVERS_FVF_W);
00203
00204
00205
00206
00207
00208
00209
00210 }
00211 BS_FORCE_INLINE item_t
00212 get_mw_so_deriv (const data_t &data, const params_t ¶ms) const
00213 {
00214 return S_DERIV_RELATIVE_PERM_OO * INVERS_VISCOSITY_O;
00215
00216
00217
00218
00219 }
00220 BS_FORCE_INLINE item_t
00221 get_mw_sg_deriv (const data_t &data, const params_t ¶ms) const
00222 {
00223 const item_t &bw = INVERS_FVF (data, params.phase_d, FI_PHASE_WATER);
00224
00225 if (params.main_var == FI_SG_VAR)
00226 {
00227 item_t x = params.inj_params_.dkrog_dsg_tetaog_krg_dtetag_dsg;
00228 return bw * x;
00229 }
00230 else
00231 {
00232 item_t kro = RELATIVE_PERM (data, params.phase_d, FI_PHASE_OIL);
00233 item_t dtetao_dro = GOR_DERIV_INVERS_VISCOSITY (data);
00234
00235 return bw * kro * dtetao_dro;
00236 }
00237 }
00238
00239 BS_FORCE_INLINE item_t
00240 get_mg_po_deriv (const data_t &data, const params_t ¶ms) const
00241 {
00242 const item_t &dbg_dpg = P_DERIV_INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00243 const item_t &krp_tetap = params.krp_tetap;
00244 const item_t &krp_dtetap_dpp = params.krp_dtetap_dpp;
00245 const item_t &bg = INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00246
00247 return dbg_dpg * krp_tetap + bg * krp_dtetap_dpp;
00248 }
00249 BS_FORCE_INLINE item_t
00250 get_gor_po_deriv (const data_t &data, const params_t ¶ms) const
00251 {
00252 return 0;
00253 }
00254 BS_FORCE_INLINE item_t
00255 get_gor (const data_t &data, const params_t ¶ms) const
00256 {
00257 return 0;
00258 }
00259
00260 BS_FORCE_INLINE item_t
00261 get_mg_sw_deriv (const data_t &data, const params_t ¶ms) const
00262 {
00263 const item_t &bg = INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00264 const item_t &x = params.inj_params_.dkrow_dsw_tetaow_krw_dtetaw_dsw;
00265
00266 return bg * x;
00267 }
00268 BS_FORCE_INLINE item_t
00269 get_mg_so_deriv (const data_t &data, const params_t ¶ms) const
00270 {
00271 const item_t &bo = INVERS_FVF (data, params.phase_d, FI_PHASE_OIL);
00272 const item_t &dkrg_dso = S_DERIV_RELATIVE_PERM (data, params.phase_d, params.n_phases, FI_PHASE_GAS, FI_PHASE_OIL);
00273
00274 return bo * dkrg_dso;
00275 }
00276 BS_FORCE_INLINE item_t
00277 get_gas_sw_deriv (const data_t &data, const params_t ¶ms) const
00278 {
00279 return get_mg_sw_deriv (data, params) * params.Pg;
00280 }
00281 BS_FORCE_INLINE item_t
00282 get_gas_so_deriv (const data_t &data, const params_t ¶ms) const
00283 {
00284 return get_mg_so_deriv (data, params) * params.Pg;
00285 }
00286 BS_FORCE_INLINE item_t
00287 get_gas_po_deriv (const data_t &data, const params_t ¶ms) const
00288 {
00289 item_t dbg_dpg = P_DERIV_INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00290 item_t krp_tetap = params.inj_params_.krp_tetap;
00291 item_t krp_dtetap_dpp = params.inj_params_.krp_dtetap_dpp;
00292 item_t bg = INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00293 item_t mg = params.main_var == FI_SG_VAR ? bg * krp_tetap : bg * params.inj_params_.krow_tetaow;
00294 item_t Pg = params.Pg;
00295 item_t gw = params.gw;
00296
00297 item_t po_deriv = -gw * ((dbg_dpg * krp_tetap + bg * krp_dtetap_dpp) * Pg - mg);
00298 return po_deriv;
00299 }
00300 BS_FORCE_INLINE item_t
00301 get_gas_sg_deriv (const data_t &data, const params_t ¶ms) const
00302 {
00303 item_t gw = params.gw;
00304 item_t bg = INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00305 item_t Pg = params.Pg;
00306
00307 if (params.main_var == FI_SG_VAR)
00308 {
00309 item_t dbg_dsg = S_DERIV_INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00310 item_t krp_tetap = params.inj_params_.krp_tetap;
00311 item_t x = params.inj_params_.dkrog_dsg_tetaog_krg_dtetag_dsg;
00312 item_t mg = bg * krp_tetap;
00313 item_t dpcgo_dsg = S_DERIV_CAP_PRESSURE (data, params.phase_d, FI_PHASE_GAS);
00314
00315 item_t sg_deriv = -gw * ((dbg_dsg * krp_tetap + bg * x) * Pg - mg * dpcgo_dsg);
00316 return sg_deriv;
00317 }
00318 else
00319 {
00320 item_t kro = RELATIVE_PERM (data, params.phase_d, FI_PHASE_OIL);
00321 item_t dtetao_dro = GOR_DERIV_INVERS_VISCOSITY (data);
00322
00323 item_t ro_deriv = -gw * bg * kro * dtetao_dro * Pg;
00324 return ro_deriv;
00325 }
00326 }
00327 BS_FORCE_INLINE item_t
00328 get_gas_pref_deriv (const data_t &data, const params_t ¶ms) const
00329 {
00330 const item_t &gw = params.gw;
00331 const item_t &mg = get_gas_mobility (data, params);
00332
00333 item_t pref_deriv = -gw * mg;
00334 return pref_deriv;
00335 }
00336 BS_FORCE_INLINE item_t
00337 get_gas_rate (const data_t &data, const params_t ¶ms) const
00338 {
00339 const item_t &Pg = params.Pg;
00340 const item_t &gw = params.gw;
00341 const item_t &mg = get_gas_mobility (data, params);
00342
00343
00344 #ifdef _DEBUG
00345
00346 #endif
00347
00348 item_t rate = gw * mg * Pg;
00349 return rate;
00350 }
00351
00352 BS_FORCE_INLINE item_t
00353 get_free_gas_rate (const data_t &data, const params_t ¶ms) const
00354 {
00355 const item_t &Pg = params.Pg;
00356 const item_t &gw = params.gw;
00357 const item_t &mg = get_gas_mobility (data, params);
00358
00359 item_t rate = gw * mg * Pg;
00360 return rate;
00361 }
00362
00363 BS_FORCE_INLINE item_t
00364 get_solution_gas_rate (const data_t &data, const params_t ¶ms) const
00365 {
00366 return 0.0;
00367 }
00368 };
00369
00370
00371 }
00372 }
00373
00374 #endif // #ifndef BS_WELLS_WELL_RATE_INJ_MOBILITY_H_
00375