File: N:\mfix\model\set_flags.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 SUBROUTINE SET_FLAGS
36
37
38
39
40 USE bc
41 USE compar
42 USE exit, only: mfix_exit
43 USE fldvar
44 USE function3
45 USE functions
46 USE funits
47 USE geometry
48 USE indices
49 USE is
50 USE parallel
51 USE param
52 USE param1
53 USE physprop
54 USE sendrecv
55 USE sendrecv3
56 use mpi_utility
57 IMPLICIT NONE
58
59
60
61
62 INTEGER :: I, J, K, IJK, IJK1
63
64 INTEGER :: L
65
66 INTEGER :: FLAGX
67 integer, allocatable :: arr1(:)
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 DO i = istart4, iend4
94 DO j = jstart4, jend4
95 DO k = kstart4, kend4
96
97 IJK = funijk(i, j, k)
98 SELECT CASE (TRIM(ICBC_FLAG(IJK)(1:1)))
99 CASE ('p', 'P', 'I', 'O', 'o')
100
101 ijk1 = bound_funijk(i+1, j, k)
102 IF(TRIM(ICBC_FLAG(IJK1)(1:1)) == 'W')ICBC_FLAG(IJK1)(1:1)='S'
103
104 ijk1 = bound_funijk(i-1, j, k)
105 IF(TRIM(ICBC_FLAG(IJK1)(1:1)) == 'W')ICBC_FLAG(IJK1)(1:1)='S'
106
107 ijk1 = bound_funijk(i, j+1, k)
108 IF(TRIM(ICBC_FLAG(IJK1)(1:1)) == 'W')ICBC_FLAG(IJK1)(1:1)='S'
109
110 ijk1 = bound_funijk(i, j-1, k)
111 IF(TRIM(ICBC_FLAG(IJK1)(1:1)) == 'W')ICBC_FLAG(IJK1)(1:1)='S'
112
113 ijk1 = bound_funijk(i, j, k+1)
114 IF(TRIM(ICBC_FLAG(IJK1)(1:1)) == 'W')ICBC_FLAG(IJK1)(1:1)='S'
115
116 ijk1 = bound_funijk(i, j, k-1)
117 IF(TRIM(ICBC_FLAG(IJK1)(1:1)) == 'W')ICBC_FLAG(IJK1)(1:1)='S'
118 END SELECT
119 ENDDO
120 ENDDO
121 ENDDO
122
123
124
125
126
127
128
129
130
131 DO IJK = ijkstart3, ijkend3
132 SELECT CASE (TRIM(ICBC_FLAG(IJK)(1:1)))
133 CASE ('.')
134 FLAG(IJK) = 1
135 CASE ('p')
136 FLAG(IJK) = 10
137 CASE ('P')
138 FLAG(IJK) = 11
139 CASE ('I')
140 FLAG(IJK) = 20
141 CASE ('O')
142 FLAG(IJK) = 21
143 CASE ('o')
144 FLAG(IJK) = 31
145 CASE ('W')
146 FLAG(IJK) = 100
147 CASE ('S')
148 FLAG(IJK) = 101
149 CASE ('s')
150 FLAG(IJK) = 102
151 CASE ('c')
152 FLAG(IJK) = 106
153 CASE ('C')
154 FLAG(IJK) = 107
155 CASE DEFAULT
156
157
158
159 IF(DMP_LOG)WRITE (UNIT_LOG, 1000) IJK, ICBC_FLAG(IJK)
160 call mfix_exit(myPE)
161
162 END SELECT
163
164
165
166 (IJK) = UNDEFINED_I
167 FLAG_N(IJK) = UNDEFINED_I
168 FLAG_T(IJK) = UNDEFINED_I
169 ENDDO
170
171
172
173
174
175 call send_recv(flag)
176
177 DO i = istart3, iend3
178 DO j = jstart3, jend3
179 DO k = kstart3, kend3
180 Flag3(funijk3(i,j,k)) = Flag(funijk(i,j,k))
181 ENDDO
182 ENDDO
183 ENDDO
184
185 DO i = istart4, iend4
186 DO j = jstart4, jend4
187 DO k = kstart4, kend4
188 If(i.eq.istart4.and.istart4.ne.istart3) then
189 Flag3(funijk3(i,j,k)) = Flag3(funijk3(i+1,j,k))
190 endif
191
192 If(j.eq.jstart4.and.kstart4.ne.kstart3) then
193 Flag3(funijk3(i,j,k)) = Flag3(funijk3(i,j+1,k))
194 endif
195
196 If(k.eq.kstart4.and.kstart4.ne.kstart3) then
197 Flag3(funijk3(i,j,k)) = Flag3(funijk3(i,j,k+1))
198 endif
199
200 If(i.eq.iend4.and.iend4.ne.iend3) then
201 Flag3(funijk3(i,j,k)) = Flag3(funijk3(i-1,j,k))
202 endif
203
204 If(j.eq.jend4.and.jend4.ne.jend3) then
205 Flag3(funijk3(i,j,k)) = Flag3(funijk3(i,j-1,k))
206 endif
207
208 If(k.eq.kend4.and.kend4.ne.kend3) then
209 Flag3(funijk3(i,j,k)) = Flag3(funijk3(i,j,k-1))
210 endif
211
212 ENDDO
213 ENDDO
214 ENDDO
215
216 call send_recv3(flag3)
217
218
219
220
221
222
223
224
225 DO L = 1, DIMENSION_IS
226
227 IF (IS_DEFINED(L)) THEN
228 IF (IS_TYPE(L)=='IMPERMEABLE' .OR. &
229 IS_TYPE(L)(3:13)=='IMPERMEABLE') THEN
230 FLAGX = 0
231 ELSEIF (IS_TYPE(L)=='SEMIPERMEABLE' .OR. &
232 IS_TYPE(L)(3:15)=='SEMIPERMEABLE') THEN
233 FLAGX = 1000 + L
234 ELSE
235 IF(DMP_LOG)WRITE (UNIT_LOG, 1100) L
236 call mfix_exit(myPE)
237 ENDIF
238
239 IF (IS_X_W(L)==IS_X_E(L) .AND. DO_I) THEN
240 IS_PLANE(L) = 'E'
241 I = IS_I_W(L)
242 DO K = IS_K_B(L), IS_K_T(L)
243 DO J = IS_J_S(L), IS_J_N(L)
244 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
245 IF (DEAD_CELL_AT(I,J,K)) CYCLE
246 = FUNIJK(I,J,K)
247 FLAG_E(IJK) = FLAGX
248 ENDDO
249 ENDDO
250 ELSEIF (IS_TYPE(L)(1:1) == 'X') THEN
251 IS_PLANE(L) = 'E'
252 DO I = IS_I_W(L), IS_I_E(L)
253 DO K = IS_K_B(L), IS_K_T(L)
254 DO J = IS_J_S(L), IS_J_N(L)
255 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
256 IF (DEAD_CELL_AT(I,J,K)) CYCLE
257 = FUNIJK(I,J,K)
258 FLAG_E(IJK) = FLAGX
259 ENDDO
260 ENDDO
261 ENDDO
262 ENDIF
263
264 IF (IS_Y_S(L)==IS_Y_N(L) .AND. DO_J) THEN
265 IS_PLANE(L) = 'N'
266 J = IS_J_S(L)
267 DO K = IS_K_B(L), IS_K_T(L)
268 DO I = IS_I_W(L), IS_I_E(L)
269 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
270 IF (DEAD_CELL_AT(I,J,K)) CYCLE
271 = FUNIJK(I,J,K)
272 FLAG_N(IJK) = FLAGX
273 ENDDO
274 ENDDO
275 ELSEIF (IS_TYPE(L)(1:1) == 'Y') THEN
276 IS_PLANE(L) = 'N'
277 DO J = IS_J_S(L), IS_J_N(L)
278 DO K = IS_K_B(L), IS_K_T(L)
279 DO I = IS_I_W(L), IS_I_E(L)
280 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
281 IF (DEAD_CELL_AT(I,J,K)) CYCLE
282 = FUNIJK(I,J,K)
283 FLAG_N(IJK) = FLAGX
284 ENDDO
285 ENDDO
286 ENDDO
287 ENDIF
288
289 IF (IS_Z_B(L)==IS_Z_T(L) .AND. DO_K) THEN
290 IS_PLANE(L) = 'T'
291 K = IS_K_B(L)
292 DO J = IS_J_S(L), IS_J_N(L)
293 DO I = IS_I_W(L), IS_I_E(L)
294 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
295 IF (DEAD_CELL_AT(I,J,K)) CYCLE
296 = FUNIJK(I,J,K)
297 FLAG_T(IJK) = FLAGX
298 ENDDO
299 ENDDO
300 ELSEIF (IS_TYPE(L)(1:1) == 'Z') THEN
301 IS_PLANE(L) = 'T'
302 DO K = IS_K_B(L), IS_K_T(L)
303 DO J = IS_J_S(L), IS_J_N(L)
304 DO I = IS_I_W(L), IS_I_E(L)
305 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
306 IF (DEAD_CELL_AT(I,J,K)) CYCLE
307 = FUNIJK(I,J,K)
308 FLAG_T(IJK) = FLAGX
309 ENDDO
310 ENDDO
311 ENDDO
312 ENDIF
313
314 ENDIF
315 call send_recv(flag,2)
316 call send_recv(flag_t,2)
317 call send_recv(flag_n,2)
318 call send_recv(flag_e,2)
319 ENDDO
320
321
322 IF (MYPE.EQ.PE_IO) THEN
323 ALLOCATE (ARR1(IJKMAX3))
324 ELSE
325 ALLOCATE (ARR1(1))
326 ENDIF
327
328 CALL GATHER(FLAG,ARR1,ROOT)
329 CALL SCATTER(FLAG,ARR1,ROOT)
330
331 DEALLOCATE (ARR1)
332
333
334 RETURN
335 1000 FORMAT(/1X,70('*')//' From: SET_FLAGS',/&
336 ' Message: ICBC_FLAG(',I3,') = ',&
337 A3,' is illegal',/1X,70('*')/)
338 1100 FORMAT(/1X,70('*')//' From: SET_FLAGS',/&
339 ' Message: Unknown IS_TYPE(',I3,&
340 ')',/1X,70('*')/)
341
342 END SUBROUTINE SET_FLAGS
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363 SUBROUTINE SET_FLAGS1
364
365
366
367
368 USE param
369 USE param1
370 USE parallel
371 USE fldvar
372 USE geometry
373 USE bc
374 USE is
375 USE indices
376 USE physprop
377 USE funits
378 USE compar
379 USE sendrecv
380 USE mpi_utility
381 USE functions
382 IMPLICIT NONE
383
384
385
386
387 INTEGER :: IJK, IMJK, IJMK, IJKM, IPJK, IJPK, IJKP
388 INTEGER :: I, J, K
389
390 INTEGER, DIMENSION(:), allocatable :: FLAG_TEMP
391 INTEGER :: flag_size
392
393
394
395
396 = ijkmax3
397 if (myPE.eq.root) then
398 flag_size = ijkmax3
399 endif
400 allocate( flag_temp(flag_size) )
401
402
403 DO IJK = ijkstart3,ijkend3
404 IMJK = IM_OF(IJK)
405 IJMK = JM_OF(IJK)
406 IJKM = KM_OF(IJK)
407 IPJK = IP_OF(IJK)
408 IJPK = JP_OF(IJK)
409 IJKP = KP_OF(IJK)
410 I = I_OF(IJK)
411 J = J_OF(IJK)
412 K = K_OF(IJK)
413 IF(.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
414 IF (DEAD_CELL_AT(I,J,K)) CYCLE
415
416
417
418 IF (WALL_AT(IJK)) THEN
419
420
421
422 (IJK) = 0
423 FLAG_N(IJK) = 0
424 FLAG_T(IJK) = 0
425 FLAG_E(IMJK) = 0
426 FLAG_N(IJMK) = 0
427 FLAG_T(IJKM) = 0
428
429 IF (CYCLIC_AT(IJK)) THEN
430
431 IF (I == IMAX2) THEN
432 IF ((J/=1.AND.J/=0.) .AND. (J/=JMAX2.AND.J/=JMAX3)) THEN
433 IF (NO_K) THEN
434 IF(.NOT.WALL_AT(IMJK)) FLAG_E(IMJK) = 2000
435 ELSEIF ((K/=1.AND.K/=0) .AND. (K/=KMAX2.AND.K/=KMAX3)) THEN
436 IF(.NOT.WALL_AT(IMJK)) FLAG_E(IMJK) = 2000
437 ENDIF
438 ENDIF
439 ENDIF
440 IF (J == JMAX2) THEN
441 IF ((I/=1.AND.I/=0) .AND. (I/=IMAX2.AND.I/=IMAX3)) THEN
442 IF (NO_K) THEN
443 IF(.NOT.WALL_AT(IJMK)) FLAG_N(IJMK) = 2000
444 ELSE IF ((K/=1.AND.K/=0) .AND. (K/=KMAX2.AND.K/=KMAX3)) THEN
445 IF(.NOT.WALL_AT(IJMK)) FLAG_N(IJMK) = 2000
446 ENDIF
447 ENDIF
448 ENDIF
449 IF (K == KMAX2) THEN
450 IF ((J/=1.AND.J/=0.) .AND. (J/=JMAX2.AND.J/=JMAX3)) THEN
451 IF ((I/=1.AND.I/=0) .AND. (I/=IMAX2.AND.I/=IMAX3) .AND. &
452 .NOT.WALL_AT(IJKM)) FLAG_T(IJKM) = 2000
453 ENDIF
454 ENDIF
455
456 ENDIF
457
458
459 ELSEIF (FLUID_AT(IJK)) THEN
460
461
462 IF ( .NOT.WALL_AT(IMJK) .AND. FLAG_E(IMJK)==UNDEFINED_I) &
463 FLAG_E(IMJK) = 2000 + FLAG(IMJK)
464 IF ( .NOT.WALL_AT(IJMK) .AND. FLAG_N(IJMK)==UNDEFINED_I) &
465 FLAG_N(IJMK) = 2000 + FLAG(IJMK)
466 IF ( .NOT.WALL_AT(IJKM) .AND. FLAG_T(IJKM)==UNDEFINED_I) &
467 FLAG_T(IJKM) = 2000 + FLAG(IJKM)
468 IF ( .NOT.WALL_AT(IPJK) .AND. FLAG_E(IJK)==UNDEFINED_I) &
469 FLAG_E(IJK) = 2000 + FLAG(IPJK)
470 IF ( .NOT.WALL_AT(IJPK) .AND. FLAG_N(IJK)==UNDEFINED_I) &
471 FLAG_N(IJK) = 2000 + FLAG(IJPK)
472 IF ( .NOT.WALL_AT(IJKP) .AND. FLAG_T(IJK)==UNDEFINED_I) &
473 FLAG_T(IJK) = 2000 + FLAG(IJKP)
474
475 ENDIF
476
477 ENDDO
478
479
480
481 call gather( flag_e, flag_temp )
482 call scatter( flag_e, flag_temp )
483 call gather( flag_n, flag_temp )
484 call scatter( flag_n, flag_temp )
485 call gather( flag_t, flag_temp )
486 call scatter( flag_t, flag_temp )
487
488
489 deallocate( flag_temp )
490 call send_recv(flag_t,2)
491 call send_recv(flag_n,2)
492 call send_recv(flag_e,2)
493
494 RETURN
495 END SUBROUTINE SET_FLAGS1
496