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