00001
00010 #ifndef BS_WELLS_WELL_RATE_CONTROL_RATE_H_
00011 #define BS_WELLS_WELL_RATE_CONTROL_RATE_H_
00012
00013 #include "well_rate_control_deriv.h"
00014 #include "well_rate_control_compute_deriv_typedef.h"
00015
00016 namespace blue_sky
00017 {
00018 namespace wells
00019 {
00020
00021
00022 template <typename mobility_calc_t>
00023 struct compute_rate_3p : public compute_deriv <mobility_calc_t>
00024 {
00025 GET_COMPUTE_DERIV_BASE_TYPES;
00026
00027 compute_rate_3p (const mobility_calc_t &mobility_calc)
00028 : base_t (mobility_calc)
00029 {
00030 }
00031
00032 void
00033 oil_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00034 {
00035 if (mobility_calc_t::is_oil_injection (params))
00036 {
00037 c->get_rate_value () [p3_oil] = base_t::compute_oil_rate (data, params);
00038 if (params.is_prod)
00039 {
00040 c->rate_.prod.oil = c->get_rate_value () [p3_oil];
00041 c->rate_.prod.liquid = c->get_rate_value () [p3_oil];
00042 params.rate.prod.oil += c->get_rate_value () [p3_oil];
00043 params.rate.prod.liquid += c->get_rate_value () [p3_oil];
00044
00045 c->rate_rc_.prod.oil = c->rate_.prod.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00046 c->rate_rc_.prod.liquid = c->rate_rc_.prod.oil;
00047 params.well_->rate_rc_.prod.oil += c->rate_rc_.prod.oil;
00048 params.well_->rate_rc_.prod.liquid += c->rate_rc_.prod.oil;
00049 }
00050 else
00051 {
00052 c->rate_.inj.oil = c->get_rate_value () [p3_oil];
00053 c->rate_.inj.liquid = c->get_rate_value () [p3_oil];
00054 params.rate.inj.oil += c->get_rate_value () [p3_oil];
00055 params.rate.inj.liquid += c->get_rate_value () [p3_oil];
00056
00057 c->rate_rc_.inj.oil = c->rate_.inj.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00058 c->rate_rc_.inj.liquid = c->rate_rc_.inj.oil;
00059 params.well_->rate_rc_.inj.oil += c->rate_rc_.inj.oil;
00060 params.well_->rate_rc_.inj.liquid += c->rate_rc_.inj.oil;
00061 }
00062 }
00063 }
00064 void
00065 water_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00066 {
00067 if (mobility_calc_t::is_water_injection (params))
00068 {
00069 c->get_rate_value () [p3_wat] = base_t::compute_water_rate (data, params);
00070 if (params.is_prod)
00071 {
00072 c->rate_.prod.water = c->get_rate_value () [p3_wat];
00073 c->rate_.prod.liquid = c->get_rate_value () [p3_wat];
00074 params.rate.prod.water += c->get_rate_value () [p3_wat];
00075 params.rate.prod.liquid += c->get_rate_value () [p3_wat];
00076
00077 c->rate_rc_.prod.water = c->rate_.prod.water / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_WATER]];
00078 c->rate_rc_.prod.liquid = c->rate_rc_.prod.water;
00079 params.well_->rate_rc_.prod.water += c->rate_rc_.prod.water;
00080 params.well_->rate_rc_.prod.liquid += c->rate_rc_.prod.water;
00081 }
00082 else
00083 {
00084 c->rate_.inj.water = c->get_rate_value () [p3_wat];
00085 c->rate_.inj.liquid = c->get_rate_value () [p3_wat];
00086 params.rate.inj.water += c->get_rate_value () [p3_wat];
00087 params.rate.inj.liquid += c->get_rate_value () [p3_wat];
00088
00089 c->rate_rc_.inj.water = c->rate_.inj.water / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_WATER]];
00090 c->rate_rc_.inj.liquid = c->rate_rc_.inj.water;
00091 params.well_->rate_rc_.inj.water += c->rate_rc_.inj.water;
00092 params.well_->rate_rc_.inj.liquid += c->rate_rc_.inj.water;
00093 }
00094 }
00095 }
00096 void
00097 gas_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00098 {
00099 if (mobility_calc_t::is_gas_injection (params))
00100 {
00101 c->get_rate_value () [p3_gas] = base_t::compute_gas_rate (data, params);
00102 if (params.is_prod)
00103 {
00104 c->rate_.prod.gas = c->get_rate_value () [p3_gas];
00105 c->rate_.free_gas = base_t::compute_free_gas_rate (data, params);
00106 c->rate_.solution_gas = base_t::compute_solution_gas_rate (data, params);
00107 params.rate.prod.gas += c->get_rate_value () [p3_gas];
00108 params.rate.free_gas += c->rate_.free_gas;
00109 params.rate.solution_gas += c->rate_.solution_gas;
00110 params.well_->gor_ = params.rate.solution_gas / params.rate.prod.oil;
00111
00112 c->rate_rc_.free_gas = c->rate_.free_gas / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_GAS]];
00113 c->rate_rc_.solution_gas = c->rate_.solution_gas;
00114 c->rate_rc_.prod.gas = c->rate_.free_gas + c->rate_.solution_gas / INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00115 params.well_->rate_rc_.prod.gas += c->rate_rc_.prod.gas;
00116 params.well_->rate_rc_.free_gas += c->rate_rc_.free_gas;
00117 }
00118 else
00119 {
00120 c->rate_.inj.gas = c->get_rate_value () [p3_gas];
00121 params.rate.inj.gas += c->get_rate_value () [p3_gas];
00122
00123 c->rate_rc_.inj.gas = base_t::compute_free_gas_rate (data, params) / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_GAS]];
00124 params.well_->rate_rc_.inj.gas += c->rate_rc_.inj.gas;
00125 }
00126 }
00127 }
00128 };
00129
00130 template <typename mobility_calc_t>
00131 struct compute_rate_2p_ow : public compute_deriv <mobility_calc_t>
00132 {
00133 GET_COMPUTE_DERIV_BASE_TYPES;
00134
00135 compute_rate_2p_ow (const mobility_calc_t &mobility_calc)
00136 : base_t (mobility_calc)
00137 {
00138 }
00139
00140 void
00141 oil_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00142 {
00143 if (mobility_calc_t::is_oil_injection (params))
00144 {
00145 c->get_rate_value () [p2ow_oil] = base_t::compute_oil_rate (data, params);
00146 if (params.is_prod)
00147 {
00148 c->rate_.prod.oil = c->get_rate_value () [p2ow_oil];
00149 c->rate_.prod.liquid = c->get_rate_value () [p2ow_oil];
00150 params.rate.prod.oil += c->get_rate_value () [p2ow_oil];
00151 params.rate.prod.liquid += c->get_rate_value () [p2ow_oil];
00152
00153 c->rate_rc_.prod.oil = c->rate_.prod.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00154 c->rate_rc_.prod.liquid = c->rate_rc_.prod.oil;
00155 params.well_->rate_rc_.prod.oil += c->rate_rc_.prod.oil;
00156 params.well_->rate_rc_.prod.liquid += c->rate_rc_.prod.oil;
00157 }
00158 else
00159 {
00160 c->rate_.inj.oil = c->get_rate_value () [p2ow_oil];
00161 c->rate_.inj.liquid = c->get_rate_value () [p2ow_oil];
00162 params.rate.inj.oil += c->get_rate_value () [p2ow_oil];
00163 params.rate.inj.liquid += c->get_rate_value () [p2ow_oil];
00164
00165 c->rate_rc_.inj.oil = c->rate_.inj.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00166 c->rate_rc_.inj.liquid = c->rate_rc_.inj.oil;
00167 params.well_->rate_rc_.inj.oil += c->rate_rc_.inj.oil;
00168 params.well_->rate_rc_.inj.liquid += c->rate_rc_.inj.oil;
00169 }
00170 }
00171 }
00172 void
00173 water_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00174 {
00175 if (mobility_calc_t::is_water_injection (params))
00176 {
00177 c->get_rate_value () [p2ow_wat] = base_t::compute_water_rate (data, params);
00178 if (params.is_prod)
00179 {
00180 c->rate_.prod.water = c->get_rate_value () [p2ow_wat];
00181 c->rate_.prod.liquid = c->get_rate_value () [p2ow_wat];
00182 params.rate.prod.water += c->get_rate_value () [p2ow_wat];
00183 params.rate.prod.liquid += c->get_rate_value () [p2ow_wat];
00184
00185 c->rate_rc_.prod.water = c->rate_.prod.water / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_WATER]];
00186 c->rate_rc_.prod.liquid = c->rate_rc_.prod.water;
00187 params.well_->rate_rc_.prod.water += c->rate_rc_.prod.water;
00188 params.well_->rate_rc_.prod.liquid += c->rate_rc_.prod.water;
00189 }
00190 else
00191 {
00192 c->rate_.inj.water = c->get_rate_value () [p2ow_wat];
00193 c->rate_.inj.liquid = c->get_rate_value () [p2ow_wat];
00194 params.rate.inj.water += c->get_rate_value () [p2ow_wat];
00195 params.rate.inj.liquid += c->get_rate_value () [p2ow_wat];
00196
00197 c->rate_rc_.inj.water = c->rate_.inj.water / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_WATER]];
00198 c->rate_rc_.inj.liquid = c->rate_rc_.inj.water;
00199 params.well_->rate_rc_.inj.water += c->rate_rc_.inj.water;
00200 params.well_->rate_rc_.inj.liquid += c->rate_rc_.inj.water;
00201 }
00202 }
00203 }
00204 void
00205 gas_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00206 {
00207 }
00208 };
00209
00210 template <typename mobility_calc_t>
00211 struct compute_rate_2p_og : public compute_deriv <mobility_calc_t>
00212 {
00213 GET_COMPUTE_DERIV_BASE_TYPES;
00214
00215 compute_rate_2p_og (const mobility_calc_t &mobility_calc)
00216 : base_t (mobility_calc)
00217 {
00218 }
00219
00220 void
00221 oil_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00222 {
00223 if (mobility_calc_t::is_oil_injection (params))
00224 {
00225 c->get_rate_value () [p2og_oil] = base_t::compute_oil_rate (data, params);
00226 if (params.is_prod)
00227 {
00228 c->rate_.prod.oil = c->get_rate_value () [p2og_oil];
00229 c->rate_.prod.liquid = c->get_rate_value () [p2og_oil];
00230 params.rate.prod.oil += c->get_rate_value () [p2og_oil];
00231 params.rate.prod.liquid += c->get_rate_value () [p2og_oil];
00232
00233 c->rate_rc_.prod.oil = c->rate_.prod.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00234 c->rate_rc_.prod.liquid = c->rate_rc_.prod.oil;
00235 params.well_->rate_rc_.prod.oil += c->rate_rc_.prod.oil;
00236 params.well_->rate_rc_.prod.liquid += c->rate_rc_.prod.oil;
00237 }
00238 else
00239 {
00240 c->rate_.inj.oil = c->get_rate_value () [p2og_oil];
00241 c->rate_.inj.liquid = c->get_rate_value () [p2og_oil];
00242 params.rate.inj.oil += c->get_rate_value () [p2og_oil];
00243 params.rate.inj.liquid += c->get_rate_value () [p2og_oil];
00244
00245 c->rate_rc_.inj.oil = c->rate_.inj.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00246 c->rate_rc_.inj.liquid = c->rate_rc_.inj.oil;
00247 params.well_->rate_rc_.inj.oil += c->rate_rc_.inj.oil;
00248 params.well_->rate_rc_.inj.liquid += c->rate_rc_.inj.oil;
00249 }
00250 }
00251 }
00252 void
00253 water_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00254 {
00255 }
00256 void
00257 gas_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00258 {
00259 if (mobility_calc_t::is_gas_injection (params))
00260 {
00261 c->get_rate_value () [p2og_gas] = base_t::compute_gas_rate (data, params);
00262 c->rate_.free_gas = base_t::compute_free_gas_rate (data, params) / INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00263 if (params.is_prod)
00264 {
00265 c->rate_.prod.gas = c->get_rate_value () [p2og_gas];
00266 params.rate.prod.gas += c->get_rate_value () [p2og_gas];
00267
00268 c->rate_.free_gas = base_t::compute_free_gas_rate (data, params);
00269 c->rate_.solution_gas = base_t::compute_solution_gas_rate (data, params);
00270
00271 params.rate.free_gas += c->rate_.free_gas;
00272 params.rate.solution_gas += c->rate_.solution_gas;
00273 params.well_->gor_ = params.rate.solution_gas / params.rate.prod.oil;
00274
00275 c->rate_rc_.free_gas = c->rate_.free_gas / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_GAS]];
00276 c->rate_rc_.solution_gas = c->rate_.solution_gas;
00277 c->rate_rc_.prod.gas = c->rate_.free_gas + c->rate_.solution_gas / INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00278 params.well_->rate_rc_.prod.gas += c->rate_rc_.prod.gas;
00279 params.well_->rate_rc_.free_gas += c->rate_rc_.free_gas;
00280 }
00281 else
00282 {
00283 c->rate_.inj.gas = c->get_rate_value () [p2og_gas];
00284 params.rate.inj.gas += c->get_rate_value () [p2og_gas];
00285
00286 c->rate_rc_.inj.gas = base_t::compute_free_gas_rate (data, params) / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_GAS]];
00287 params.well_->rate_rc_.inj.gas += c->rate_rc_.inj.gas;
00288 }
00289 }
00290 }
00291 };
00292
00293 template <typename mobility_calc_t>
00294 struct compute_rate_1p_o : public compute_deriv <mobility_calc_t>
00295 {
00296 GET_COMPUTE_DERIV_BASE_TYPES;
00297
00298 compute_rate_1p_o (const mobility_calc_t &mobility_calc)
00299 : base_t (mobility_calc)
00300 {
00301 }
00302
00303 void
00304 oil_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00305 {
00306 if (mobility_calc_t::is_oil_injection (params))
00307 {
00308 c->get_rate_value () [0] = base_t::compute_oil_rate (data, params);
00309 if (params.is_prod)
00310 {
00311 c->rate_.prod.oil = c->get_rate_value () [0];
00312 c->rate_.prod.liquid = c->get_rate_value () [0];
00313 params.rate.prod.oil += c->get_rate_value () [0];
00314 params.rate.prod.liquid += c->get_rate_value () [0];
00315
00316 c->rate_rc_.prod.oil = c->rate_.prod.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00317 c->rate_rc_.prod.liquid = c->rate_rc_.prod.oil;
00318 params.well_->rate_rc_.prod.oil += c->rate_rc_.prod.oil;
00319 params.well_->rate_rc_.prod.liquid += c->rate_rc_.prod.oil;
00320 }
00321 else
00322 {
00323 c->rate_.inj.oil = c->get_rate_value () [0];
00324 c->rate_.inj.liquid = c->get_rate_value () [0];
00325 params.rate.inj.oil += c->get_rate_value () [0];
00326 params.rate.inj.liquid += c->get_rate_value () [0];
00327
00328 c->rate_rc_.inj.oil = c->rate_.inj.oil / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_OIL]];
00329 c->rate_rc_.inj.liquid = c->rate_rc_.inj.oil;
00330 params.well_->rate_rc_.inj.oil += c->rate_rc_.inj.oil;
00331 params.well_->rate_rc_.inj.liquid += c->rate_rc_.inj.oil;
00332 }
00333 }
00334 }
00335 void
00336 water_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00337 {
00338 }
00339 void
00340 gas_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00341 {
00342 }
00343 };
00344 template <typename mobility_calc_t>
00345 struct compute_rate_1p_w : public compute_deriv <mobility_calc_t>
00346 {
00347 GET_COMPUTE_DERIV_BASE_TYPES;
00348
00349 compute_rate_1p_w (const mobility_calc_t &mobility_calc)
00350 : base_t (mobility_calc)
00351 {
00352 }
00353
00354 void
00355 oil_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00356 {
00357 }
00358 void
00359 water_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00360 {
00361 if (mobility_calc_t::is_water_injection (params))
00362 {
00363 c->get_rate_value () [0] = base_t::compute_water_rate (data, params);
00364 if (params.is_prod)
00365 {
00366 c->rate_.prod.water = c->get_rate_value () [0];
00367 c->rate_.prod.liquid = c->get_rate_value () [0];
00368 params.rate.prod.water += c->get_rate_value () [0];
00369 params.rate.prod.liquid += c->get_rate_value () [0];
00370
00371 c->rate_rc_.prod.water = c->rate_.prod.water / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_WATER]];
00372 c->rate_rc_.prod.liquid = c->rate_rc_.prod.water;
00373 params.well_->rate_rc_.prod.water += c->rate_rc_.prod.water;
00374 params.well_->rate_rc_.prod.liquid += c->rate_rc_.prod.water;
00375 }
00376 else
00377 {
00378 c->rate_.inj.water = c->get_rate_value () [0];
00379 c->rate_.inj.liquid = c->get_rate_value () [0];
00380 params.rate.inj.water += c->get_rate_value () [0];
00381 params.rate.inj.liquid += c->get_rate_value () [0];
00382
00383 c->rate_rc_.inj.water = c->rate_.inj.water / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_WATER]];
00384 c->rate_rc_.inj.liquid = c->rate_rc_.inj.water;
00385 params.well_->rate_rc_.inj.water += c->rate_rc_.inj.water;
00386 params.well_->rate_rc_.inj.liquid += c->rate_rc_.inj.water;
00387 }
00388 }
00389 }
00390 void
00391 gas_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00392 {
00393 }
00394 };
00395 template <typename mobility_calc_t>
00396 struct compute_rate_1p_g : public compute_deriv <mobility_calc_t>
00397 {
00398 GET_COMPUTE_DERIV_BASE_TYPES;
00399
00400 compute_rate_1p_g (const mobility_calc_t &mobility_calc)
00401 : base_t (mobility_calc)
00402 {
00403 }
00404
00405 void
00406 oil_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00407 {
00408 }
00409 void
00410 water_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00411 {
00412 }
00413 void
00414 gas_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00415 {
00416 if (mobility_calc_t::is_gas_injection (params))
00417 {
00418 c->get_rate_value () [0] = base_t::compute_gas_rate (data, params);
00419 c->rate_.free_gas = base_t::compute_free_gas_rate (data, params) / INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00420 if (params.is_prod)
00421 {
00422 c->rate_.prod.gas = c->get_rate_value () [0];
00423 c->rate_.free_gas = base_t::compute_free_gas_rate (data, params);
00424 c->rate_.solution_gas = base_t::compute_solution_gas_rate (data, params);
00425 params.rate.prod.gas += c->get_rate_value () [0];
00426 params.rate.free_gas += c->rate_.free_gas;
00427 params.rate.solution_gas += c->rate_.solution_gas;
00428 params.well_->gor_ = params.rate.solution_gas / params.rate.prod.oil;
00429
00430 c->rate_rc_.free_gas = c->rate_.free_gas / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_GAS]];
00431 c->rate_rc_.solution_gas = c->rate_.solution_gas;
00432 c->rate_rc_.prod.gas = c->rate_.free_gas + c->rate_.solution_gas / INVERS_FVF (data, params.phase_d, FI_PHASE_GAS);
00433 params.well_->rate_rc_.prod.gas += c->rate_rc_.prod.gas;
00434 params.well_->rate_rc_.free_gas += c->rate_rc_.free_gas;
00435 }
00436 else
00437 {
00438 c->rate_.inj.gas = c->get_rate_value () [0];
00439 params.rate.inj.gas += c->get_rate_value () [0];
00440
00441 c->rate_rc_.inj.gas = base_t::compute_free_gas_rate (data, params) / params.calc_model_->invers_fvf_average[params.phase_d[FI_PHASE_GAS]];
00442 params.well_->rate_rc_.inj.gas += c->rate_rc_.inj.gas;
00443 }
00444 }
00445 }
00446 };
00447
00448 }
00449 }
00450
00451 #endif // #ifndef BS_WELLS_WELL_RATE_CONTROL_RATE_H_
00452