File: /nfs/home/0/users/jenkins/mfix.git/model/set_wall_bc.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2     !                                                                      C
3     !  Subroutine: SET_WALL_BC                                             C
4     !  Purpose: Set wall boundary conditions                               C
5     !                                                                      C
6     !  Author: M. Syamlal                                 Date: 29-JAN-92  C
7     !  Reviewer: P. Nicoletti, W. Rogers, S. Venkatesan   Date: 29-JAN-92  C
8     !                                                                      C
9     !  Revision Number: 1                                                  C
10     !  Purpose: Add calculations for mass outflow boundary condition       C
11     !  Author: M. Syamlal                                 Date: 23-OCT-92  C
12     !  Reviewer: M. Syamlal                               Date: 11-DEC-92  C
13     !  Revision Number: 2                                                  C
14     !  Purpose: Revised for MFIX 2.0. This subroutine is different from    C
15     !           old set_wall_bc.                                           C
16     !  Author: M. Syamlal                                 Date: 18-JUL-96  C
17     !                                                                      C
18     !  Literature/Document References:                                     C
19     !                                                                      C
20     !  Variables referenced: BC_DEFINED, BC_TYPE, BC_JJ_PS, BC_I_w,        C
21     !                        BC_I_e, BC_J_s, BC_J_n, BC_K_b, BC_K_t,       C
22     !                        ISTART3, IEND3, JSTART3, JEND3, KSTART3,      C
23     !                        KEND3, ISTART2, IEND2, JSTART2, JEND2,        C
24     !                        KSTART2, KEND3, IMAX2, JMAX2, KMAX2, MMAX,    C
25     !                        W_g, W_S in fluid cell adjacent to wall cell  C
26     !  Variables modified: W_g, W_S in wall cell                           C
27     !                                                                      C
28     !                                                                      C
29     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
30     
31           SUBROUTINE SET_WALL_BC()
32     
33     !-----------------------------------------------
34     ! Modules
35     !-----------------------------------------------
36           USE param
37           USE param1
38           USE bc
39           USE fldvar
40           USE geometry
41           USE indices
42           USE physprop
43           USE run
44           USE funits
45           USE compar
46           USE functions
47           IMPLICIT NONE
48     !-----------------------------------------------
49     ! Dummy arguments
50     !-----------------------------------------------
51     !-----------------------------------------------
52     ! Local variables
53     !-----------------------------------------------
54     ! Local index for boundary condition
55           INTEGER :: L
56     ! indices
57           INTEGER :: IJK, IPJK
58     ! Starting & ending I index
59           INTEGER :: I1, I2
60     ! Starting & ending J index
61           INTEGER :: J1, J2
62     ! Starting and ending K index
63           INTEGER :: K1, K2
64     !-----------------------------------------------
65     
66     
67     ! Set the boundary conditions
68           DO L = 1, DIMENSION_BC
69              IF (BC_DEFINED(L)) THEN
70     
71     ! The range of boundary cells
72                 I1 = BC_I_W(L)
73                 I2 = BC_I_E(L)
74                 J1 = BC_J_S(L)
75                 J2 = BC_J_N(L)
76                 K1 = BC_K_B(L)
77                 K2 = BC_K_T(L)
78     
79                 SELECT CASE (TRIM(BC_TYPE(L)))
80                    CASE ('FREE_SLIP_WALL')
81                       CALL SET_WALL_BC1 (I1, I2, J1, J2, K1, K2, &
82                                          BC_JJ_PS(L))
83     
84                    CASE ('NO_SLIP_WALL')
85                       CALL SET_WALL_BC1 (I1, I2, J1, J2, K1, K2, &
86                                          BC_JJ_PS(L))
87     
88                    CASE ('PAR_SLIP_WALL')
89     ! updating the boundary velocity may improve convergence
90                 END SELECT
91              ENDIF
92           ENDDO
93     
94     
95     ! The above section did not address bc_type=undefined (which by default
96     ! is either a ns wall, or if i=1 and cylindrical, a fs wall) or
97     ! bc_type='dummy' conditions. The section below will handle both events
98     ! since default_wall_at will register as true
99           K1 = 1
100           DO J1 = JSTART3, JEND3
101              DO I1 = ISTART3, IEND3
102                 IF(K1.NE.KSTART2) EXIT
103                 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
104                 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE  ! skip dead cells
105                 IJK = FUNIJK(I1,J1,K1)
106                 IF (DEFAULT_WALL_AT(IJK)) CALL SET_WALL_BC1 (I1, I1,&
107                     J1, J1, K1, K1, 0)
108              ENDDO
109           ENDDO
110     
111     ! top xy-plane
112           K1 = KMAX2
113           DO J1 = JSTART3, JEND3
114              DO I1 = ISTART3, IEND3
115                 IF(K1.NE.KEND2) EXIT
116                 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
117                 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE  ! skip dead cells
118                 IJK = FUNIJK(I1,J1,K1)
119                 IF (DEFAULT_WALL_AT(IJK)) CALL SET_WALL_BC1 (I1, I1, &
120                    J1, J1, K1, K1, 0)
121              ENDDO
122           ENDDO
123     
124     ! south xz-plane
125           J1 = 1
126           DO K1 = KSTART3, KEND3
127              DO I1 = ISTART3, IEND3
128                 IF(J1.NE.JSTART2) EXIT
129                 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
130                 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE  ! skip dead cells
131                 IJK = FUNIJK(I1,J1,K1)
132                 IF (DEFAULT_WALL_AT(IJK)) CALL SET_WALL_BC1 (I1, I1, &
133                     J1, J1, K1, K1, 0)
134              ENDDO
135           ENDDO
136     
137     ! north xz-plane
138           J1 = JMAX2
139           DO K1 = KSTART3, KEND3
140              DO I1 = ISTART3, IEND3
141                 IF(J1.NE.JEND2) EXIT
142                 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
143                 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE  ! skip dead cells
144                 IJK = FUNIJK(I1,J1,K1)
145                 IF (DEFAULT_WALL_AT(IJK)) CALL SET_WALL_BC1 (I1, I1, &
146                    J1, J1, K1, K1, 0)
147              ENDDO
148           ENDDO
149     
150     ! west zy-plane
151           I1 = 1
152           DO K1 = KSTART3, KEND3
153              DO J1 = JSTART3, JEND3
154                 IF(I1.NE.ISTART2) EXIT
155                 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
156                 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE  ! skip dead cells
157                 IJK = FUNIJK(I1,J1,K1)
158                 IF (DEFAULT_WALL_AT(IJK)) CALL SET_WALL_BC1 (I1, I1, &
159                     J1, J1, K1, K1, 0)
160     
161     ! For cylindrical coordinates the azimuthal component should be zero
162     ! at center (this forces no-slip for the azimuthal component at what
163     ! is a free-slip wall)
164                 IF (CYLINDRICAL .AND. XMIN==ZERO) THEN
165                    IPJK = IP_OF(IJK)
166                    W_G(IJK) = -W_G(IPJK)
167                    IF (MMAX > 0) THEN
168                       W_S(IJK,:MMAX) = -W_S(IPJK,:MMAX)
169                    ENDIF
170                 ENDIF
171              ENDDO
172           ENDDO
173     
174     ! east zy-plane
175           I1 = IMAX2
176           DO K1 = KSTART3, KEND3
177              DO J1 = JSTART3, JEND3
178                 IF(I1.NE.IEND2) EXIT
179                 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
180                 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE  ! skip dead cells
181                 IJK = FUNIJK(I1,J1,K1)
182                 IF (DEFAULT_WALL_AT(IJK)) CALL SET_WALL_BC1 (I1, I1, &
183                     J1, J1, K1, K1, 0)
184              ENDDO
185           ENDDO
186           RETURN
187           END SUBROUTINE SET_WALL_BC
188     
189     
190     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
191     !                                                                      C
192     !  Subroutine: SET_WALL_BC1                                            C
193     !                                                                      C
194     !  Purpose: Set U, V, and W components for the specified cells by      C
195     !           copying the same or negative values from near by fluid     C
196     !           cell                                                       C
197     !                                                                      C
198     !  Author: M. Syamlal                                 Date: 21-JAN-92  C
199     !  Reviewer: M. Syamlal, S. Venkatesan, P. Nicoletti  Date: 29-JAN-92  C
200     !            W. Rogers                                                 C
201     !                                                                      C
202     !  Revision Number:                                                    C
203     !  Purpose:                                                            C
204     !  Author:                                            Date: dd-mmm-yy  C
205     !  Reviewer:                                          Date: dd-mmm-yy  C
206     !                                                                      C
207     !  Literature/Document References:                                     C
208     !                                                                      C
209     !  Variables referenced: V_g, W_g, U_g, V_s, W_s, U_s in fluid cell    C
210     !                        adjacent to wall cell                         C
211     !  Variables modified: V_g, W_g, U_g, V_s, W_s, U_s in wall cell       C
212     !                                                                      C
213     !                                                                      C
214     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
215     
216           SUBROUTINE SET_WALL_BC1(II1, II2, JJ1, JJ2, KK1, KK2, &
217                                   BC_JJ_PSL)
218     
219     !-----------------------------------------------
220     ! Modules
221     !-----------------------------------------------
222           USE param
223           USE param1
224           USE bc
225           USE fldvar
226           USE geometry
227           USE indices
228           USE physprop
229           USE run
230           USE funits
231           USE compar
232           USE functions
233           IMPLICIT NONE
234     !-----------------------------------------------
235     ! Dummy arguments
236     !-----------------------------------------------
237     ! Starting and ending I index
238           INTEGER, INTENT(IN) :: II1, II2
239     ! Starting and ending J index
240           INTEGER, INTENT(IN) :: JJ1, JJ2
241     ! Starting and ending K index
242           INTEGER, INTENT(IN) :: KK1, KK2
243     ! Johnson-Jackson boundary condition: 0= no, 1=yes
244           INTEGER, INTENT(IN) :: BC_JJ_PSL
245     !-----------------------------------------------
246     ! Local variables
247     !-----------------------------------------------
248     ! Sign with legal values +1 or -1
249           DOUBLE PRECISION :: SIGN0
250     ! Local indices near wall cell
251           INTEGER :: I, J, K
252           INTEGER :: IJK, IMJK, IJMK, IJKM, IPJK, IJPK, IJKP
253           INTEGER :: I1, I2, J1, J2, K1, K2
254     ! Local index for a fluid cell near the wall cell
255           INTEGER :: LFLUID
256     !-----------------------------------------------
257     
258     ! Limit I1, I2 and all to local processor first ghost layer
259           I1 = II1
260           I2 = II2
261           J1 = JJ1
262           J2 = JJ2
263           K1 = KK1
264           K2 = KK2
265     
266           IF(I1.LE.IEND2)   I1 = MAX(I1, ISTART2)
267           IF(J1.LE.JEND2)   J1 = MAX(J1, JSTART2)
268           IF(K1.LE.KEND2)   K1 = MAX(K1, KSTART2)
269           IF(I2.GE.ISTART2) I2 = MIN(I2, IEND2)
270           IF(J2.GE.JSTART2) J2 = MIN(J2, JEND2)
271           IF(K2.GE.KSTART2) K2 = MIN(K2, KEND2)
272     
273           DO K = K1, K2
274              DO J = J1, J2
275                 DO I = I1, I2
276                    IJK = FUNIJK(I,J,K)
277     
278                    IF (DEAD_CELL_AT(I,J,K)) CYCLE  ! skip dead cells
279     
280     
281                    IF(NS_WALL_AT(IJK))THEN
282                       SIGN0 = -ONE
283                    ELSE
284     ! note fs_wall occurs for default_wall_at at i==1 if cylindrical and
285     ! xmin=zero
286                       SIGN0 = ONE
287                    ENDIF
288     
289                    IF (WALL_AT(IJK)) THEN
290                       IMJK = IM_OF(IJK)
291                       IJMK = JM_OF(IJK)
292                       IJKM = KM_OF(IJK)
293                       IPJK = IP_OF(IJK)
294                       IJPK = JP_OF(IJK)
295                       IJKP = KP_OF(IJK)
296     
297     ! Fluid cell at West
298                       IF (.NOT.WALL_AT(IMJK)) THEN
299                          LFLUID = IMJK
300     ! Wall cell at North
301                          IF (WALL_AT(IJPK)) THEN
302                             V_G(IJK) = SIGN0*V_G(LFLUID)
303                             IF(BC_JJ_PSL==0) CALL EQUAL(V_S,IJK,SIGN0,V_S,LFLUID)
304                          ENDIF
305     ! Wall cell at Top
306                          IF (WALL_AT(IJKP)) THEN
307                             W_G(IJK) = SIGN0*W_G(LFLUID)
308                             IF(BC_JJ_PSL==0) CALL EQUAL(W_S,IJK,SIGN0,W_S,LFLUID)
309                          ENDIF
310                       ENDIF
311     
312     ! Fluid cell at East
313                       IF (.NOT.WALL_AT(IPJK)) THEN
314                          LFLUID = IPJK
315     ! Wall cell at North
316                          IF (WALL_AT(IJPK)) THEN
317                             V_G(IJK) = SIGN0*V_G(LFLUID)
318                             IF(BC_JJ_PSL==0) CALL EQUAL(V_S,IJK,SIGN0,V_S,LFLUID)
319                          ENDIF
320     ! Wall cell at Top
321                          IF (WALL_AT(IJKP)) THEN
322                             W_G(IJK) = SIGN0*W_G(LFLUID)
323                             IF(BC_JJ_PSL==0) CALL EQUAL(W_S,IJK,SIGN0,W_S,LFLUID)
324                          ENDIF
325                       ENDIF
326     
327     
328     ! Fluid cell at South
329                       IF (.NOT.WALL_AT(IJMK)) THEN
330                          LFLUID = IJMK
331     ! Wall cell at East
332                          IF (WALL_AT(IPJK)) THEN
333                             U_G(IJK) = SIGN0*U_G(LFLUID)
334                             IF(BC_JJ_PSL==0) CALL EQUAL(U_S,IJK,SIGN0,U_S,LFLUID)
335                          ENDIF
336     ! Wall cell at Top
337                          IF (WALL_AT(IJKP)) THEN
338                             W_G(IJK) = SIGN0*W_G(LFLUID)
339                             IF(BC_JJ_PSL==0) CALL EQUAL(W_S,IJK,SIGN0,W_S,LFLUID)
340                          ENDIF
341                       ENDIF
342     
343     ! Fluid cell at North
344                       IF (.NOT.WALL_AT(IJPK)) THEN
345                          LFLUID = IJPK
346     ! Wall cell at East
347                          IF (WALL_AT(IPJK)) THEN
348                             U_G(IJK) = SIGN0*U_G(LFLUID)
349                             IF(BC_JJ_PSL==0) CALL EQUAL(U_S,IJK,SIGN0,U_S,LFLUID)
350                          ENDIF
351     ! Wall cell at Top
352                          IF (WALL_AT(IJKP)) THEN
353                             W_G(IJK) = SIGN0*W_G(LFLUID)
354                             IF(BC_JJ_PSL==0) CALL EQUAL(W_S,IJK,SIGN0,W_S,LFLUID)
355                          ENDIF
356                       ENDIF
357     
358     
359                       IF (DO_K) THEN
360     ! Fluid cell at Bottom
361                          IF (.NOT.WALL_AT(IJKM)) THEN
362                             LFLUID = IJKM
363     ! Wall cell at East
364                             IF (WALL_AT(IPJK)) THEN
365                                U_G(IJK) = SIGN0*U_G(LFLUID)
366                                IF (BC_JJ_PSL == 0) CALL EQUAL(U_S, IJK, &
367                                   SIGN0, U_S, LFLUID)
368                             ENDIF
369     ! Wall cell at North
370                             IF (WALL_AT(IJPK)) THEN
371                                V_G(IJK) = SIGN0*V_G(LFLUID)
372                                IF (BC_JJ_PSL == 0) CALL EQUAL(V_S, IJK, &
373                                   SIGN0, V_S, LFLUID)
374                             ENDIF
375                          ENDIF
376     
377     ! Fluid cell at Top
378                          IF (.NOT.WALL_AT(IJKP)) THEN
379                             LFLUID = IJKP
380     ! Wall cell at East
381                             IF (WALL_AT(IPJK)) THEN
382                                U_G(IJK) = SIGN0*U_G(LFLUID)
383                                IF (BC_JJ_PSL == 0) CALL EQUAL(U_S, IJK, &
384                                   SIGN0, U_S, LFLUID)
385                             ENDIF
386     ! Wall cell at North
387                             IF (WALL_AT(IJPK)) THEN
388                                V_G(IJK) = SIGN0*V_G(LFLUID)
389                                IF (BC_JJ_PSL == 0) CALL EQUAL(V_S, IJK, &
390                                   SIGN0, V_S, LFLUID)
391                             ENDIF
392                          ENDIF
393                       ENDIF   ! end if (do_k)
394     
395                    ENDIF   ! end if (wall_at(ijk))
396                 ENDDO   ! end do loop (i = i1, i2)
397              ENDDO   ! end do loop (j = j1, j2)
398           ENDDO   ! end do loop (k = k1, k2)
399     
400           RETURN
401           END SUBROUTINE SET_WALL_BC1
402