File: /nfs/home/0/users/jenkins/mfix.git/model/time_march.f
1
2
3
4
5
6
7
8
9
10
11
12 SUBROUTINE TIME_MARCH
13
14
15
16
17 USE param
18 USE param1
19 USE run
20 USE physprop
21 USE fldvar
22 USE geometry
23 USE pgcor
24 USE pscor
25 USE cont
26 USE tau_g
27 USE tau_s
28 USE visc_g
29 USE visc_s
30 USE funits
31 USE vshear
32 USE scalars
33 USE toleranc
34 USE drag
35 USE rxns, only: nRR
36 USE compar
37 USE time_cpu
38 USE discretelement
39 USE leqsol, only: SOLVER_STATISTICS, REPORT_SOLVER_STATS
40 use mpi_utility
41 USE cdist
42 USE MFIX_netcdf
43 USE cutcell
44 USE vtk
45 USE qmom_kinetic_equation
46 USE dashboard
47 USE indices
48 USE bc
49 USE coeff
50 USE stiff_chem, only : STIFF_CHEMISTRY, STIFF_CHEM_SOLVER
51 USE vtp
52
53 use output, only: RES_DT, NLOG
54
55
56 IMPLICIT NONE
57
58
59
60
61
62 LOGICAL :: FINISH
63
64
65 INTEGER :: L, M , I, IJK, N
66
67 INTEGER :: IER
68
69 INTEGER :: NIT, NIT_TOTAL
70
71 INTEGER :: NCHECK, DNCHECK
72
73 LOGICAL :: dummy
74
75
76
77 DOUBLE PRECISION :: CPU_STOP
78 LOGICAL :: eofBATCHQ
79
80
81
82
83
84 DOUBLE PRECISION :: MAX_VEL_INLET
85
86 DOUBLE PRECISION :: VAVG_U_G, VAVG_V_G, VAVG_W_G, X_vavg
87
88 LOGICAL , EXTERNAL :: ADJUST_DT
89
90
91 IF(AUTOMATIC_RESTART) RETURN
92
93
94 FINISH = .FALSE.
95 NCHECK = NSTEP
96 DNCHECK = 1
97 CPU_IO = ZERO
98 NIT_TOTAL = 0
99 eofBATCHQ = .FALSE.
100
101
102 CALL INIT_OUTPUT_VARS
103
104
105 CALL PARSE_RESID_STRING (IER)
106
107
108 IF (CALL_USR) CALL USR0
109
110 CALL RRATES_INIT(IER)
111
112
113 CALL INIT_COEFF(IER)
114
115 DO M=1, MMAX
116 CALL ZERO_ARRAY (F_gs(1,M), IER)
117 ENDDO
118
119
120 CALL UNDEF_2_0 (ROP_G, IER)
121 DO M = 1, MMAX
122 CALL UNDEF_2_0 (ROP_S(1,M), IER)
123 ENDDO
124
125
126 DO M = 0, MMAX
127 CALL ZERO_ARRAY (D_E(1,M), IER)
128 CALL ZERO_ARRAY (D_N(1,M), IER)
129 CALL ZERO_ARRAY (D_T(1,M), IER)
130 ENDDO
131 CALL ZERO_ARRAY (E_E, IER)
132 CALL ZERO_ARRAY (E_N, IER)
133 CALL ZERO_ARRAY (E_T, IER)
134
135
136 = ADJUST_DT(100, 0)
137
138
139 IF(SHEAR) CALL CAL_D(V_sh)
140
141
142
143
144 Call check_mass_balance (0)
145
146
147
148
149 CALL MARK_PHASE_4_COR (PHASE_4_P_G, PHASE_4_P_S, DO_CONT, MCP,&
150 DO_P_S, SWITCH_4_P_G, SWITCH_4_P_S, IER)
151
152
153
154 IF(DISCRETE_ELEMENT.AND.(.NOT.DES_CONTINUUM_COUPLED)) THEN
155 IF(WRITE_VTK_FILES) THEN
156 DO L = 1, DIMENSION_VTK
157
158 ENDDO
159 ENDIF
160 CALL DES_TIME_MARCH
161 CALL CPU_TIME(CPU_STOP)
162 CPU_STOP = CPU_STOP - CPU00
163 IF(myPE.EQ.PE_IO) &
164 write(*,"('Elapsed CPU time = ',E15.6,' sec')") CPU_STOP
165 CALL PARALLEL_FIN
166 STOP
167 ENDIF
168
169
170
171 CONTINUE
172
173
174
175 IF (CHK_BATCHQ_END) CALL CHECK_BATCH_QUEUE_END
176
177 IF (CALL_USR) CALL USR1
178
179
180 IF(.NOT.(DISCRETE_ELEMENT .OR. QMOMK) .OR. &
181 DES_CONTINUUM_HYBRID) THEN
182 IF(KT_TYPE_ENUM == GHD_2007) THEN
183 CALL ADJUST_EPS_GHD
184 ELSE
185 CALL ADJUST_EPS
186 ENDIF
187 ENDIF
188
189
190
191
192
193
194
195
196
197 CALL SET_BC1
198
199 CALL OUTPUT_MANAGER(eofBATCHQ, FINISH)
200
201 IF (DT == UNDEFINED) THEN
202 IF (FINISH) THEN
203 RETURN
204 ELSE
205 FINISH = .TRUE.
206 ENDIF
207
208
209 ELSEIF (TIME + 0.1d0*DT >= TSTOP .OR. eofBATCHQ) THEN
210 IF(SOLVER_STATISTICS) &
211 CALL REPORT_SOLVER_STATS(NIT_TOTAL, NSTEP)
212 RETURN
213 ENDIF
214
215
216 CALL UPDATE_OLD
217
218
219 CALL CALC_COEFF_ALL (0, IER)
220
221
222 CALL CALC_TRD_AND_TAU(IER)
223
224
225
226 IF (.NOT.DISCRETE_ELEMENT .OR. DES_CONTINUUM_HYBRID) THEN
227 CALL CALC_KTMOMSOURCE_U_S (IER)
228 CALL CALC_KTMOMSOURCE_V_S (IER)
229 CALL CALC_KTMOMSOURCE_W_S (IER)
230 ENDIF
231
232
233 IF (NSTEP == NCHECK) THEN
234 IF (DNCHECK < 256) DNCHECK = DNCHECK*2
235 NCHECK = NCHECK + DNCHECK
236
237 CALL CALC_RRATE(IER)
238 CALL CHECK_DATA_30
239 ENDIF
240
241
242 IF ((CN_ON.AND.NSTEP>1.AND.RUN_TYPE == 'NEW') .OR. &
243 (CN_ON.AND.RUN_TYPE /= 'NEW' .AND. NSTEP >= (NSTEPRST+1))) THEN
244 DT = 0.5d0*DT
245 ODT = ODT * 2.0d0
246 ENDIF
247
248
249 = 100.0d0*MAX_VEL_INLET()
250
251
252 IF(MAX_INLET_VEL <= SMALL_NUMBER) THEN
253 MAX_INLET_VEL = MAX_ALLOWED_VEL
254 IF (UNITS == 'SI') MAX_INLET_VEL = 1D-2 * MAX_ALLOWED_VEL
255 ENDIF
256
257 = MAX_INLET_VEL * MAX_INLET_VEL_FAC
258
259
260 CALL ITERATE (IER, NIT)
261 IF(AUTOMATIC_RESTART) RETURN
262
263
264
265
266
267
268
269
270 DO WHILE (ADJUST_DT(IER,NIT))
271 CALL ITERATE (IER, NIT)
272 ENDDO
273
274
275 IF(DT.LT.DT_MIN) THEN
276 IF(TIME.LE.RES_DT .AND. AUTO_RESTART) THEN
277 WRITE(ERR_MSG,1000)
278 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
279 AUTO_RESTART = .FALSE.
280 ENDIF
281
282 1000 FORMAT('Automatic restart not possible as Total Time < RES_DT')
283
284 IF(AUTO_RESTART) THEN
285 AUTOMATIC_RESTART = .TRUE.
286 RETURN
287 ELSE
288 IF(WRITE_DASHBOARD) THEN
289 RUN_STATUS = 'DT < DT_MIN. Recovery not possible!'
290 CALL UPDATE_DASHBOARD(NIT,0.0d0,' ')
291 ENDIF
292 CALL MFIX_EXIT(MyPE)
293 ENDIF
294 ENDIF
295
296
297 IF(STIFF_CHEMISTRY) THEN
298 CALL STIFF_CHEM_SOLVER(DT, IER)
299 IF(IER /= 0) THEN
300 dummy = ADJUST_DT(IER, NIT)
301 GOTO 150
302 ENDIF
303 ENDIF
304
305
306
307 CALL CHECK_MASS_BALANCE (1)
308
309
310 IF (DEM_SOLIDS) CALL DES_TIME_MARCH
311 IF (PIC_SOLIDS) CALL PIC_TIME_MARCH
312 IF (QMOMK) CALL QMOMK_TIME_MARCH
313 IF (CALL_DQMOM) CALL USR_DQMOM
314
315
316 IF((CN_ON.AND.NSTEP>1.AND.RUN_TYPE == 'NEW') .OR. &
317 (CN_ON.AND.RUN_TYPE /= 'NEW' .AND. NSTEP >= (NSTEPRST+1))) THEN
318
319 = 2.d0*DT
320 ODT = ODT * 0.5d0
321
322 CALL CN_EXTRAPOL
323 ENDIF
324
325 IF (DT /= UNDEFINED) THEN
326 IF(use_DT_prev) THEN
327 TIME = TIME + DT_PREV
328 ELSE
329 TIME = TIME + DT
330 ENDIF
331 use_DT_prev = .FALSE.
332 NSTEP = NSTEP + 1
333 ENDIF
334
335 NIT_TOTAL = NIT_TOTAL+NIT
336
337
338
339
340 FLUSH (6)
341
342 GOTO 100
343
344 IF(SOLVER_STATISTICS) CALL REPORT_SOLVER_STATS(NIT_TOTAL, NSTEP)
345
346 contains
347
348
349
350
351
352
353
354
355
356 SUBROUTINE CHECK_BATCH_QUEUE_END
357
358 use time_cpu, only: WALL_START
359
360 use error_manager
361
362
363 LOGICAL :: USER_HAULT, WALL_HAULT
364
365 DOUBLE PRECISION :: WALL_STOP, FANCY_BUFF, FANCY_BATCH
366
367 CHARACTER(LEN=4) :: WT_UNIT, BF_UNIT, BC_UNIT
368
369 DOUBLE PRECISION :: WALL_TIME
370
371
372 = WALL_TIME()
373 WALL_STOP = WALL_STOP - WALL_START
374
375
376 = ((WALL_STOP+TERM_BUFFER) >= BATCH_WALLCLOCK)
377 INQUIRE(file="MFIX.STOP", exist=USER_HAULT)
378
379
380 IF(WALL_HAULT) THEN
381 CALL GET_TUNIT(WALL_STOP,WT_UNIT)
382 FANCY_BUFF = TERM_BUFFER
383 CALL GET_TUNIT(FANCY_BUFF, BF_UNIT)
384 FANCY_BATCH = BATCH_WALLCLOCK
385 CALL GET_TUNIT(FANCY_BATCH, BC_UNIT)
386 WRITE(ERR_MSG, 1100) WALL_STOP, WT_UNIT, FANCY_BUFF, BF_UNIT, &
387 FANCY_BATCH, BC_UNIT
388 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
389 ENDIF
390
391 1100 FORMAT(2/,15('='),' REQUESTED CPU TIME LIMIT REACHED ',('='),/ &
392 'Batch Wall Time:',3X,F9.2,1X,A,/'Elapsed Wall Time: ',F9.2, &
393 1X,A,/'Term Buffer:',7X,F9.2,A,/15('='),' REQUESTED CPU ', &
394 'TIME LIMIT REACHED ',('='))
395
396
397 IF(USER_HAULT) THEN
398 WRITE(ERR_MSG, 1200)
399 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
400 ENDIF
401
402 1200 FORMAT(2/,19('='),' MFIX STOP SIGNAL DETECTED ',19('='),/'MFIX.',&
403 'STOP file detected in run directory. Terminating MFIX.',/ &
404 'Please DO NOT FORGET to erase the MFIX.STOP file before ', &
405 'restarting',/19('='),'MFIX STOP SIGNAL DETECTED ',19('='))
406
407
408
409 = (WALL_HAULT .OR. USER_HAULT)
410 call bcast (eofBATCHQ,PE_IO)
411
412 END SUBROUTINE CHECK_BATCH_QUEUE_END
413
414 END SUBROUTINE TIME_MARCH
415
416