1 #include "reaction.hpp"
2 using namespace std;
3
4
find_chemical(const string & chem_name) const5 int reaction::find_chemical ( const string & chem_name ) const {
6 for ( int i = 0 ; i < m ; i++ )
7 if ( list[i]->CAS == chem_name )
8 return i;
9 return -1;
10 }
11
12 // donnees hardcodees
reaction(const string & in1,int dim,chemical ** in2)13 reaction::reaction ( const string & in1 , int dim , chemical ** in2 ) {
14
15 m = dim; // nbre de chemicals
16 list = in2; // liste des chemicals
17
18 n = new double[m];
19 safe_n = new double[m];
20 safe_a = new double[m];
21 a = new double[m];
22
23 int i , j;
24 for ( i = 0 ; i < m ; i++ ) {
25 a[i]=0.0;
26 n[i]=0.0;
27 }
28
29 // 1/5 :
30 if ( in1 == "eb2sty" ) {
31 k0 = 3.525e5;
32 E = 90.85;
33 if ( (j = find_chemical ("100-41-4")) < 0 ) {
34 cout << "ERROR 10a\n\n";
35 exit(0);
36 }
37 a[j] = -1;
38 n[j] = 1;
39 if ( (j = find_chemical ("1333-74-0")) < 0 ) {
40 cout << "ERROR 10b\n\n";
41 exit(0);
42 }
43 a[j] = 1;
44 n[j] = 0;
45 if ( (j = find_chemical ("100-42-5")) < 0 ) {
46 cout << "ERROR 10c\n\n";
47 exit(0);
48 }
49 a[j] = 1;
50 n[j] = 0;
51 }
52
53 // 2/5 :
54 else if ( in1 == "sty2eb" ) {
55 k0 = 2.754e-4;
56 E = -18.653;
57 if ( (j = find_chemical ("100-41-4")) < 0 ) {
58 cout << "ERROR 10d\n\n";
59 exit(0);
60 }
61 a[j] = 1;
62 n[j] = 0;
63 if ( (j = find_chemical ("1333-74-0")) < 0 ) {
64 cout << "ERROR 10e\n\n";
65 exit(0);
66 }
67 a[j] = -1;
68 n[j] = 1;
69 if ( (j = find_chemical ("100-42-5")) < 0 ) {
70 cout << "ERROR 10f\n\n";
71 exit(0);
72 }
73 a[j] = -1;
74 n[j] = 1;
75 }
76
77 // 3/5 :
78 else if ( in1 == "eb2bz" ) {
79 k0 = 9.577e4;
80 E = 111.375;
81 if ( (j = find_chemical ("100-41-4")) < 0 ) {
82 cout << "ERROR 10g\n\n";
83 exit(0);
84 }
85 a[j] = -1;
86 n[j] = 1;
87 if ( (j = find_chemical ("71-43-2")) < 0 ) {
88 cout << "ERROR 10h\n\n";
89 exit(0);
90 }
91 a[j] = 1;
92 n[j] = 0;
93 if ( (j = find_chemical ("74-85-1")) < 0 ) {
94 cout << "ERROR 10i\n\n";
95 exit(0);
96 }
97 a[j] = 1;
98 n[j] = 0;
99 }
100
101 // 4/5 :
102 else if ( in1 == "eb2tol" ) {
103 k0 = 6.077e8;
104 E = 207.850;
105 if ( (j = find_chemical ("100-41-4")) < 0 ) {
106 cout << "ERROR 10j\n\n";
107 exit(0);
108 }
109 a[j] = -1;
110 n[j] = 1;
111 if ( (j = find_chemical ("1333-74-0")) < 0 ) {
112 cout << "ERROR 10k\n\n";
113 exit(0);
114 }
115 a[j] = -1;
116 n[j] = 1;
117 if ( (j = find_chemical ("108-88-3")) < 0 ) {
118 cout << "ERROR 10l\n\n";
119 exit(0);
120 }
121 a[j] = 1;
122 n[j] = 0;
123 if ( (j = find_chemical ("74-82-8")) < 0 ) {
124 cout << "ERROR 10m\n\n";
125 exit(0);
126 }
127 a[j] = 1;
128 n[j] = 0;
129 }
130
131 // 5/5 :
132 else if ( in1 == "tol2bz" ) {
133 k0 = 1;
134 E = 19.038;
135 if ( (j = find_chemical ("1333-74-0")) < 0 ) {
136 cout << "ERROR 10n\n\n";
137 exit(0);
138 }
139 a[j] = -1;
140 n[j] = 0.5;
141 if ( (j = find_chemical ("108-88-3")) < 0 ) {
142 cout << "ERROR 10o\n\n";
143 exit(0);
144 }
145 a[j] = -1;
146 n[j] = 1;
147 if ( (j = find_chemical ("71-43-2")) < 0 ) {
148 cout << "ERROR 10p\n\n";
149 exit(0);
150 }
151 a[j] = 1;
152 n[j] = 0;
153 if ( (j = find_chemical ("74-82-8")) < 0 ) {
154 cout << "ERROR 10q\n\n";
155 exit(0);
156 }
157 a[j] = 1;
158 n[j] = 0;
159 }
160 else {
161 cout << "ERROR 12\n\n";
162 exit(0);
163 }
164
165 for ( i = 0 ; i < m ; i++ ) {
166 safe_n[i]=n[i];
167 safe_a[i]=a[i];
168 }
169 }
170
~reaction()171 reaction::~reaction() {
172 delete [] a;
173 delete [] n;
174 delete [] safe_n;
175 delete [] safe_a;
176 }
177
dHr(double T)178 double reaction::dHr(double T)
179 {
180 int i , j;
181 for (i=0;i<m;i++)
182 if(safe_a[i]!=a[i])
183 {
184 if(a[i]>safe_a[i]) a[i]=safe_a[i];
185 else safe_a[i]=a[i];
186 }
187 double tmp=0.0;
188 for (i=0;i<m;i++) tmp += a[i]*list[i]->Ho;
189 if(fabs(T-298)>EPS)
190 for (i=0;i<m;i++)
191 for (j=1;j<=4;j++) tmp += a[i]*list[i]->Cp_param[j-1]*(pow(T,j)-pow(298.0,j))/j/1000.0;
192 return tmp;
193 }
194
rate(double T,double * C)195 double reaction::rate(double T, double* C)
196 {
197 double tmp = k0*exp(-1000*E/8.3144/T);
198 for ( int i=0;i<m;i++)
199 {
200 if(safe_n[i]!=n[i]) n[i]=safe_n[i];
201 if(C[i]>EPS && fabs(n[i])>EPS) tmp *= pow(C[i], n[i]);
202 }
203 return tmp;
204 }
205