00001
00010 #ifndef BS_WELLS_WELL_RATE_CONTROL_IMPL_H_
00011 #define BS_WELLS_WELL_RATE_CONTROL_IMPL_H_
00012
00013 #include "well_rate_control_interface.h"
00014 #include "well_rate_compute_potentials.h"
00015 #include "well_rate_call_proxy.h"
00016 #include "well_rate_connection_loop.h"
00017
00018 #include "well_rate_compute_params.h"
00019
00020 namespace blue_sky
00021 {
00022
00023 template <typename impl_type_t>
00024 class BS_API_PLUGIN well_rate_control_impl : public wells::well_rate_control_interface <typename impl_type_t::strategy_t>
00025 {
00026 public:
00027
00028 template <typename impl_t>
00029 struct impl;
00030
00031 typedef typename impl_type_t::strategy_t strategy_t;
00032 typedef impl <typename impl_type_t::inj_impl_t> inj_impl_t;
00033 typedef impl <typename impl_type_t::prod_impl_t> prod_impl_t;
00034
00035 typedef well_rate_control_impl <impl_type_t> this_t;
00036 typedef wells::well_rate_control_interface <strategy_t> base_t;
00037
00038 typedef typename base_t::calc_model_t calc_model_t;
00039 typedef typename calc_model_t::data_t data_t;
00040 typedef compute_params <strategy_t> compute_params_t;
00041
00042 typedef typename base_t::sp_calc_model_t sp_calc_model_t;
00043 typedef typename base_t::sp_jmatrix_t sp_jmatrix_t;
00044 typedef typename base_t::sp_well_t sp_well_t;
00045 typedef typename base_t::sp_well_controller_t sp_well_controller_t;
00046
00047 typedef typename base_t::sp_connection_t sp_connection_t;
00048
00049 typedef typename base_t::item_t item_t;
00050 typedef typename base_t::index_t index_t;
00051
00052 void
00053 compute_rate (const sp_calc_model_t &calc_model, sp_jmatrix_t &jmatrix, sp_well_t &well, const sp_well_controller_t &well_controller) const
00054 {
00055 compute_params_t params (calc_model, jmatrix, well, well_controller);
00056 connection_loop (params,
00057 one_call (&inj_impl_, &inj_impl_t::compute_rate),
00058 one_call (&prod_impl_, &prod_impl_t::compute_rate));
00059
00060 compute_bw_value (params);
00061 if (params.well_->is_shut () || params.well_->exploitation_factor_ <= 0.0)
00062 {
00063 if (params.is_prod)
00064 {
00065 apply_wefac_connection_loop (params, one_call (&prod_impl_, &prod_impl_t::apply_wefac));
00066 }
00067 else
00068 {
00069 apply_wefac_connection_loop (params, one_call (&inj_impl_, &inj_impl_t::apply_wefac));
00070 }
00071 }
00072 }
00073 void
00074 compute_derivs (const sp_calc_model_t &calc_model, sp_jmatrix_t &jmatrix, sp_well_t &well, const sp_well_controller_t &well_controller) const
00075 {
00076 compute_params_t params (calc_model, jmatrix, well, well_controller);
00077 connection_loop (params,
00078 two_call (&inj_impl_, &inj_impl_t::compute_bhp_derivs, &inj_impl_t::compute_rate_derivs),
00079 two_call (&prod_impl_, &prod_impl_t::compute_bhp_derivs, &prod_impl_t::compute_rate_derivs));
00080
00081 if (params.is_prod)
00082 {
00083 update_wr_connection_loop (params, one_call (&prod_impl_, &prod_impl_t::update_wr));
00084 apply_wefac_connection_loop (params, one_call (&prod_impl_, &prod_impl_t::apply_wefac));
00085 apply_wefac_connection_loop (params, one_call (&prod_impl_, &prod_impl_t::update_rate));
00086 }
00087 else
00088 {
00089 update_wr_connection_loop (params, one_call (&inj_impl_, &inj_impl_t::update_wr));
00090 apply_wefac_connection_loop (params, one_call (&inj_impl_, &inj_impl_t::apply_wefac));
00091 apply_wefac_connection_loop (params, one_call (&inj_impl_, &inj_impl_t::update_rate));
00092 }
00093 }
00094
00095 BLUE_SKY_TYPE_DECL_T (well_rate_control_impl);
00096
00097 public:
00098
00099 template <typename impl_t>
00100 struct impl
00101 {
00102 typedef typename impl_t::mobility_t mobility_t;
00103 typedef typename impl_t::rate_t rate_t;
00104 typedef typename impl_t::bhp_deriv_t bhp_deriv_t;
00105 typedef typename impl_t::rate_deriv_t rate_deriv_t;
00106 typedef compute_params_t params_t;
00107
00108 impl ()
00109 : rate_ (mobility_)
00110 , bhp_deriv_ (mobility_)
00111 , rate_deriv_ (mobility_)
00112 {
00113
00114 }
00115
00116 void
00117 compute_rate (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00118 {
00119 rate_.oil_function (c, data, params);
00120 rate_.water_function (c, data, params);
00121 rate_.gas_function (c, data, params);
00122 }
00123
00124 void
00125 compute_bhp_derivs (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00126 {
00127 bhp_deriv_.oil_function (c, data, params);
00128 bhp_deriv_.water_function (c, data, params);
00129 bhp_deriv_.gas_function (c, data, params);
00130
00131 bhp_deriv_.update_rr (c, data, params);
00132 bhp_deriv_.update_rhs_flux (c, data, params);
00133 }
00134 void
00135 compute_rate_derivs (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00136 {
00137 rate_deriv_.oil_function (c, data, params);
00138 rate_deriv_.water_function (c, data, params);
00139 rate_deriv_.gas_function (c, data, params);
00140 }
00141
00142 void
00143 update_wr (const sp_connection_t &c, item_t ww) const
00144 {
00145 rate_deriv_.update_wr (c, ww);
00146 }
00147
00148 void
00149 apply_wefac (const sp_connection_t &c, params_t ¶ms) const
00150 {
00151 bhp_deriv_.apply_wefac (c, params);
00152 rate_deriv_.apply_wefac (c, params);
00153 }
00154
00155 void
00156 update_rate (const sp_connection_t &c, params_t ¶ms) const
00157 {
00158 rate_deriv_.update_rate (c, params);
00159 }
00160
00161 mobility_t mobility_;
00162 rate_t rate_;
00163 bhp_deriv_t bhp_deriv_;
00164 rate_deriv_t rate_deriv_;
00165 };
00166
00167 private:
00168
00169
00170 void
00171 compute_bw_value (compute_params_t ¶ms) const
00172 {
00173 params.is_prod
00174 ? prod_impl_.bhp_deriv_.compute_bw_value (params)
00175 : inj_impl_.bhp_deriv_.compute_bw_value (params)
00176 ;
00177 }
00178
00179 inj_impl_t inj_impl_;
00180 prod_impl_t prod_impl_;
00181 };
00182
00183
00184 }
00185
00186
00187 #endif // #ifndef BS_WELLS_WELL_RATE_CONTROL_IMPL_H
00188