00001
00010 #ifndef BS_WELLS_WELL_RATE_CONTROL_DERIV_H_
00011 #define BS_WELLS_WELL_RATE_CONTROL_DERIV_H_
00012
00013 #include "apply_wefac.h"
00014
00015 namespace blue_sky
00016 {
00017 namespace wells
00018 {
00019
00020 template <typename mobility_calc_t>
00021 struct compute_deriv
00022 {
00023 typedef typename mobility_calc_t::strategy_t strategy_t;
00024 typedef mobility_calc_t mobility_t;
00025 typedef typename strategy_t::item_t item_t;
00026 typedef typename strategy_t::rhs_item_t rhs_item_t;
00027 typedef calc_model <strategy_t> calc_model_t;
00028 typedef well <strategy_t> well_t;
00029 typedef typename calc_model_t::data_t data_t;
00030 typedef typename mobility_calc_t::params_t params_t;
00031 typedef typename wells::type_helper <strategy_t> type_helper_t;
00032 typedef typename type_helper_t::item_rr_block_t item_rr_block_t;
00033 typedef typename type_helper_t::item_rw_block_t item_rw_block_t;
00034 typedef typename type_helper_t::item_wr_block_t item_wr_block_t;
00035 typedef typename type_helper_t::item_q_rate_t item_q_rate_t;
00036 typedef typename type_helper_t::item_rhs_block_t item_rhs_block_t;
00037 typedef typename type_helper_t::item_ps_block_t item_ps_block_t;
00038
00039 typedef typename well_t::sp_connection_t sp_connection_t;
00040
00041 protected:
00042
00043 compute_deriv (const mobility_calc_t &mobility_calc)
00044 : mobility_calc_ (mobility_calc)
00045 , mult (mobility_calc_t::mult)
00046 {
00047 }
00048
00049 BS_FORCE_INLINE item_t
00050 compute_oil_rate (const data_t &data, params_t ¶ms) const
00051 {
00052 const item_t &mo = mobility_calc_.get_oil_mobility (data, params);
00053 const item_t &Po = params.Po;
00054 const item_t &gw = params.gw;
00055
00056 #ifdef _DEBUG
00057 BOSOUT (section::wells, level::debug) << boost::format ("[%s : %d] qo (%.20e) gw: %.20e mo: %.20e po: %.20e") % params.well_->name ().c_str () % params.n_block % (gw * mo * Po) % gw % mo % Po << bs_end;
00058 #endif
00059
00060 item_t rate = gw * mo * Po;
00061 return rate;
00062 }
00063 BS_FORCE_INLINE item_t
00064 compute_oil_po_deriv (const data_t &data, params_t ¶ms) const
00065 {
00066 const item_t &dmo_dpo = mobility_calc_.get_mo_po_deriv (data, params);
00067 const item_t &mo = mobility_calc_.get_oil_mobility (data, params);
00068 item_t gw = params.gw;
00069 item_t Po = params.Po;
00070
00071 #ifdef _DEBUG
00072
00073 #endif
00074
00075 item_t po_deriv = -gw * (dmo_dpo * Po - mo);
00076 return po_deriv;
00077 }
00078
00079 BS_FORCE_INLINE item_t
00080 compute_oil_sw_deriv (const data_t &data, params_t ¶ms) const
00081 {
00082 const item_t &dmo_dsw = mobility_calc_.get_mo_sw_deriv (data, params);
00083 item_t gw = params.gw;
00084 item_t Po = params.Po;
00085
00086 #ifdef _DEBUG
00087
00088 #endif
00089
00090 item_t sw_deriv = -gw * dmo_dsw * Po;
00091 return sw_deriv;
00092 }
00093 BS_FORCE_INLINE item_t
00094 compute_oil_so_deriv (const data_t &data, params_t ¶ms) const
00095 {
00096 const item_t &dmo_dso = mobility_calc_.get_mo_so_deriv (data, params);
00097 item_t gw = params.gw;
00098 item_t Po = params.Po;
00099
00100 #ifdef _DEBUG
00101
00102 #endif
00103
00104 item_t so_deriv = -gw * dmo_dso * Po;
00105 return so_deriv;
00106 }
00107 BS_FORCE_INLINE item_t
00108 compute_oil_sg_deriv (const data_t &data, params_t ¶ms) const
00109 {
00110 const item_t &dmo_dsg = mobility_calc_.get_mo_sg_deriv (data, params);
00111 item_t gw = params.gw;
00112 item_t Po = params.Po;
00113
00114 #ifdef _DEBUG
00115
00116 #endif
00117
00118 item_t sg_deriv = -gw * dmo_dsg * Po;
00119 return sg_deriv;
00120 }
00121 BS_FORCE_INLINE item_t
00122 compute_oil_pref_deriv (const data_t &data, params_t ¶ms) const
00123 {
00124 const item_t &mo = mobility_calc_.get_oil_mobility (data, params);
00125 const item_t &gw = params.gw;
00126
00127 #ifdef _DEBUG
00128
00129 #endif
00130
00131 item_t pref_deriv = -gw * mo;
00132 return pref_deriv;
00133 }
00134
00135 BS_FORCE_INLINE item_t
00136 compute_water_rate (const data_t &data, params_t ¶ms) const
00137 {
00138 const item_t &mw = mobility_calc_.get_water_mobility (data, params);
00139 const item_t &Pw = params.Pw;
00140 const item_t &gw = params.gw;
00141
00142 #ifdef _DEBUG
00143 BOSOUT (section::wells, level::debug) << boost::format ("[%s : %d] qw (%.20e) gw: %.20e mw: %.20e pw: %.20e") % params.well_->name ().c_str () % params.n_block % (gw * mw * Pw) % gw % mw % Pw << bs_end;
00144 #endif
00145
00146 item_t rate = gw * mw * Pw;
00147 return rate;
00148 }
00149 BS_FORCE_INLINE item_t
00150 compute_water_po_deriv (const data_t &data, params_t ¶ms) const
00151 {
00152 const item_t &dmw_dpo = mobility_calc_.get_mw_po_deriv (data, params);
00153 const item_t &mw = mobility_calc_.get_water_mobility (data, params);
00154 item_t Pw = params.Pw;
00155 item_t gw = params.gw;
00156
00157 #ifdef _DEBUG
00158
00159 #endif
00160
00161 item_t po_deriv = -gw * (dmw_dpo * Pw - mw);
00162 return po_deriv;
00163 }
00164 BS_FORCE_INLINE item_t
00165 compute_water_sw_deriv (const data_t &data, params_t ¶ms) const
00166 {
00167 const item_t &dmw_dsw = mobility_calc_.get_mw_sw_deriv (data, params);
00168 const item_t &mw = mobility_calc_.get_water_mobility (data, params);
00169 item_t gw = params.gw;
00170 item_t Pw = params.Pw;
00171 item_t dpcwo_dsw = S_DERIV_CAP_PRESSURE (data, params.phase_d, FI_PHASE_WATER);
00172
00173 #ifdef _DEBUG
00174
00175 #endif
00176
00177 item_t sw_deriv = -gw * (dmw_dsw * Pw - mw * dpcwo_dsw);
00178 return sw_deriv;
00179 }
00180 BS_FORCE_INLINE item_t
00181 compute_water_so_deriv (const data_t &data, params_t ¶ms) const
00182 {
00183 const item_t &dmw_dso = mobility_calc_.get_mw_so_deriv (data, params);
00184 item_t gw = params.gw;
00185 item_t Pw = params.Pw;
00186
00187 #ifdef _DEBUG
00188
00189 #endif
00190
00191 item_t so_deriv = -gw * dmw_dso * Pw;
00192 return so_deriv;
00193 }
00194 BS_FORCE_INLINE item_t
00195 compute_water_sg_deriv (const data_t &data, params_t ¶ms) const
00196 {
00197 const item_t &dmw_dsg = mobility_calc_.get_mw_sg_deriv (data, params);
00198 item_t gw = params.gw;
00199 item_t Pw = params.Pw;
00200
00201 #ifdef _DEBUG
00202
00203 #endif
00204
00205 item_t sg_deriv = -gw * dmw_dsg * Pw;
00206 return sg_deriv;
00207 }
00208 BS_FORCE_INLINE item_t
00209 compute_water_pref_deriv (const data_t &data, params_t ¶ms) const
00210 {
00211 const item_t &mw = mobility_calc_.get_water_mobility (data, params);
00212 const item_t &gw = params.gw;
00213
00214 #ifdef _DEBUG
00215
00216 #endif
00217
00218 item_t pref_deriv = -gw * mw;
00219 return pref_deriv;
00220 }
00221
00222 BS_FORCE_INLINE item_t
00223 compute_gas_rate (const data_t &data, params_t ¶ms) const
00224 {
00225 return mobility_calc_.get_gas_rate (data, params);
00226 }
00227
00228 BS_FORCE_INLINE item_t
00229 compute_free_gas_rate (const data_t &data, params_t ¶ms) const
00230 {
00231 return mobility_calc_.get_free_gas_rate (data, params);
00232 }
00233
00234 BS_FORCE_INLINE item_t
00235 compute_solution_gas_rate (const data_t &data, params_t ¶ms) const
00236 {
00237 return mobility_calc_.get_solution_gas_rate (data, params);
00238 }
00239
00240 BS_FORCE_INLINE item_t
00241 compute_gas_po_deriv (const data_t &data, params_t ¶ms) const
00242 {
00243 #ifdef _DEBUG
00244
00245 #endif
00246
00247 return mobility_calc_.get_gas_po_deriv (data, params);
00248 }
00249 BS_FORCE_INLINE item_t
00250 compute_gas_sw_deriv (const data_t &data, params_t ¶ms) const
00251 {
00252 const item_t &dmg_dsw = mobility_calc_.get_gas_sw_deriv (data, params);
00253
00254 item_t gw = params.gw;
00255
00256
00257 #ifdef _DEBUG
00258
00259 #endif
00260
00261 item_t sw_deriv = -gw * dmg_dsw;
00262 return sw_deriv;
00263 }
00264 BS_FORCE_INLINE item_t
00265 compute_gas_so_deriv (const data_t &data, params_t ¶ms) const
00266 {
00267 const item_t &dmg_dso = mobility_calc_.get_gas_so_deriv (data, params);
00268 item_t gw = params.gw;
00269
00270
00271 #ifdef _DEBUG
00272
00273 #endif
00274
00275 item_t so_deriv = -gw * dmg_dso;
00276 return so_deriv;
00277 }
00278 BS_FORCE_INLINE item_t
00279 compute_gas_sg_deriv (const data_t &data, params_t ¶ms) const
00280 {
00281 #ifdef _DEBUG
00282
00283 #endif
00284
00285 return mobility_calc_.get_gas_sg_deriv (data, params);
00286 }
00287 BS_FORCE_INLINE item_t
00288 compute_gas_pref_deriv (const data_t &data, params_t ¶ms) const
00289 {
00290 #ifdef _DEBUG
00291
00292 #endif
00293
00294 return mobility_calc_.get_gas_pref_deriv (data, params);
00295 }
00296
00297 const mobility_calc_t &mobility_calc_;
00298 item_t mult;
00299 };
00300
00301 template <typename mobility_calc_t>
00302 struct dummy_deriv
00303 {
00304 typedef typename mobility_calc_t::strategy_t strategy_t;
00305 typedef mobility_calc_t mobility_t;
00306 typedef typename strategy_t::item_t item_t;
00307 typedef calc_model <strategy_t> calc_model_t;
00308 typedef typename calc_model_t::data_t data_t;
00309 typedef typename mobility_calc_t::params_t params_t;
00310 typedef well <strategy_t> well_t;
00311
00312 typedef typename well_t::sp_connection_t sp_connection_t;
00313
00314 public:
00315
00316 dummy_deriv (const mobility_calc_t &)
00317 {
00318 }
00319
00320 void
00321 oil_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00322 {
00323 }
00324 void
00325 water_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00326 {
00327 }
00328 void
00329 gas_function (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00330 {
00331 }
00332 void
00333 update_wr (const sp_connection_t &c, item_t ww) const
00334 {
00335 }
00336 void
00337 update_rr (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00338 {
00339 }
00340 void
00341 update_rhs_flux (const sp_connection_t &c, const data_t &data, params_t ¶ms) const
00342 {
00343 }
00344 void
00345 compute_bw_value (params_t ¶ms) const
00346 {
00347 }
00348 void
00349 apply_wefac (const sp_connection_t &c, params_t ¶ms) const
00350 {
00351 }
00352 void
00353 update_rate (const sp_connection_t &c, params_t ¶ms) const
00354 {
00355 }
00356 };
00357
00358 }
00359 }
00360
00361 #endif // #ifndef BS_WELLS_WELL_RATE_CONTROL_DERIV_H_
00362