File: N:\mfix\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
207 implicit none
208
209
210 INTEGER, intent(in) :: lNEQ_DIMN
211
212
213
214 INTEGER, dimension(lNEQ_DIMN), intent(in) :: lNEQ
215
216 INTEGER, intent(in) :: lNST
217
218 INTEGER, intent(in) :: lODE_DIMN
219
220
221 INTEGER, intent(in) :: lAtps
222
223
224 LOGICAL, intent(in) :: lIncpt
225
226
227 IF(lNEQ(1) == lODE_DIMN) THEN
228 Hetrgns(myPE) = Hetrgns(myPE) + 1
229 ELSE
230 Homogns(myPE) = Homogns(myPE) + 1
231 ENDIF
232
233 maxAttempts(myPE) = max(lAtps, maxAttempts(myPE))
234
235 minNST(myPE) = min(minNST(myPE), lNST)
236 maxNST(myPE) = max(maxNST(myPE), lNST)
237
238 IF (lNST < 10) THEN
239 countNST(1) = countNST(1) + 1
240 ELSE IF (lNST < 100) THEN
241 countNST(2) = countNST(2) + 1
242 ELSE IF (lNST < 1000) THEN
243 countNST(3) = countNST(3) + 1
244 ELSE IF (lNST < 10000) THEN
245 countNST(4) = countNST(4) + 1
246 ELSE
247 countNST(5) = countNST(5) + 1
248 ENDIF
249
250 IF(lIncpt) countINCPT(myPE) = countINCPT(myPE) + 1
251
252 RETURN
253 END SUBROUTINE UPDATE_STIFF_CHEM_STATS
254
255
256
257
258
259
260
261
262
263
264
265
266 SUBROUTINE WRITE_STIFF_CHEM_STATS
267
268 use compar, only: myPE
269 use compar, only: PE_IO
270 use output, only: FULL_LOG
271
272 use mpi_utility
273
274 implicit none
275
276
277 CHARACTER(LEN=64) :: lMsg0, lMsg1
278
279 DOUBLE PRECISION :: lODE_EndTime, lODE_RunTime
280
281 IF(.NOT.FULL_LOG) return
282
283
284
285 IF(myPE == PE_IO) WRITE(*,"(2x,'DONE.',/)")
286
287
288 CALL CPU_TIME(lODE_EndTime)
289 lODE_RunTime = lODE_EndTime - ODE_StartTime
290
291
292
293 = 0; CALL global_sum(minNST, minNST_all)
294 maxNST_all = 0; CALL global_sum(maxNST, maxNST_all)
295
296
297 = 0;
298 CALL global_sum(Homogns, Homogns_all)
299
300
301
302 = 0
303 CALL global_sum(Hetrgns, Hetrgns_all)
304
305
306 = 0
307 CALL global_sum(maxAttempts, maxAttempts_all)
308
309
310 = 0
311 CALL global_sum(countINCPT, countINCPT_all)
312
313
314 = 0
315 CALL global_sum(failedCount, failedCount_all)
316
317
318
319 IF(myPE == PE_IO) THEN
320
321
322 =''; write(lMsg0,*) minval(minNST_all)
323 lMsg1=''; write(lMsg1,*) maxval(maxNST_all)
324 write(*,1000) trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
325
326
327 =''; write(lMsg0,*) sum(Homogns_all)
328 lMsg1=''; write(lMsg1,*) sum(Hetrgns_all)
329 write(*,1001) trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
330
331
332 =''; write(lMsg0,*) maxval(maxAttempts_all)
333 write(*,1004) trim(adjustl(lMsg0))
334
335
336 = countINCPT_total + sum(countINCPT_all)
337
338 IF(countINCPT_total > 0) THEN
339 lMsg0=''; write(lMsg0,*) sum(countINCPT_all)
340 lMsg1=''; write(lMsg1,*) countINCPT_total
341 write(*,1002) 'incomplete', trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
342 ENDIF
343
344
345 = failedCount_total + sum(failedCount_all)
346
347 IF(failedCount_total > 0) THEN
348 lMsg0=''; write(lMsg0,*) sum(failedCount_all)
349 lMsg1=''; write(lMsg1,*) failedCount_total
350 write(*,1002) 'failed', trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
351 ENDIF
352
353 IF(lODE_RunTime > 3.6d3) THEN
354 lMsg0=''; write(lMsg0,"(f8.4)") lODE_RunTime/3.6d3
355 lMsg1='hrs'
356 ELSEIF(lODE_RunTime > 6.0d1) THEN
357 lMsg0=''; write(lMsg0,"(f8.4)") lODE_RunTime/6.0d1
358 lMsg1='min'
359 ELSE
360 lMsg0=''; write(lMsg0,"(f8.4)") lODE_RunTime
361 lMsg1='sec'
362 ENDIF
363 write(*,1003) trim(adjustl(lMsg0)), trim(adjustl(lMsg1))
364
365 ENDIF
366
367
368 if(reportNST == reportNST_Freq) then
369
370 = 0;
371 CALL global_sum(countNST, countNST_all)
372
373 countNST_all = int(countNST_all/reportNST_Freq)
374
375 if(myPE == PE_IO) then
376 write(*,"(/5x,'Average Integration Distribution:')")
377 write(*,"(7x,'NST < 10^1: ', I6)")countNST_all(1)
378 write(*,"(7x,'NST < 10^2: ', I6)")countNST_all(2)
379 write(*,"(7x,'NST < 10^3: ', I6)")countNST_all(3)
380 write(*,"(7x,'NST < 10^4: ', I6)")countNST_all(4)
381 write(*,"(7x,'NST > 10^5: ', I6)")countNST_all(5)
382 endif
383
384 = 1
385
386 = 0
387 countNST_all = 0
388 else
389
390 = reportNST + 1
391 endif
392
393 if(myPE == PE_IO)write(*,"(/' ')")
394
395 RETURN
396
397 1000 Format(5x,'Minimum/Maximum number of steps over all cells: ',A,'/',A)
398 1001 Format(5x,'Number of cells with Homogeneous/Heterogeneous reactions: ',A,'/',A)
399 1002 Format(5x,'Number of Current/Cumulative ',A,' integrations: ',A,'/',A)
400 1003 Format(5x,'CPU Time Used: ',A,' ',A)
401 1004 Format(5x,'Maximum number of integration attempts: ',A)
402
403 END SUBROUTINE WRITE_STIFF_CHEM_STATS
404
405 END MODULE STIFF_CHEM_STATS
406