File: RELATIVE:/../../../mfix.git/model/utilities_mod.f
1 MODULE utilities
2
3 IMPLICIT NONE
4
5 CONTAINS
6
7
8
9
10
11
12
13
14 LOGICAL FUNCTION mfix_isnan(x)
15
16
17
18
19 double precision x
20
21
22
23 CHARACTER(LEN=80) :: notnumber
24
25
26 = .False.
27 WRITE(notnumber,*) x
28
29
30
31 IF(INDEX(notnumber,'?') > 0 .OR. &
32 INDEX(notnumber,'n') > 0 .OR. &
33 INDEX(notnumber,'N') > 0 ) THEN
34 mfix_isnan = .TRUE.
35 RETURN
36 ENDIF
37
38 RETURN
39 END FUNCTION mfix_isnan
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 DOUBLE PRECISION FUNCTION MAX_VEL_INLET()
58
59
60
61
62 USE param
63 USE param1
64 USE parallel
65 USE bc
66 USE fldvar
67 USE geometry
68 USE physprop
69 USE indices
70 USE constant
71 USE run
72 USE compar
73 USE discretelement
74 USE functions
75
76 IMPLICIT NONE
77
78
79
80 INTEGER :: L, I, J, K, IJK, IJK2, M
81
82
83
84 = ZERO
85
86 DO L = 1, DIMENSION_BC
87 IF (BC_DEFINED(L)) THEN
88 IF (BC_TYPE(L) == 'MASS_INFLOW' .OR. BC_TYPE(L) == 'P_INFLOW') THEN
89
90 DO K = BC_K_B(L), BC_K_T(L)
91 DO J = BC_J_S(L), BC_J_N(L)
92 DO I = BC_I_W(L), BC_I_E(L)
93 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
94 IF (DEAD_CELL_AT(I,J,K)) CYCLE
95 = FUNIJK(I,J,K)
96
97 SELECT CASE (BC_PLANE(L))
98 CASE ('S')
99 IJK2 = JM_OF(IJK)
100 IF( ABS(V_G(IJK2)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_G(IJK2))
101 CASE ('N')
102 IF( ABS(V_G(IJK)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_G(IJK))
103 CASE ('W')
104 IJK2 = IM_OF(IJK)
105 IF( ABS(U_G(IJK2)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_G(IJK2))
106 CASE ('E')
107 IF( ABS(U_G(IJK)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_G(IJK))
108 CASE ('B')
109 IJK2 = KM_OF(IJK)
110 IF( ABS(W_G(IJK2)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_G(IJK2))
111 CASE ('T')
112 IF( ABS(W_G(IJK)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_G(IJK))
113 END SELECT
114
115 IF (.NOT.DES_CONTINUUM_COUPLED .OR. DES_CONTINUUM_HYBRID) THEN
116 SELECT CASE (BC_PLANE(L))
117 CASE ('S')
118 IJK2 = JM_OF(IJK)
119 DO M = 1, MMAX
120 IF( ABS(V_s(IJK2, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_s(IJK2, M))
121 ENDDO
122 CASE ('N')
123 DO M = 1, MMAX
124 IF( ABS(V_s(IJK, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_s(IJK, M))
125 ENDDO
126 CASE ('W')
127 IJK2 = IM_OF(IJK)
128 DO M = 1, MMAX
129 IF( ABS(U_s(IJK2, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_s(IJK2, M))
130 ENDDO
131 CASE ('E')
132 DO M = 1, MMAX
133 IF( ABS(U_s(IJK, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_s(IJK, M))
134 ENDDO
135 CASE ('B')
136 IJK2 = KM_OF(IJK)
137 DO M = 1, MMAX
138 IF( ABS(W_s(IJK2, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_s(IJK2, M))
139 ENDDO
140 CASE ('T')
141 DO M = 1, MMAX
142 IF( ABS(W_s(IJK, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_s(IJK, M))
143 ENDDO
144 END SELECT
145 ENDIF
146
147 ENDDO
148 ENDDO
149 ENDDO
150
151 ENDIF
152 ENDIF
153 ENDDO
154
155 RETURN
156 END FUNCTION MAX_VEL_INLET
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 LOGICAL FUNCTION CHECK_VEL_BOUND ()
178
179
180
181
182 USE param
183 USE param1
184 USE parallel
185 USE fldvar
186 USE bc
187 USE geometry
188 USE physprop
189 USE indices
190 USE run
191 USE toleranc
192 USE compar
193 USE mpi_utility
194 USE discretelement
195 USE functions
196
197 IMPLICIT NONE
198
199
200
201 INTEGER :: M
202
203 INTEGER :: IJK
204 LOGICAL :: ALL_IS_ERROR
205
206
207
208
209 = .FALSE.
210 ALL_IS_ERROR = .FALSE.
211
212 LOOP_FLUID : DO IJK = IJKSTART3, IJKEND3
213
214 IF (FLUID_AT(IJK)) THEN
215 IF(ABS(U_G(IJK)) > MAX_INLET_VEL .OR. &
216 ABS(V_G(IJK)) > MAX_INLET_VEL .OR. &
217 ABS(W_G(IJK)) > MAX_INLET_VEL) THEN
218 CHECK_VEL_BOUND = .TRUE.
219 WRITE(*,1000) MAX_INLET_VEL, I_OF(IJK), J_OF(IJK), K_OF(IJK), &
220 EP_g(IJK), U_G(IJK), V_G(IJK), W_G(IJK)
221 EXIT LOOP_FLUID
222 ENDIF
223
224 IF (.NOT.DES_CONTINUUM_COUPLED .OR. DES_CONTINUUM_HYBRID) THEN
225 DO M = 1, MMAX
226 IF(ABS(U_S(IJK,M)) > MAX_INLET_VEL .OR. &
227 ABS(V_S(IJK,M)) > MAX_INLET_VEL .OR. &
228 ABS(W_S(IJK,M)) > MAX_INLET_VEL) THEN
229 CHECK_VEL_BOUND = .TRUE.
230 WRITE(*,1010) MAX_INLET_VEL, I_OF(IJK), J_OF(IJK), K_OF(IJK), M, &
231 EP_s(IJK, M), U_S(IJK,M), V_S(IJK,M), W_S(IJK,M)
232 EXIT LOOP_FLUID
233 ENDIF
234 ENDDO
235 ENDIF
236 ENDIF
237
238 ENDDO LOOP_FLUID
239
240 CALL GLOBAL_ALL_OR(CHECK_VEL_BOUND, ALL_IS_ERROR)
241 IF(ALL_IS_ERROR) CHECK_VEL_BOUND = .TRUE.
242
243 RETURN
244 1000 FORMAT(1X,'Message from: CHECK_VEL_BOUND',/&
245 'WARNING: velocity higher than maximum allowed velocity: ', &
246 G12.5, '(to change this adjust the scale factor MAX_INLET_VEL_FAC)'/&
247 'in this cell: ','I = ',I4,2X,' J = ',I4,2X,' K = ',I4, /&
248 ' ','Epg = ', G12.5, 'Ug = ', G12.5, 'Vg = ', G12.5, 'Wg = ', G12.5)
249 1010 FORMAT(1X,'Message from: CHECK_VEL_BOUND',/&
250 'WARNING: velocity higher than maximum allowed velocity: ', &
251 G12.5,/&
252 'in this cell: ','I = ',I4,2X,' J = ',I4,2X,' K = ',I4,' M = ',I4, /&
253 ' ','Eps = ', G12.5,'Us = ', G12.5, 'Vs = ', G12.5, 'Ws = ', G12.5)
254
255 END FUNCTION CHECK_VEL_BOUND
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282 INTEGER FUNCTION SEEK_COMMENT (LINE, MAXCOL)
283
284
285 IMPLICIT NONE
286
287
288
289
290
291 CHARACTER(len=*) LINE
292
293
294 INTEGER MAXCOL
295
296
297
298
299
300
301 INTEGER, PARAMETER :: DIM_COMMENT = 2
302
303
304
305
306
307 INTEGER :: L, L2
308
309
310 CHARACTER, DIMENSION(DIM_COMMENT) :: COMMENT_CHAR
311
312
313
314
315
316
317
318 DATA COMMENT_CHAR/'#', '!'/
319
320 DO L = 1, MAXCOL
321 DO L2 = 1, DIM_COMMENT
322 IF (LINE(L:L) == COMMENT_CHAR(L2)) THEN
323 SEEK_COMMENT = L
324 RETURN
325 ENDIF
326 END DO
327 END DO
328 SEEK_COMMENT = MAXCOL + 1
329
330 RETURN
331 END FUNCTION SEEK_COMMENT
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350 INTEGER FUNCTION SEEK_END (LINE, MAXCOL)
351
352
353 IMPLICIT NONE
354
355
356
357
358
359 INTEGER MAXCOL
360
361
362 CHARACTER LINE*(*)
363
364
365
366 INTEGER :: L
367
368
369
370
371
372
373
374 = 0
375 DO L = 1, MAXCOL
376 IF (LINE(L:L) /= ' ') SEEK_END = L
377 END DO
378 RETURN
379 END FUNCTION SEEK_END
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405 INTEGER FUNCTION LINE_TOO_BIG (LINE, LINE_LEN, MAXCOL)
406
407
408 IMPLICIT NONE
409
410
411
412
413
414 CHARACTER(LEN=*) :: LINE
415
416
417 INTEGER LINE_LEN
418
419
420
421 INTEGER MAXCOL
422
423
424
425
426
427 INTEGER :: L
428
429
430
431
432
433
434 DO L = MAXCOL + 1, LINE_LEN
435 IF (LINE(L:L) /= ' ') THEN
436 LINE_TOO_BIG = L
437 RETURN
438 ENDIF
439 END DO
440 LINE_TOO_BIG = 0
441 RETURN
442 END FUNCTION LINE_TOO_BIG
443
444
445
446
447
448
449
450
451
452 LOGICAL FUNCTION BLANK_LINE (line)
453
454 IMPLICIT NONE
455
456 CHARACTER :: LINE*(*)
457
458 INTEGER :: L
459
460 BLANK_LINE = .FALSE.
461 DO L=1, len(line)
462 IF(line(L:L)/=' ' .and. line(L:L)/=' ')RETURN
463 ENDDO
464
465 BLANK_LINE = .TRUE.
466 RETURN
467 END FUNCTION BLANK_LINE
468
469 END MODULE utilities
470