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