1 #include "chemical.hpp"
2 using namespace std;
3 
check_error(void)4 void chemical::check_error ( void ) {
5   if (error>MAX_ERROR) {
6     cout << "ERROR 2\n\n";
7     exit(0);
8   }
9   if (warning>MAX_WARNING) {
10     cout << "ERROR 3\n\n";
11     exit(0);
12   }
13 }
14 
15 // copy-constr. :
chemical(const chemical & chem)16 chemical::chemical ( const chemical & chem ) {
17 
18   CAS           = chem.CAS;
19   name          = chem.name;
20   M             = chem.M;
21 
22   state         = chem.state;
23   Tm            = chem.Tm;
24   Tb            = chem.Tb;
25   Tc            = chem.Tc;
26   Pc            = chem.Pc;
27   Ho            = chem.Ho;
28   rho_liq       = chem.rho_liq;
29   dHvap         = chem.dHvap;
30 
31   mu_param[0]   = chem.mu_param[0];
32   mu_param[1]   = chem.mu_param[1];
33   Cp_param[0]   = chem.Cp_param[0];
34   Cp_param[1]   = chem.Cp_param[1];
35   Cp_param[2]   = chem.Cp_param[2];
36   Cp_param[3]   = chem.Cp_param[3];
37   Cp_liq        = chem.Cp_liq;
38   Psat_param[0] = chem.Psat_param[0];
39   Psat_param[1] = chem.Psat_param[1];
40   Psat_param[2] = chem.Psat_param[2];
41 
42   thermo = new thermolib();
43   thermo->send(Pc,Tc, omega());
44 
45   P = chem.P;
46   T = chem.T;
47   m = chem.m;
48   v = chem.v;
49 
50   warning = chem.warning;
51   error   = chem.error;
52   tmp     = chem.tmp;
53 }
54 
chemical(const string & chem_name)55 chemical::chemical ( const string & chem_name ) {
56 
57   CAS = chem_name;
58 
59 	// C. Tribes add initialization for more robustness (variables may be initialized uncorrectly dependent on the execution)
60 	P=T=m=v=0.0;
61 
62   // 1/12 :
63   if (CAS=="100-41-4") {
64     name = "ethylbenzene";
65     M = 106.17;
66     state = 0;
67     Tm = 178.2;
68     Tb = 409.3;
69     Tc = 617.1;
70     Pc = 35.6;
71     Ho = 29.79;
72     rho_liq = 867.0;
73     dHvap = 35.56;
74     mu_param[0] = 472.82;
75     mu_param[1] = 264.22;
76     Cp_param[0] = -43.069;
77     Cp_param[1] = 7.067e-01;
78     Cp_param[2] = -4.807e-04;
79     Cp_param[3] = 1.30e-07;
80     Cp_liq = 190.23;
81     Psat_param[0] = 16.0195;
82     Psat_param[1] = 3279.47;
83     Psat_param[2] = -59.95;
84   }
85 
86   // 2/12 :
87   else if (CAS=="1333-74-0") {
88     name = "hydrogen";
89     M = 2.02;
90     state = 1;
91     Tm = 14.0;
92     Tb = 20.4;
93     Tc = 33.2;
94     Pc = 12.8;
95     Ho = 0.0;
96     rho_liq = 71.0;
97     dHvap = 0.9;
98     mu_param[0] = 13.82;
99     mu_param[1] = 5.39;
100     Cp_param[0] = 27.124;
101     Cp_param[1] = 9.267e-03;
102     Cp_param[2] = -1.380e-05;
103     Cp_param[3] = 7.64e-09;
104     Cp_liq = 0.0;
105     Psat_param[0] = 13.6333;
106     Psat_param[1] = 164.90;
107     Psat_param[2] = 3.19;
108   }
109 
110   // 3/12 :
111   else if (CAS=="108-88-3") {
112     name = "toluene";
113     M =92.14;
114     state = 0;
115     Tm = 178.0;
116     Tb = 383.8;
117     Tc = 591.7;
118     Pc = 40.6;
119     Ho = 50.0;
120     rho_liq = 867;
121     dHvap = 33.18;
122     mu_param[0] = 467.33;
123     mu_param[1] = 255.24;
124     Cp_param[0] = -24.338;
125     Cp_param[1] = 5.121e-1;
126     Cp_param[2] = -2.763e-4;
127     Cp_param[3] = 4.91e-8;
128     Cp_liq      = 159.85;
129     Psat_param[0] = 16.0137;
130     Psat_param[1] = 3096.52;
131     Psat_param[2] = -53.67;
132   }
133 
134   // 4/12 :
135   else if (CAS=="74-82-8") {
136     name = "methane";
137     M =16.04;
138     state =1;
139     Tm = 90.7;
140     Tb = 111.7;
141     Tc = 190.6;
142     Pc = 45.4;
143     Ho = -74.85;
144     rho_liq = 425;
145     dHvap = 8.18;
146     mu_param[0] = 114.14;
147     mu_param[1] = 57.60;
148     Cp_param[0] = 19.238;
149     Cp_param[1] = 5.209e-02;
150     Cp_param[2] = 1.197e-05;
151     Cp_param[3] = -1.13e-08;
152     Cp_liq      = 0.0;
153     Psat_param[0] = 15.2243;
154     Psat_param[1] = 897.84;
155     Psat_param[2] = -7.16;
156   }
157 
158   // 5/12 :
159   else if (CAS=="71-43-2") {
160     name = "benzene";
161     M = 78.11;
162     state = 0;
163     Tm = 278.7;
164     Tb = 353.3;
165     Tc = 562.1;
166     Pc = 48.3;
167     Ho = 82.93;
168     rho_liq = 885;
169     dHvap = 30.76;
170     mu_param[0] = 545.64;
171     mu_param[1] = 265.24;
172     Cp_param[0] = 33.894;
173     Cp_param[1] = 4.74e-1;
174     Cp_param[2] = -3.015e-4;
175     Cp_param[3] = 7.13e-8;
176     Cp_liq      = 116.03;
177     Psat_param[0] = 15.9008;
178     Psat_param[1] = 2788.51;
179     Psat_param[2] = -52.36;
180   }
181 
182   // 6/12 :
183   else if (CAS=="74-85-1") {
184     name = "ethylene";
185     M = 28.05;
186     state =1;
187     Tm = 104.0;
188     Tb = 169.4;
189     Tc = 282.4;
190     Pc = 49.7;
191     Ho =52.3;
192     rho_liq = 577.0;
193     dHvap = 13.54;
194     mu_param[0] = 168.98;
195     mu_param[1] = 93.94;
196     Cp_param[0] = 3.803;
197     Cp_param[1] = 1.565e-01;
198     Cp_param[2] = -8.343e-05;
199     Cp_param[3] = 1.75e-08;
200     Cp_liq      = 0.0;
201     Psat_param[0] =15.5368;
202     Psat_param[1] = 1347.01;
203     Psat_param[2] = -18.15;
204   }
205 
206   // 7/12 :
207   else if (CAS=="100-42-5") {
208     name = "styrene";
209     M =104.15;
210     state = 0;
211     Tm = 242.5;
212     Tb = 418.3;
213     Tc =647.0;
214     Pc =39.4;
215     Ho =147.36;
216     rho_liq =906.0;
217     dHvap = 36.82;
218     mu_param[0] = 528.64;
219     mu_param[1] = 276.71;
220     Cp_param[0] =-28.229;
221     Cp_param[1] =6.155e-01;
222     Cp_param[2] = -4.020e-04;
223     Cp_param[3] = 9.93e-08;
224     Cp_liq      =166.13;
225     Psat_param[0] = 16.0193;
226     Psat_param[1] = 3328.57;
227     Psat_param[2] =-63.72;
228   }
229 
230   // 8/12 :
231   else if (CAS=="7782-44-7") {
232     name = "oxygen";
233     M = 32.00;
234     state = 1;
235     Tm = 54.4;
236     Tb = 90.2;
237     Tc = 154.6;
238     Pc = 49.8;
239     Ho =0.0 ;
240     rho_liq =1149.1 ;
241     dHvap =6.82 ;
242     mu_param[0] = 85.68;
243     mu_param[1] =  51.50;
244     Cp_param[0] = 28.087;
245     Cp_param[1] = -3.678e-06 ;
246     Cp_param[2] = 1.745e-05;
247     Cp_param[3] = -1.06e-08;
248     Cp_liq      =0.0 ;
249     Psat_param[0] = 15.4075;
250     Psat_param[1] =  734.55 ;
251     Psat_param[2] =-6.45 ;
252   }
253 
254   // 9/12 :
255   else if (CAS=="7727-37-9") {
256     name = "nitrogen";
257     M = 28.01;
258     state = 1;
259     Tm = 63.3;
260     Tb = 77.4;
261     Tc =  126.2;
262     Pc =  33.5;
263     Ho = 0.0;
264     rho_liq = 804.0;
265     dHvap = 5.58;
266     mu_param[0] = 90.30;
267     mu_param[1] = 46.41;
268     Cp_param[0] = 31.128;
269     Cp_param[1] = -1.356e-02 ;
270     Cp_param[2] = 2.678e-05;
271     Cp_param[3] =-1.17e-08 ;
272     Cp_liq      = 0.0;
273     Psat_param[0] = 14.9342;
274     Psat_param[1] =  588.72;
275     Psat_param[2] = -6.60;
276   }
277 
278   // 10/12 :
279   else if (CAS=="124-38-9") {
280     name = "carbon-dioxide";
281     M =44.01;
282     state = 1;
283     Tm = 216.6;
284     Tb = 194.4;
285     Tc = 304.2;
286     Pc =  72.8;
287     Ho =  -393.41;
288     rho_liq = 777.0;
289     dHvap = 17.15;
290     mu_param[0] = 578.08;
291     mu_param[1] = 185.24 ;
292     Cp_param[0] = 19.782;
293     Cp_param[1] = 7.339e-02;
294     Cp_param[2] = -5.598e-05;
295     Cp_param[3] = 1.71e-08;
296     Cp_liq      = 0.0;
297     Psat_param[0] = 22.5898;
298     Psat_param[1] =3103.39 ;
299     Psat_param[2] =  -0.16;
300   }
301 
302   // 11/12 :
303   else if (CAS=="7732-18-5") {
304     name = "water";
305     M =18.02;
306     state = 0;
307     Tm = 273.15;
308     Tb = 373.15;
309     Tc = 647.4;
310     Pc = 217.6;
311     Ho = -241.83;
312     rho_liq = 998 ;
313     dHvap = 40.66;
314     mu_param[0] = 658.25;
315     mu_param[1] = 283.16;
316     Cp_param[0] = 32.220;
317     Cp_param[1] = 1.923e-03 ;
318     Cp_param[2] = 1.055e-05;
319     Cp_param[3] = -3.59e-09;
320     Cp_liq      = 75.24;
321     Psat_param[0] = 18.3036;
322     Psat_param[1] = 3816.44;
323     Psat_param[2] = -46.13;
324   }
325 
326   // 12/12 :
327   else if (CAS=="64-17-5") {
328     name = "ethanol";
329     M =46.07;
330     state =0 ;
331     Tm =159.1 ;
332     Tb = 351.5;
333     Tc =  516.2;
334     Pc =63.0 ;
335     Ho =  -234.8;
336     rho_liq = 789.0;
337     dHvap =38.74 ;
338     mu_param[0] = 686.64;
339     mu_param[1] = 300.88;
340     Cp_param[0] = 9.008;
341     Cp_param[1] =  2.139e-01;
342     Cp_param[2] = -8.385e-05 ;
343     Cp_param[3] =  1.37e-09;
344     Cp_liq      = 2.22;
345     Psat_param[0] = 18.9119;
346     Psat_param[1] =  3803.98;
347     Psat_param[2] = -41.68;
348   }
349 
350   else {
351     cout << "ERROR 1\n\n";
352     exit(0);
353   }
354 
355   thermo = new thermolib();
356   thermo->send(Pc,Tc, omega());
357 
358 
359 }
360 
K()361 double chemical::K()
362 {
363       thermo->set(P,T,v,n());
364       return thermo->K();
365 }
366 
mu()367 double chemical::mu()
368 {
369 	// Returns the fluid's viscosity in Pa.s
370    if (Tm<=T && T<=Tboil(P))
371       return pow(10,(mu_param[0]*(1.0/T-1.0/mu_param[1])-3));
372    else
373    {
374 	   ofstream logf;
375       logf.open(MESSAGES, ios::app);
376       logf<<"   --> Warning <--  Cannot compute viscosity of "<<name<<".\n";
377       logf.close();
378       warning++;
379       check_error();
380       return 1.0;
381    }
382 }
383 
rho()384 double chemical::rho()
385 {
386 	// Returns the fluid's density in kg/m3, wether it's liquid or gas
387    if(state==0) tmp= rho_liq;
388    if(state==1)
389    {
390       find_v();
391       if (v>EPS) tmp= m/v;
392       else tmp= 0.0;
393    }
394    return  tmp;
395 }
396 
Cp()397 double chemical::Cp() {
398   // cout<<endl<<"Cp de "<<name<<" a "<<T;
399   // Returns the fluid's Cp in J/mol.K
400   if(state==0) {
401 
402     // tmp = Cp_liq;  // BUG : boucle infinie !!!
403     return Cp_liq; // SEB
404 
405   }
406   if(state==1 || T>Tboil(P)) {
407     tmp=0;
408     for (int i=0;i<4;i++)
409       tmp+=Cp_param[i]*pow(T,i);
410   }
411   else {
412     T=Tb;
413 
414     tmp = Cp(); // ici boucle infinie si state==0 !!!
415 
416   }
417   return tmp;
418 }
419 
Cp(bool q)420 double chemical::Cp(bool q)
421 {
422 	// Returns the fluid's Cp in J/mol.K
423    if(q==0) tmp=Cp_liq;
424    if(q==1)
425    {
426    	   tmp=0;
427       for (int i=0;i<4;i++) tmp+=Cp_param[i]*pow(T,i);
428    }
429    return tmp;
430 }
431 
Psat()432 double chemical::Psat()
433 {
434    // Returns the fluid's vapor pressure in atm, using Antoine's equation
435    if(Tm<=T && T<=Tc)
436       return (exp(Psat_param[0]-Psat_param[1]/(T+Psat_param[2]))/760.01);
437    else
438    {
439 
440       return Psat(Tb);
441    }
442 }
Psat(double t)443 double chemical::Psat(double t)
444 {
445    // Returns the fluid's vapor pressure in atm, using Antoine's equation
446       return (exp(Psat_param[0]-Psat_param[1]/(t+Psat_param[2]))/760.01);
447 }
448 
dH(double T1,double T2,double pres)449 double chemical::dH(double T1,double T2, double pres)
450 {
451    //Enthalpy variation in kJ/mol. Does not affect any attributes of current object.
452    double energy=0, TT=Tboil(pres), vap=Hvap(TT);
453    int sign=1, i;
454    if (T2<T1) {sign = -1; energy=T1; T1=T2; T2=energy; energy=0;}
455    if (T1==T2) energy = 0.0;
456    if (T2<TT) energy = Cp_liq*(T2-T1)/1000;
457    if (TT<T1) for (i=1;i<=4;i++) energy+=Cp_param[i-1]*(pow(T2,i)-pow(T1,i))/i/1000;
458    if(T1<=TT && TT<=T2)
459    {
460       energy=Cp_liq*(TT-T1)/1000;
461       energy+=vap;
462       for (i=1;i<=4;i++) energy+=Cp_param[i-1]*(pow(T2,i)-pow(TT,i))/i/1000;
463    }
464    return energy*sign;
465 }
466 
find_T()467 void chemical::find_T()
468 {
469    if(n()>EPS && P>EPS)
470    {
471       thermo->set(P,T,v,n());
472       T=thermo->T();
473    }
474    else
475    {
476 	   ofstream logf;
477       logf.open(MESSAGES, ios::app);
478       logf<<"   --> Warning <--  Cannot find T of "<<name<<".\n";
479       logf.close();
480       warning++;
481    }
482    check_error();
483 }
484 
find_P()485 void chemical::find_P()
486 {
487    if(n()>EPS && T>EPS)
488    {
489       thermo->set(P,T,v,n());
490       P=thermo->P();
491    }
492    else
493    {
494 	   ofstream logf;
495       logf.open(MESSAGES, ios::app);
496       logf<<"   --> Warning <--  Cannot find P of "<<name<<".\n";
497       logf.close();
498       warning++;
499    }
500    check_error();
501 }
502 
find_v()503 void chemical::find_v()
504 {
505 
506    if(state==0) v=m/rho_liq;
507    if(state==1 && P>EPS && T>EPS && m>EPS)
508    {
509       thermo->set(P,T,v,n());
510       v=thermo->v();
511    }
512 }
513 
find_state()514 void chemical::find_state()
515 {
516    ofstream logf;
517    if (T>Tc || P>Pc) state = 1;      //T or P is bigger than Tc or Pc
518    if (T<=Tm)                         //T is smaller than melting point
519    {
520 	   ofstream logf;
521       logf.open(MESSAGES, ios::app);
522       logf<<"   --> Warning <--  The chemical "<<name<<" is solid.\n";
523       logf.close();
524       warning++;
525    }
526    check_error();
527    if (T<Tboil(P)) state=0;
528    else state=1;
529 }
530