00001
00010 #ifndef BS_WELLS_WELL_RATE_COMPUTE_PARAMS_H_
00011 #define BS_WELLS_WELL_RATE_COMPUTE_PARAMS_H_
00012
00013 namespace blue_sky {
00014
00015 template <typename strategy_t>
00016 struct compute_params
00017 {
00018 typedef typename strategy_t::index_t index_t;
00019 typedef typename strategy_t::item_t item_t;
00020 typedef typename strategy_t::item_array_t item_array_t;
00021 typedef typename strategy_t::index_array_t index_array_t;
00022
00023 typedef calc_model <strategy_t> calc_model_t;
00024 typedef well <strategy_t> well_t;
00025 typedef wells::well_controller <strategy_t> well_controller_t;
00026 typedef jacobian_matrix <strategy_t> jmatrix_t;
00027
00028 typedef typename calc_model_t::data_t data_t;
00029 typedef typename calc_model_t::data_array_t data_array_t;
00030 typedef typename calc_model_t::main_var_array_t main_var_array_t;
00031 typedef typename calc_model_t::phase_d_t phase_d_t;
00032
00033 typedef typename well_t::rate_data_t rate_data_t;
00034
00035 typedef smart_ptr <calc_model_t> sp_calc_model_t;
00036 typedef smart_ptr <well_t> sp_well_t;
00037 typedef smart_ptr <const well_controller_t> sp_well_controller_t;
00038 typedef smart_ptr <jmatrix_t> sp_jmatrix_t;
00039
00040 typedef typename well_t::sp_connection_t sp_connection_t;
00041
00042 struct inj_params
00043 {
00044 inj_params (wells::injection_type injection)
00045 : is_o_ctrl (injection == wells::injection_oil),
00046 is_w_ctrl (injection == wells::injection_water),
00047 is_g_ctrl (injection == wells::injection_gas),
00048 is_oil_injection (injection == wells::injection_oil),
00049 is_water_injection (injection == wells::injection_water),
00050 is_gas_injection (injection == wells::injection_gas)
00051 {
00052 }
00053
00054 bool is_o_ctrl;
00055 bool is_w_ctrl;
00056 bool is_g_ctrl;
00057 bool is_oil_injection;
00058 bool is_water_injection;
00059 bool is_gas_injection;
00060
00061 item_t krow_tetaow;
00062 item_t krp_tetap;
00063 item_t krp_dtetap_dpp;
00064 item_t dkrow_dsw_tetaow_krw_dtetaw_dsw;
00065 item_t dkrog_dsg_tetaog_krg_dtetag_dsg;
00066 };
00067
00068 struct prod_params
00069 {
00070 prod_params (wells::rate_control_type control)
00071 : is_o_ctrl (control == wells::oil_rate_control || control == wells::liquid_rate_control),
00072 is_w_ctrl (control == wells::water_rate_control || control == wells::liquid_rate_control),
00073 is_g_ctrl (control == wells::gas_rate_control)
00074 {
00075 }
00076
00077 bool is_o_ctrl;
00078 bool is_w_ctrl;
00079 bool is_g_ctrl;
00080 };
00081
00082 compute_params (const sp_calc_model_t &calc_model,
00083 sp_jmatrix_t &jmatrix,
00084 sp_well_t &well,
00085 const sp_well_controller_t &well_controller)
00086 : calc_model_ (calc_model),
00087 jmatrix_ (jmatrix),
00088 well_ (well),
00089 well_controller_ (well_controller),
00090 main_vars (calc_model_->main_variable),
00091 pressure (calc_model_->pressure),
00092 gas_oil_ratio (calc_model_->gas_oil_ratio),
00093 gravity (calc_model_->internal_constants.gravity_constant),
00094 n_block (-1),
00095 perf_bhp (0),
00096 diff_depth (0),
00097 depth (0),
00098 rho (0),
00099 main_var (FI_NULL),
00100 data_array (calc_model_->data),
00101 phase_d (calc_model_->phase_d),
00102 n_phases (calc_model_->n_phases),
00103 is_o (calc_model_->is_oil ()),
00104 is_w (calc_model_->is_water ()),
00105 is_g (calc_model_->is_gas ()),
00106 bw_value (well_->get_bw_value ()),
00107 ww_value (well_->get_ww_value ()),
00108 rate (well_->rate_),
00109 limit_rate (well_controller_->rate ()),
00110 inj_params_ (inj_params (well_controller_->injection ())),
00111 prod_params_ (prod_params (well_controller_->get_control_type ())),
00112 is_prod (well_controller_->is_production ()),
00113 Po (0),
00114 Pw (0),
00115 Pg (0),
00116 gw (0)
00117 {
00118 }
00119
00120 void
00121 compute_perf_vars (const data_t &data, inj_params ¶ms)
00122 {
00123 params.krow_tetaow
00124 = (is_o ? RELATIVE_PERM (data, phase_d, FI_PHASE_OIL) * INVERS_VISCOSITY (data, phase_d, FI_PHASE_OIL) : 0)
00125 + (is_w ? RELATIVE_PERM (data, phase_d, FI_PHASE_WATER) * INVERS_VISCOSITY (data, phase_d, FI_PHASE_WATER) : 0);
00126
00127 params.krp_tetap
00128 = params.krow_tetaow
00129 + (is_g ? RELATIVE_PERM (data, phase_d, FI_PHASE_GAS) * INVERS_VISCOSITY (data, phase_d, FI_PHASE_GAS) : 0);
00130
00131 params.krp_dtetap_dpp
00132 = (is_o ? RELATIVE_PERM (data, phase_d, FI_PHASE_OIL) * P_DERIV_INVERS_VISCOSITY (data, phase_d, FI_PHASE_OIL) : 0)
00133 + (is_w ? RELATIVE_PERM (data, phase_d, FI_PHASE_WATER) * P_DERIV_INVERS_VISCOSITY (data, phase_d, FI_PHASE_WATER) : 0)
00134 + (is_g ? RELATIVE_PERM (data, phase_d, FI_PHASE_GAS) * P_DERIV_INVERS_VISCOSITY (data, phase_d, FI_PHASE_GAS) : 0);
00135
00136 params.dkrow_dsw_tetaow_krw_dtetaw_dsw
00137 = (is_o && is_w ? S_DERIV_RELATIVE_PERM (data, phase_d, n_phases, FI_PHASE_OIL, FI_PHASE_WATER) * INVERS_VISCOSITY (data, phase_d, FI_PHASE_OIL) : 0)
00138 + (is_w ? S_DERIV_RELATIVE_PERM (data, phase_d, n_phases, FI_PHASE_WATER, FI_PHASE_WATER) * INVERS_VISCOSITY (data, phase_d, FI_PHASE_WATER) : 0)
00139 + (is_w ? RELATIVE_PERM (data, phase_d, FI_PHASE_WATER) * S_DERIV_INVERS_VISCOSITY (data, phase_d, FI_PHASE_WATER) * CAP_PRESSURE (data, phase_d, FI_PHASE_WATER) : 0)
00140 - (is_w ? P_DERIV_INVERS_FVF (data, phase_d, FI_PHASE_WATER) * CAP_PRESSURE (data, phase_d, FI_PHASE_WATER) : 0)
00141 ;
00142
00143 params.dkrog_dsg_tetaog_krg_dtetag_dsg
00144 = (is_o && is_g ? S_DERIV_RELATIVE_PERM (data, phase_d, n_phases, FI_PHASE_OIL, FI_PHASE_GAS) * INVERS_VISCOSITY (data, phase_d, FI_PHASE_OIL) : 0)
00145 + (is_g ? S_DERIV_RELATIVE_PERM (data, phase_d, n_phases, FI_PHASE_GAS, FI_PHASE_GAS) * INVERS_VISCOSITY (data, phase_d, FI_PHASE_GAS) : 0)
00146 + (is_g ? RELATIVE_PERM (data, phase_d, FI_PHASE_GAS) * S_DERIV_INVERS_VISCOSITY (data, phase_d, FI_PHASE_GAS) * CAP_PRESSURE (data, phase_d, FI_PHASE_GAS) : 0)
00147 ;
00148 }
00149
00150 public:
00151 const sp_calc_model_t &calc_model_;
00152 sp_jmatrix_t &jmatrix_;
00153 sp_well_t &well_;
00154 const sp_well_controller_t &well_controller_;
00155 const main_var_array_t &main_vars;
00156 const item_array_t &pressure;
00157 const item_array_t &gas_oil_ratio;
00158 item_t gravity;
00159 index_t n_block;
00160 item_t perf_bhp;
00161 item_t diff_depth;
00162 item_t depth;
00163 item_t rho;
00164 main_var_type main_var;
00165 const data_array_t &data_array;
00166 const phase_d_t &phase_d;
00167 index_t n_phases;
00168 bool is_o;
00169 bool is_w;
00170 bool is_g;
00171 array_ext <item_t> bw_value;
00172 array_ext <item_t> ww_value;
00173 rate_data_t &rate;
00174 const rate_data_t &limit_rate;
00175 inj_params inj_params_;
00176 prod_params prod_params_;
00177 bool is_prod;
00178
00179 item_t Po;
00180 item_t Pw;
00181 item_t Pg;
00182 item_t gw;
00183 };
00184
00185
00186 }
00187
00188
00189 #endif // #ifndef BS_WELLS_WELL_RATE_COMPUTE_PARAMS_H_
00190