1 #include "servor.hpp"
2 #include "profitability.hpp"
3 using namespace std;
4
5 /*------------------------------------------------------------------------*/
6 /* fonction principale */
7 /*------------------------------------------------------------------------*/
main(int argc,char ** argv)8 int main ( int argc , char ** argv ) {
9
10 double g0 = 1e+20;
11 double g1 = 1e+20;
12 double g2 = 1e+20;
13 double g3 = 1e+20;
14 double g4 = 1e+20;
15 double g5 = 1e+20;
16 double g6 = 1e+20;
17 double g7 = 1e+20;
18 double g8 = 1e+20;
19 double g9 = 1e+20;
20 double g10 = 1e+20;
21 double f = 1e+20;
22
23 bool OK;
24 ifstream in;
25 double d;
26 int i;
27 int i_stream , i_chem;
28 double x [8];
29 long double tmp[8];
30 double raw_cost;
31 double util_cost;
32 double Itot;
33 double Coper;
34 double Rtot;
35 double max;
36 double mtot;
37 double m;
38 double purity;
39 int nb_chem = 7;
40 int nb_s = 15;
41 int nb_u = 11;
42 int n = 8;
43 double l [8] = { 600 , 2 , 0.0001 , 0.0001 , 2 , 0.01 , 0.1 , 300 };
44 double u [8] = { 1100 , 20 , 0.1 , 0.1 , 20 , 0.5 , 5 , 500 };
45 double list [7] = { 0.5 , 0 , 0 , 0 , 0 , 0 , 0 };
46 double price[7] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 };
47 profitability * P = NULL;
48 cashflow * F = NULL;
49 chemical ** chem = NULL;
50 stream ** s = NULL;
51 servor * units = NULL;
52 string * safe = NULL;
53
54 // verif. du nombre d'arguments :
55 if (argc!=2) {
56 // cout << "\nargc != 2\n\n";
57 goto TERMINATE;
58 }
59
60 // lecture et scaling de x :
61 // -------------------------
62 in.open (argv[1]);
63
64 for ( i = 0 ; i < n ; i++ )
65 in >> tmp[i];
66
67 in.close();
68
69 if (in.fail()) {
70 // cout << "\nin.fail (1)\n\n";
71 goto TERMINATE;
72 }
73
74 //for ( i = 0 ; i < n ; i++ )
75 // cout << "tmp[" << i << "] = " << tmp[i] << endl;
76 // cout << endl;
77
78 for ( i = 0 ; i < n ; i++ )
79 x[i] = (u[i]-l[i])*((double)tmp[i]/100.0) + l[i];
80
81 //for ( i = 0 ; i < n ; i++ )
82 // cout << "x[" << i << "] = " << x[i] << endl;
83
84 // verifs de x (j'ai pris ca dans checkup et c'est tout ce dont
85 // ca a besoin de checker ici) :
86 if ( x[6] < EPS || x[2] < 0 || x[2] > 1 || x[3] < 0 || x[3] > 1 )
87 goto TERMINATE;
88
89 // chemicals :
90 // -----------
91 chem = new chemical * [nb_chem];
92 chem[0] = new chemical ("100-41-4" );
93 chem[1] = new chemical ("1333-74-0");
94 chem[2] = new chemical ("108-88-3" );
95 chem[3] = new chemical ("74-82-8" );
96 chem[4] = new chemical ("71-43-2" );
97 chem[5] = new chemical ("74-85-1" );
98 chem[6] = new chemical ("100-42-5" );
99
100 price[6] = 1.39;
101 price[2] = 0.64;
102 price[0] = 0.11;
103 price[4] = 1.19;
104
105 // streams :
106 // ---------
107 s = new stream * [nb_s];
108 s[ 0] = new stream ( "feed" , nb_chem , chem );
109 s[ 1] = new stream ( "2" , nb_chem , chem );
110 s[ 2] = new stream ( "3" , nb_chem , chem );
111 s[ 3] = new stream ( "4" , nb_chem , chem );
112 s[ 4] = new stream ( "5" , nb_chem , chem );
113 s[ 5] = new stream ( "6" , nb_chem , chem );
114 s[ 6] = new stream ( "7" , nb_chem , chem );
115 s[ 7] = new stream ( "8" , nb_chem , chem );
116 s[ 8] = new stream ( "9" , nb_chem , chem );
117 s[ 9] = new stream ( "10" , nb_chem , chem );
118 s[10] = new stream ( "back" , nb_chem , chem );
119 s[11] = new stream ( "12" , nb_chem , chem );
120 s[12] = new stream ( "stack" , nb_chem , chem );
121 s[13] = new stream ( "out-bz" , nb_chem , chem );
122 s[14] = new stream ( "out-sty" , nb_chem , chem );
123
124 // initial conditions on streams :
125 // -------------------------------
126 s[0]->P = 1.0;
127 s[0]->T = 298;
128 s[0]->set(list);
129
130 // units settings and calculation sequence :
131 // -----------------------------------------
132 units = new servor ( nb_u , nb_s , s );
133 safe = new string[nb_u];
134
135 units->type[ 0] = "mix";
136 units->name[ 0] = safe[ 0] = "mixfeed";
137 units->type[ 1] = "pump";
138 units->name[ 1] = safe[ 1] = "pump";
139 units->type[ 2] = "heatx";
140 units->name[ 2] = safe[ 2] = "heater";
141 units->type[ 3] = "reactor";
142 units->name[ 3] = safe[ 3] = "pfr";
143 units->type[ 4] = "heatx";
144 units->name[ 4] = safe[ 4] = "cooler";
145 units->type[ 5] = "flash";
146 units->name[ 5] = safe[ 5] = "degasor";
147 units->type[ 6] = "column";
148 units->name[ 6] = safe[ 6] = "sep-sty";
149 units->type[ 7] = "split";
150 units->name[ 7] = safe[ 7] = "spliter";
151 units->type[ 8] = "column";
152 units->name[ 8] = safe[ 8] = "sep-bz";
153 units->type[ 9] = "loop";
154 units->name[ 9] = safe[ 9] = "looping";
155 units->type[10] = "burner";
156 units->name[10] = safe[10] = "fire";
157
158
159 // executing the calculation sequence :
160 //-------------------------------------
161 double y[14];
162 y[7] = y[8] = 1000.0;
163
164 if (!units->solve_process(x,y))
165 goto TERMINATE;
166
167 // on recupere les resultats :
168 // ---------------------------
169 y[6] = s[0]->m;
170 y[3] = s[13]->m;
171 y[2] = s[13]->chem[4]->m;
172 y[1] = s[14]->m;
173 y[0] = s[14]->chem[6]->m;
174
175 y[9 ] = 1e20;
176 y[10] = 1e20;
177 y[11] = units->get_costs_sum() * 6.192;
178 y[12] = 1e20;
179 y[13] = 1e20;
180
181 // arrondis :
182 if (ARRONDI) {
183 y[ 6] = arrondi ( y[ 6] , 4 );
184 y[ 3] = arrondi ( y[ 3] , 4 );
185 y[ 2] = arrondi ( y[ 2] , 4 );
186 y[ 1] = arrondi ( y[ 1] , 4 );
187 y[ 0] = arrondi ( y[ 0] , 4 );
188 y[11] = arrondi ( y[11] , 6 );
189 }
190
191 g0 = ( y[0] > 0 && y[0] < 1e+20 ) ? 0.0 : 1e20;
192 g1 = ( y[4] <= 80 ) ? 0.0 : 1.0;
193 g2 = ( y[5] <= 80 ) ? 0.0 : 1.0;
194 g3 = ( y[7] <= 200 && y[8] <= 8 ) ? 0.0 : 1.0;
195 g4 = ( y[1] > 0 && y[1] < 1e20 ) ? (0.99-y[0]/y[1])/0.99 : 1e20;
196 g5 = ( y[3] > 0 && y[3] < 1e20 ) ? (0.99-y[2]/y[3])/0.99 : 1e20;
197 g6 = ( y[6] > 0 && y[6] < 1e20 ) ? (0.6-y[0]/y[6])/0.6 : 1e20;
198
199
200 // bloc econo :
201 // ------------
202
203 // raw_cost :
204 raw_cost = 0.0;
205 if ( s[0]->m > EPS ) {
206 if ( s[0]->chem[6]->m > EPS ) {
207 d = (ARRONDI) ? arrondi ( s[0]->chem[6]->m , 4 ) : s[0]->chem[6]->m;
208 raw_cost += d * 1.39;
209 }
210 if ( s[0]->chem[2]->m > EPS ) {
211 d = (ARRONDI) ? arrondi ( s[0]->chem[2]->m , 4 ) : s[0]->chem[2]->m;
212 raw_cost += d * 0.64;
213 }
214 if ( s[0]->chem[0]->m > EPS ) {
215 d = (ARRONDI) ? arrondi ( s[0]->chem[0]->m , 4 ) : s[0]->chem[0]->m;
216 raw_cost += d * 0.11;
217 }
218 if ( s[0]->chem[4]->m > EPS ) {
219 d = (ARRONDI) ? arrondi ( s[0]->chem[4]->m , 4 ) : s[0]->chem[4]->m;
220 raw_cost += d * 1.19;
221 }
222 }
223 // raw_cost = raw_cost*3600.0*nb_h*nb_d :
224 raw_cost *= 25920000;
225
226 // util_cost :
227 util_cost = (units->get_power_sum() * 0.000125 + units->get_water_sum() * 0.00008) * 25920000;
228
229 // Coper :
230 Itot = y[11];
231 Coper = 0.16 * Itot + 2.26 * raw_cost + util_cost;
232
233
234 // Rtot :
235 Rtot = 0.0;
236 for ( i_stream = 13 ; i_stream < 15 ; i_stream++ ) {
237 i_chem = 0;
238 max = 0.0;
239 mtot = 0.0;
240 for ( i = 0 ; i < nb_chem ; i++ ) {
241 m = (ARRONDI) ? arrondi ( s[i_stream]->chem[i]->m , 4 ) : s[i_stream]->chem[i]->m;
242
243 if ( m > EPS ) {
244 mtot += m;
245 if ( m > max ) {
246 max = m;
247 i_chem = i;
248 }
249 }
250 }
251 if (mtot > EPS ) {
252 purity = max/mtot;
253 d = price[i_chem] * max;
254 if ( purity < 0.5 )
255 d = 0.0;
256 else if ( purity < 0.6 )
257 d *= 0.05;
258 else if ( purity < 0.7 )
259 d *= 0.1;
260 else if ( purity < 0.8 )
261 d *= 0.15;
262 else if ( purity < 0.9 )
263 d *= 0.3;
264 else if ( purity < 0.95 )
265 d *= 0.5;
266 else if ( purity < 0.98 )
267 d *= 0.6;
268 else if ( purity < 0.99 )
269 d *= 0.8;
270 else if ( purity > 0.995 )
271 d *= 1.1;
272 Rtot += d*25920000;
273 }
274 }
275
276 // cash flows :
277 F = new cashflow(15);
278 F->set_rates(0.1,0.4);
279 F->set_basics(Itot, Coper, Rtot);
280 OK = F->run();
281
282 // calculating profitability indicators :
283 if(OK) {
284 P = new profitability(F);
285 OK = P->run(y);
286 delete P;
287 }
288
289 delete F;
290
291 // arrondis :
292 if (ARRONDI) {
293 y[12] = round(y[12]);
294 y[13] = round(y[13]);
295 y[ 9] = round(y[ 9]*10)/10.0;
296 y[10] = round(y[10]*10)/10.0;
297 }
298
299 g7 = ( y[ 9] < 1e20 ) ? ( y[9] - 4.0 ) / 4.0 : 1e20;
300 g8 = ( y[10] < 1e20 ) ? (0.2-y[10])/0.2 : 1e20;
301 g9 = ( y[11] < 1e20 ) ? (y[11]-10e6)/10e6 : 1e20;
302 g10 = ( y[12] > 0 && y[12] < 1e20 ) ? (y[12]-15e6) / 15e6 : 1e20;
303
304 f = ( y[13] > 0 && y[13] < 1e20 ) ? -y[13] : 1e20;
305
306 // cout << setprecision(10);
307 // cout << "\n\n";
308 // for ( int i = 0 ; i < 14 ; i++ )
309 // cout << "y[" << i << "] = " << y[i] << endl;
310
311
312 // menage et affichage du resultat de la boite noire :
313 TERMINATE:
314
315 // cout << "\n\n";
316 // cout << " g0 = " << g0 << endl
317 // << " g1 = " << g1 << endl
318 // << " g2 = " << g2 << endl
319 // << " g3 = " << g3 << endl
320 // << " g4 = " << g4 << endl
321 // << " g5 = " << g5 << endl
322 // << " g6 = " << g6 << endl
323 // << " g7 = " << g7 << endl
324 // << " g8 = " << g8 << endl
325 // << " g9 = " << g9 << endl
326 // << "g10 = " << g10 << endl
327 // << " f = " << f << endl;
328
329
330 cout << g0 << " "
331 << g1 << " "
332 << g2 << " "
333 << g3 << " "
334 << g4 << " "
335 << g5 << " "
336 << g6 << " "
337 << g7 << " "
338 << g8 << " "
339 << g9 << " "
340 << g10 << " "
341 << f << endl;
342
343 if (units)
344 delete units;
345 if (safe)
346 delete [] safe;
347
348 if (chem) {
349 for ( i = 0 ; i < nb_chem ; i++ )
350 delete chem[i];
351 delete [] chem;
352 }
353
354 if (s) {
355 for ( i = 0 ; i < nb_s ; i++ )
356 delete s[i];
357 delete [] s;
358 }
359
360 return 0;
361 }
362