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