00001
00010 #ifndef BS_WELLS_SAVE_CONNECTION_DATA_H_
00011 #define BS_WELLS_SAVE_CONNECTION_DATA_H_
00012
00013 #include "well_rate_control.h"
00014 #include "apply_wefac.h"
00015
00016 namespace blue_sky
00017 {
00018
00019 template <typename strategy_t>
00020 struct save_connection_data
00021 {
00022 typedef calc_model <strategy_t> calc_model_t;
00023 typedef typename strategy_t::index_t index_t;
00024
00025 typedef typename calc_model_t::data_array_t data_array_t;
00026 typedef typename calc_model_t::item_t item_t;
00027 typedef typename calc_model_t::item_array_t item_array_t;
00028 typedef typename strategy_t::rhs_item_array_t rhs_item_array_t;
00029 typedef typename calc_model_t::connection_t connection_t;
00030 typedef typename calc_model_t::well_t well_t;
00031 typedef typename calc_model_t::reservoir_t::facility_manager_t::well_const_iterator_t well_iterator_t;
00032 typedef typename calc_model_t::strategy_type strategy_type;
00033
00034 typedef smart_ptr <calc_model_t, true> sp_calc_model_t;
00035 typedef typename calc_model_t::sp_well_t sp_well_t;
00036 typedef typename calc_model_t::sp_connection_t sp_connection_t;
00037
00038 void
00039 save (const char *filename, const sp_calc_model_t &calc_model, item_t dt, well_iterator_t wb, const well_iterator_t &we, size_t iter_counter, item_t time, const item_array_t &sol, const item_array_t &rhs)
00040 {
00041 FILE *con_data = fopen (tools::string_formater (filename, iter_counter).str, "wt");
00042 index_t n_phases = calc_model->n_phases;
00043 bool is_o = calc_model->is_oil ();
00044 bool is_w = calc_model->is_water ();
00045 bool is_g = calc_model->is_gas ();
00046 for (well_iterator_t it = wb; it != we; ++it)
00047 {
00048 sp_well_t well (it->second, bs_dynamic_cast ());
00049 item_t h = well->get_connection_list ().front ()->connection_depth;
00050 item_t diff_h = 0;
00051 item_t g = calc_model->internal_constants.gravity_constant;
00052 for (size_t i = 0, cnt = well->get_connections_count (); i < cnt; ++i)
00053 {
00054 const sp_connection_t &c = (well->get_connection_list ())[i];
00055
00056 index_t n_block = c->n_block ();
00057 fprintf (con_data, "%d\n", n_block);
00058 fprintf (con_data, "%10.20lf\n", apply_wefac (c->get_rate_value () [0], well->exploitation_factor_));
00059 fprintf (con_data, "%10.20lf\n", apply_wefac (c->get_rate_value () [1], well->exploitation_factor_));
00060 fprintf (con_data, "%10.20lf\n", apply_wefac (c->get_rate_value () [2], well->exploitation_factor_));
00061 fprintf (con_data, "%10.20lf\n", c->get_cur_bhp ());
00062 fprintf (con_data, "%10.20lf\n", calc_model->pressure [n_block]);
00063 if (calc_model->n_phases > 1)
00064 {
00065 fprintf (con_data, "%10.20lf\n", calc_model->saturation_3p [n_block]);
00066 }
00067 else
00068 {
00069 fprintf (con_data, "0\n");
00070 }
00071 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].mobility [0]);
00072 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].mobility [1]);
00073 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].mobility [2]);
00074 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].relative_perm [0]);
00075 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].relative_perm [1]);
00076 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].relative_perm [2]);
00077 fprintf (con_data, "%10.20lf\n", well->bhp ());
00078 fprintf (con_data, "%10.20lf\n", well->oil_rate ());
00079 fprintf (con_data, "%10.20lf\n", well->water_rate ());
00080 fprintf (con_data, "%10.20lf\n", well->gas_rate ());
00081 fprintf (con_data, "%10.20lf\n", well->get_well_controller ()->bhp ());
00082 fprintf (con_data, "%10.20lf\n", well->get_well_controller ()->oil_rate ());
00083 fprintf (con_data, "%10.20lf\n", well->get_well_controller ()->water_rate ());
00084 fprintf (con_data, "%10.20lf\n", well->get_well_controller ()->gas_rate ());
00085 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_fvf [0]);
00086 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_fvf [1]);
00087 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_fvf [2]);
00088 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].prev_fluid_volume [0]);
00089 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].prev_fluid_volume [1]);
00090 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].prev_fluid_volume [2]);
00091 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].porosity);
00092 fprintf (con_data, "%10.20lf\n", calc_model->rock_grid_prop->volume [n_block]);
00093
00094 fprintf (con_data, "%10.20lf\n", well->acc_rate_prod.oil);
00095 fprintf (con_data, "%10.20lf\n", well->acc_rate_prod.water);
00096 fprintf (con_data, "%10.20lf\n", well->acc_rate_prod.gas);
00097 fprintf (con_data, "%10.20lf\n", well->acc_rate_inj.oil);
00098 fprintf (con_data, "%10.20lf\n", well->acc_rate_inj.water);
00099 fprintf (con_data, "%10.20lf\n", well->acc_rate_inj.gas);
00100
00101 fprintf (con_data, "%10.20lf\n", c->get_fact ());
00102
00103 using namespace wells;
00104 if (well->is_shut ())
00105 {
00106 fprintf (con_data, "%d\n", 0);
00107 }
00108 else if (well->get_well_controller ()->is_production ())
00109 {
00110 if (well->is_bhp ())
00111 fprintf (con_data, "%d\n", -2);
00112 else if (well->get_well_controller ()->get_control_type () == oil_rate_control)
00113 fprintf (con_data, "%d\n", -4);
00114 else if (well->get_well_controller ()->get_control_type () == water_rate_control)
00115 fprintf (con_data, "%d\n", -3);
00116 else if (well->get_well_controller ()->get_control_type () == liquid_rate_control)
00117 fprintf (con_data, "%d\n", -1);
00118 else
00119 fprintf (con_data, "%d\n", -5);
00120 }
00121 else
00122 {
00123 if (well->is_bhp ())
00124 fprintf (con_data, "%d\n", 2);
00125 else if (well->get_well_controller ()->injection () == injection_water)
00126 fprintf (con_data, "%d\n", 1);
00127 else
00128 fprintf (con_data, "%d\n", 5);
00129 }
00130
00131 fprintf (con_data, "%10.20lf\n", well->exploitation_factor_.data ());
00132 fprintf (con_data, "%10.20lf\n", dt);
00133 fprintf (con_data, "%10.20lf\n", time);
00134 fprintf (con_data, "%10.20lf\n", well->bw_value);
00135 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_viscosity [0]);
00136 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_viscosity [1]);
00137 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_viscosity [2]);
00138 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_visc_fvf [0]);
00139 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_visc_fvf [1]);
00140 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].invers_visc_fvf [2]);
00141
00142 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_fvf [0]);
00143 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_fvf [1]);
00144 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_fvf [2]);
00145 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_viscosity [0]);
00146 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_viscosity [1]);
00147 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_viscosity [2]);
00148 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_visc_fvf [0]);
00149 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_visc_fvf [1]);
00150 fprintf (con_data, "%10.20lf\n", calc_model->data [n_block].p_deriv_invers_visc_fvf [2]);
00151
00152 fprintf (con_data, "%10.20lf\n", well->rate_prod.oil);
00153 fprintf (con_data, "%10.20lf\n", well->rate_prod.water);
00154 fprintf (con_data, "%10.20lf\n", well->rate_prod.gas);
00155 fprintf (con_data, "%10.20lf\n", well->rate_inj.oil);
00156 fprintf (con_data, "%10.20lf\n", well->rate_inj.water);
00157 fprintf (con_data, "%10.20lf\n", well->rate_inj.gas);
00158
00159 diff_h = c->connection_depth - h;
00160 h = c->connection_depth;
00161 item_t Po = c->cur_bhp + (c->density * g * diff_h) - calc_model->pressure[c->n_block ()];
00162 item_t Pw = Po;
00163 item_t Pg = Po;
00164
00165 if (calc_model->is_water ())
00166 Pw += calc_model->data[n_block].cap_pressure[0];
00167
00168 if (calc_model->is_gas ())
00169 Pg += calc_model->data[n_block].cap_pressure[1];
00170
00171 fprintf (con_data, "%10.20lf\n", Po);
00172 fprintf (con_data, "%10.20lf\n", Pw);
00173 fprintf (con_data, "%10.20lf\n", Pg);
00174
00175 fprintf (con_data, "%10.20lf\n", (double)c->density);
00176 fprintf (con_data, "%10.20lf\n", (double)c->head_term);
00177 fprintf (con_data, "%10.20lf\n", (double)c->connection_depth);
00178
00179 fprintf (con_data, "%10.20lf\n", sol[n_block * n_phases]);
00180 fprintf (con_data, "%10.20lf\n", sol[n_block * n_phases + 1]);
00181
00182 fprintf (con_data, "%10.20lf\n", rhs[n_block * n_phases]);
00183 fprintf (con_data, "%10.20lf\n", rhs[n_block * n_phases + 1]);
00184 }
00185 }
00186 fclose (con_data);
00187 }
00188
00189 void
00190 save_acc (const char *filename, const sp_calc_model_t &, item_t , well_iterator_t wb, const well_iterator_t &we, size_t iter_counter, item_t , const item_array_t &, const rhs_item_array_t &)
00191 {
00192 FILE *con_data = fopen (tools::string_formater (filename, iter_counter).str, "wt");
00193 for (well_iterator_t it = wb; it != we; ++it)
00194 {
00195 const sp_well_t &well = it->second;
00196 fprintf (con_data, "well: %s\n", well->name ().c_str ());
00197 fprintf (con_data, "prod_oil: %10.20lf\n", well->acc_rate_prod.oil);
00198 fprintf (con_data, "prod_water: %10.20lf\n", well->acc_rate_prod.water);
00199 fprintf (con_data, "prod_gas: %10.20lf\n", well->acc_rate_prod.gas);
00200 fprintf (con_data, "inj_oil: %10.20lf\n", well->acc_rate_inj.oil);
00201 fprintf (con_data, "inj_water: %10.20lf\n", well->acc_rate_inj.water);
00202 fprintf (con_data, "inj_gas: %10.20lf\n", well->acc_rate_inj.gas);
00203
00204
00205
00206
00207
00208
00209
00210
00211 }
00212
00213 fclose (con_data);
00214 }
00215 };
00216
00217
00218 }
00219
00220
00221
00222 #endif // #ifndef BS_WELLS_SAVE_CONNECTION_DATA_H_
00223