File: /nfs/home/0/users/jenkins/mfix.git/model/chem/stiff_chem_stats_mod.f
1
2
3
4
5
6
7
8
9
10
11
12 MODULE STIFF_CHEM_STATS
13
14 PRIVATE
15
16
17
18 PUBLIC :: failedCount
19
20
21
22
23 PUBLIC :: ALLOCATE_STIFF_CHEM_STATS
24
25 PUBLIC :: INIT_STIFF_CHEM_STATS
26 PUBLIC :: UPDATE_STIFF_CHEM_STATS
27 PUBLIC :: WRITE_STIFF_CHEM_STATS
28
29
30
31 LOGICAL, external :: COMPARE
32
33
34
35
36
37 INTEGER, parameter :: reportNST_Freq = 10
38
39
40
41
42 INTEGER :: reportNST
43
44 INTEGER :: failedCount_total
45 INTEGER :: countINCPT_total
46
47
48
49
50
51
52 INTEGER, allocatable :: minNST(:)
53 INTEGER, allocatable :: minNST_all(:)
54
55
56 INTEGER, allocatable :: maxNST(:)
57 INTEGER, allocatable :: maxNST_all(:)
58
59
60
61 INTEGER, allocatable :: countNST(:)
62 INTEGER, allocatable :: countNST_all(:)
63
64
65 INTEGER, allocatable :: Homogns(:)
66 INTEGER, allocatable :: Homogns_all(:)
67
68
69
70 INTEGER, allocatable :: Hetrgns(:)
71 INTEGER, allocatable :: Hetrgns_all(:)
72
73
74 INTEGER, allocatable :: failedCount(:)
75 INTEGER, allocatable :: failedCount_all(:)
76
77
78 INTEGER, allocatable :: maxAttempts(:)
79 INTEGER, allocatable :: maxAttempts_all(:)
80
81
82 INTEGER, allocatable :: countINCPT(:)
83 INTEGER, allocatable :: countINCPT_all(:)
84
85 DOUBLE PRECISION :: ODE_StartTime
86
87 contains
88
89
90
91
92
93
94
95
96
97
98
99
100
101 SUBROUTINE ALLOCATE_STIFF_CHEM_STATS
102
103 use compar, only: myPE
104 use compar, only: numPEs
105 use output, only: FULL_LOG
106
107 implicit none
108
109 reportNST = 1
110 failedCount_total = 0
111 countINCPT_total = 0
112
113
114 allocate( failedCount(0:numPEs-1) ); failedCount = 0
115 allocate( failedCount_all(0:numPEs-1) )
116
117 if(.NOT.FULL_LOG) return
118
119
120 allocate( minNST(0:numPEs-1)); minNST = 0
121 allocate( minNST_all(0:numPEs-1) )
122 (myPE) = 5000
123
124
125 allocate( maxNST(0:numPEs-1) ); maxNST = 0
126 allocate( maxNST_all(0:numPEs-1) )
127
128
129
130 allocate( countNST(5) ); IF(reportNST==1) countNST = 0
131 allocate( countNST_all(5) )
132
133
134 allocate( Homogns(0:numPEs-1) ); Homogns = 0
135 allocate( Homogns_all(0:numPEs-1) )
136
137
138
139 allocate( Hetrgns(0:numPEs-1) ); Hetrgns = 0;
140 allocate( Hetrgns_all(0:numPEs-1) )
141
142
143 allocate( maxAttempts(0:numPEs-1) ); maxAttempts = 0
144 allocate( maxAttempts_all(0:numPEs-1) )
145
146
147
148 allocate( countINCPT(0:numPEs-1) ); countINCPT = 0
149 allocate( countINCPT_all(0:numPEs-1) )
150
151
152 RETURN
153 END SUBROUTINE ALLOCATE_STIFF_CHEM_STATS
154
155
156
157
158
159
160
161
162
163
164
165
166
167 SUBROUTINE INIT_STIFF_CHEM_STATS
168
169 use compar, only: myPE
170 use compar, only: PE_IO
171 use output, only: FULL_LOG
172
173 implicit none
174
175 if(.NOT.FULL_LOG) return
176
177 CALL CPU_TIME(ODE_StartTime)
178
179 Hetrgns = 0
180 Homogns = 0
181 failedCount = 0
182 countINCPT = 0
183
184 if(myPE == PE_IO) &
185 write(*,"(/3x,'Integrating stiff chemistry...')",ADVANCE="NO")
186
187 RETURN
188 END SUBROUTINE INIT_STIFF_CHEM_STATS
189
190
191
192
193
194
195
196
197
198
199
200
201
202 SUBROUTINE UPDATE_STIFF_CHEM_STATS(lNEQ, lNEQ_DIMN, lNST, &
203 lODE_DIMN, lAtps, lIncpt)
204
205 use compar, only: myPE
206 use compar, only: PE_IO
207
208 implicit none
209
210
211 INTEGER, intent(in) :: lNEQ_DIMN
212
213
214
215 INTEGER, dimension(lNEQ_DIMN), intent(in) :: lNEQ
216
217 INTEGER, intent(in) :: lNST
218
219 INTEGER, intent(in) :: lODE_DIMN
220
221
222 INTEGER, intent(in) :: lAtps
223
224
225 LOGICAL, intent(in) :: lIncpt
226
227
228 IF(lNEQ(1) == lODE_DIMN) THEN
229 Hetrgns(myPE) = Hetrgns(myPE) + 1
230 ELSE
231 Homogns(myPE) = Homogns(myPE) + 1
232 ENDIF
233
234 maxAttempts(myPE) = max(lAtps, maxAttempts(myPE))
235
236 minNST(myPE) = min(minNST(myPE), lNST)
237 maxNST(myPE) = max(maxNST(myPE), lNST)
238
239 IF (lNST < 10) THEN
240 countNST(1) = countNST(1) + 1
241 ELSE IF (lNST < 100) THEN
242 countNST(2) = countNST(2) + 1
243 ELSE IF (lNST < 1000) THEN
244 countNST(3) = countNST(3) + 1
245 ELSE IF (lNST < 10000) THEN
246 countNST(4) = countNST(4) + 1
247 ELSE
248 countNST(5) = countNST(5) + 1
249 ENDIF
250
251 IF(lIncpt) countINCPT(myPE) = countINCPT(myPE) + 1
252
253 RETURN
254 END SUBROUTINE UPDATE_STIFF_CHEM_STATS
255
256
257
258
259
260
261
262
263
264
265
266
267 SUBROUTINE WRITE_STIFF_CHEM_STATS
268
269 use compar, only: myPE
270 use compar, only: PE_IO
271 use output, only: FULL_LOG
272
273 use mpi_utility
274
275 implicit none
276
277
278 CHARACTER(LEN=64) :: lMsg0, lMsg1
279
280 DOUBLE PRECISION :: lODE_EndTime, lODE_RunTime
281
282 IF(.NOT.FULL_LOG) return
283
284
285
286 IF(myPE == PE_IO) WRITE(*,"(2x,'DONE.',/)")
287
288
289 CALL CPU_TIME(lODE_EndTime)
290 lODE_RunTime = lODE_EndTime - ODE_StartTime
291
292
293
294 = 0; CALL global_sum(minNST, minNST_all)
295 maxNST_all = 0; CALL global_sum(maxNST, maxNST_all)
296
297
298 = 0;
299 CALL global_sum(Homogns, Homogns_all)
300
301
302
303 = 0
304 CALL global_sum(Hetrgns, Hetrgns_all)
305
306
307 = 0
308 CALL global_sum(maxAttempts, maxAttempts_all)
309
310
311 = 0
312 CALL global_sum(countINCPT, countINCPT_all)
313
314
315 = 0
316 CALL global_sum(failedCount, failedCount_all)
317
318
319
320 IF(myPE == PE_IO) THEN
321
322
323 =''; write(lMsg0,*) minval(minNST_all)
324 lMsg1=''; write(lMsg1,*) maxval(maxNST_all)
325 write(*,1000) trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
326
327
328 =''; write(lMsg0,*) sum(Homogns_all)
329 lMsg1=''; write(lMsg1,*) sum(Hetrgns_all)
330 write(*,1001) trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
331
332
333 =''; write(lMsg0,*) maxval(maxAttempts_all)
334 write(*,1004) trim(adjustl(lMsg0))
335
336
337 = countINCPT_total + sum(countINCPT_all)
338
339 IF(countINCPT_total > 0) THEN
340 lMsg0=''; write(lMsg0,*) sum(countINCPT_all)
341 lMsg1=''; write(lMsg1,*) countINCPT_total
342 write(*,1002) 'incomplete', trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
343 ENDIF
344
345
346 = failedCount_total + sum(failedCount_all)
347
348 IF(failedCount_total > 0) THEN
349 lMsg0=''; write(lMsg0,*) sum(failedCount_all)
350 lMsg1=''; write(lMsg1,*) failedCount_total
351 write(*,1002) 'failed', trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
352 ENDIF
353
354 IF(lODE_RunTime > 3.6d3) THEN
355 lMsg0=''; write(lMsg0,"(f8.4)") lODE_RunTime/3.6d3
356 lMsg1='hrs'
357 ELSEIF(lODE_RunTime > 6.0d1) THEN
358 lMsg0=''; write(lMsg0,"(f8.4)") lODE_RunTime/6.0d1
359 lMsg1='min'
360 ELSE
361 lMsg0=''; write(lMsg0,"(f8.4)") lODE_RunTime
362 lMsg1='sec'
363 ENDIF
364 write(*,1003) trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
365
366 ENDIF
367
368
369 if(reportNST == reportNST_Freq) then
370
371 = 0;
372 CALL global_sum(countNST, countNST_all)
373
374 countNST_all = int(countNST_all/reportNST_Freq)
375
376 if(myPE == PE_IO) then
377 write(*,"(/5x,'Average Integration Distribution:')")
378 write(*,"(7x,'NST < 10^1: ', I6)")countNST_all(1)
379 write(*,"(7x,'NST < 10^2: ', I6)")countNST_all(2)
380 write(*,"(7x,'NST < 10^3: ', I6)")countNST_all(3)
381 write(*,"(7x,'NST < 10^4: ', I6)")countNST_all(4)
382 write(*,"(7x,'NST > 10^5: ', I6)")countNST_all(5)
383 endif
384
385 = 1
386
387 = 0
388 countNST_all = 0
389 else
390
391 = reportNST + 1
392 endif
393
394 if(myPE == PE_IO)write(*,"(/' ')")
395
396 RETURN
397
398 1000 Format(5x,'Minimum/Maximum number of steps over all cells: ',A,'/',A)
399 1001 Format(5x,'Number of cells with Homogeneous/Heterogeneous reactions: ',A,'/',A)
400 1002 Format(5x,'Number of Current/Cumulative ',A,' integrations: ',A,'/',A)
401 1003 Format(5x,'CPU Time Used: ',A,' ',A)
402 1004 Format(5x,'Maximum number of integration attempts: ',A)
403
404 END SUBROUTINE WRITE_STIFF_CHEM_STATS
405
406 END MODULE STIFF_CHEM_STATS
407