File: RELATIVE:/../../../mfix.git/model/chem/stiff_chem_rrates.f
1
2
3
4
5
6
7
8
9
10
11
12 SUBROUTINE STIFF_CHEM_RRATES(lNEQ, lTime, Y, YDOT)
13
14
15
16 use stiff_chem_maps, only: mapODEtoMFIX
17
18
19
20
21 use param, only: DIMENSION_M
22
23 use param, only: DIMENSION_N_g
24
25 use param, only: DIMENSION_N_s
26
27 use param1, only: ZERO
28
29
30
31
32 use physprop, only: MMAX
33
34 use physprop, only: NMAX
35
36
37
38
39 use fldvar, only: T_g
40
41 use fldvar, only: X_g
42
43 use fldvar, only: ROP_g
44
45 use physprop, only: C_pg
46
47
48
49
50 use fldvar, only: T_s
51
52 use fldvar, only: X_s
53
54 use fldvar, only: ROP_s
55
56 use physprop, only: C_ps
57
58 use rxns, only: REACTION
59 use rxns, only: NO_OF_RXNS
60
61 use run, only: UNITS
62
63 use stiff_chem, only: ODE_DIMN_all
64 use stiff_chem, only: NEQ_DIMN
65
66 implicit none
67
68
69
70
71
72 INTEGER, intent(in) :: lNEQ(NEQ_DIMN)
73
74 DOUBLE PRECISION, intent(in) :: lTime
75
76 DOUBLE PRECISION, dimension(ODE_DIMN_all), intent(in) :: Y
77
78 DOUBLE PRECISION, dimension(ODE_DIMN_all), intent(out) :: YDOT
79
80
81
82 INTEGER :: IJK
83 INTEGER :: H
84 INTEGER :: L, M
85 INTEGER :: N
86 INTEGER :: lN
87 INTEGER :: mXfr
88 INTEGER :: Node
89
90
91 DOUBLE PRECISION :: RATES(NO_OF_RXNS)
92
93 DOUBLE PRECISION :: lRate
94
95
96 DOUBLE PRECISION :: lRg(DIMENSION_N_g)
97
98
99 DOUBLE PRECISION :: rRg(DIMENSION_N_g)
100
101 DOUBLE PRECISION :: rHORg
102
103 DOUBLE PRECISION :: lHORg
104
105
106 DOUBLE PRECISION :: lRs(DIMENSION_M, DIMENSION_N_s)
107
108
109 DOUBLE PRECISION :: rRs(DIMENSION_M, DIMENSION_N_s)
110
111 DOUBLE PRECISION :: rHORs(DIMENSION_M)
112
113 DOUBLE PRECISION :: lHORs(DIMENSION_M)
114
115 DOUBLE PRECISION :: RxH(0:DIMENSION_M, 0:DIMENSION_M)
116
117
118 DOUBLE PRECISION :: sumlRg
119
120 DOUBLE PRECISION :: sumlRs(DIMENSION_M)
121
122
123 DOUBLE PRECISION, parameter :: speciesLimiter = 1.0d-7
124
125
126 LOGICAL, external :: COMPARE
127 DOUBLE PRECISION, external :: CALC_H
128
129
130 external USR_RATES
131
132
133 = lNEQ(2)
134 RATES = ZERO
135 YDOT = ZERO
136
137 lRg = ZERO; lHORg = ZERO
138 lRs = ZERO; lHORs = ZERO
139
140
141 CALL mapODEtoMFIX(NEQ_DIMN, lNEQ, ODE_DIMN_all, Y)
142
143
144 CALL USR_RATES(IJK, RATES)
145
146
147 RXN_LP: DO H = 1, NO_OF_RXNS
148
149
150 IF(Reaction(H)%nSpecies == 0) CYCLE RXN_LP
151
152
153 = ZERO; rHORg = ZERO
154 rRs = ZERO; rHORs = ZERO
155 RxH = ZERO
156
157
158
159 DO lN = 1, Reaction(H)%nSpecies
160
161 = Reaction(H)%Species(lN)%pMap
162
163 = Reaction(H)%Species(lN)%sMap
164
165
166
167 = Reaction(H)%Species(lN)%mXfr
168 lRate = RATES(H) * Reaction(H)%Species(lN)%MWxStoich
169
170 IF(M == 0) THEN
171
172 IF(lRate < ZERO) THEN
173
174 IF(X_g(IJK,N) > speciesLimiter) THEN
175 rRg(N) = rRg(N) + lRate
176
177 IF(M /= mXfr) RxH(M,mXfr) = RxH(M,mXfr) + &
178 lRate * CALC_H(T_G(IJK),0,N)
179 ELSE
180
181 CYCLE RXN_LP
182 ENDIF
183 ELSE
184
185 (N) = rRg(N) + lRate
186
187 IF(M /= mXfr) RxH(M,mXfr) = RxH(M,mXfr) + &
188 lRate * CALC_H(T_s(IJK,mXfr),0,N)
189 ENDIF
190
191 ELSE
192
193 IF(lRate < ZERO) THEN
194 IF(X_s(IJK,M,N) > speciesLimiter) THEN
195 rRs(M,N) = rRs(M,N) + lRate
196
197
198 IF(M /= mXfr) THEN
199 IF(M < mXfr) THEN
200 RxH(M,mXfr) = RxH(M,mXfr) + &
201 lRate * CALC_H(T_s(IJK,M),M,N) * &
202 Reaction(H)%Species(lN)%xXfr
203 ELSE
204 RxH(mXfr,M) = RxH(mXfr,M) - &
205 lRate * CALC_H(T_s(IJK,M),M,N) * &
206 Reaction(H)%Species(lN)%xXfr
207 ENDIF
208 ENDIF
209 ELSE
210
211 CYCLE RXN_LP
212 ENDIF
213 ELSE
214
215 (M,N) = rRs(M,N) + lRate
216 ENDIF
217 ENDIF
218 ENDDO
219
220
221
222
223 = lRg + rRg
224 lRs = lRs + rRs
225
226
227
228
229 IF(Reaction(H)%Calc_DH) THEN
230
231 DO lN = 1, Reaction(H)%nSpecies
232
233 = Reaction(H)%Species(lN)%pMap
234
235 = Reaction(H)%Species(lN)%sMap
236
237 = RATES(H) * Reaction(H)%Species(lN)%MWxStoich
238
239 IF(M == 0) THEN
240 rHORg = rHORg + lRate * CALC_H(T_g(IJK),0,N)
241
242 ELSE
243 rHORs(M) = rHORs(M) + lRate * CALC_H(T_s(IJK,M),M,N)
244 ENDIF
245 ENDDO
246
247
248 DO M=1, MMAX
249 DO L=0, M-1
250 RxH(M,L) = - RxH(L,M)
251 ENDDO
252 ENDDO
253
254
255 DO L=0, MMAX
256 DO M = 0, MMAX
257 IF(L == M) CYCLE
258 IF(L == 0) THEN
259 rHORg = rHORg - RxH(L,M)
260 ELSE
261 rHORs(L) = rHORs(L) - RxH(L,M)
262 ENDIF
263 ENDDO
264 ENDDO
265
266
267
268 IF(UNITS == 'SI') THEN
269 lHORg = lHORg + 4.183925d3*rHORg
270 DO M=1,MMAX
271 lHORs(M) = lHORs(M) + 4.183925d3*rHORs(M)
272 ENDDO
273 ELSE
274 lHORg = lHORg + rHORg
275 DO M=1,MMAX
276 lHORs(M) = lHORs(M) + rHORs(M)
277 ENDDO
278 ENDIF
279 ELSE
280
281 = lHORg + Reaction(H)%HoR(0) * RATES(H)
282 DO M=1, MMAX
283 lHORs(M) = lHORs(M) + Reaction(H)%HoR(M) * RATES(H)
284 ENDDO
285 ENDIF
286
287 ENDDO RXN_LP
288
289
290
291
292
293
294
295
296 = sum(lRg)
297
298
299 = 0.0d0
300 DO M=1, MMAX
301 IF(lNEQ(2+M) == 1) sumlRs(M) = sum(lRs(M,:))
302 ENDDO
303
304
305
306
307
308 = 1
309
310
311 (Node) = sumlRg
312 Node = Node + 1
313
314
315 (Node) = -lHORg/(ROP_g(IJK)*C_pg(IJK))
316 Node = Node + 1
317
318
319 DO N=1,NMAX(0)
320 YDOT(Node) = (lRg(N) - X_g(IJK,N)*sumlRg)/(ROP_g(IJK))
321 Node = Node + 1
322 ENDDO
323
324
325
326 DO M = 1, MMAX
327 IF(ROP_s(IJK,M) > 1.0d-8) THEN
328 YDOT(Node) = -lHORs(M)/(ROP_s(IJK,M)*C_ps(IJK,M))
329 ELSE
330 YDOT(Node) = 0.0d0
331 ENDIF
332 Node = Node + 1
333 ENDDO
334
335
336 DO M = 1, MMAX
337 IF(lNEQ(2+M) == 1) THEN
338
339 (Node) = sumlRs(M)
340 Node = Node + 1
341
342 DO N=1, NMAX(M)
343 YDOT(Node) = (lRs(M,N) - X_s(IJK,M,N)*sumlRs(M)) / &
344 ROP_s(IJK,M)
345 Node = Node + 1
346 ENDDO
347 ENDIF
348 ENDDO
349
350 RETURN
351 END SUBROUTINE STIFF_CHEM_RRATES
352