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