MFIX  2016-1
set_wall_bc.f
Go to the documentation of this file.
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  IMPLICIT NONE
47 !-----------------------------------------------
48 ! Dummy arguments
49 !-----------------------------------------------
50 !-----------------------------------------------
51 ! Local variables
52 !-----------------------------------------------
53 ! Local index for boundary condition
54  INTEGER :: L
55 ! indices
56  INTEGER :: IJK, IPJK
57 ! Starting & ending I index
58  INTEGER :: I1, I2
59 ! Starting & ending J index
60  INTEGER :: J1, J2
61 ! Starting and ending K index
62  INTEGER :: K1, K2
63 !-----------------------------------------------
64 
65 
66 ! Set the boundary conditions
67  DO l = 1, dimension_bc
68  IF (bc_defined(l)) THEN
69 
70 ! The range of boundary cells
71  i1 = bc_i_w(l)
72  i2 = bc_i_e(l)
73  j1 = bc_j_s(l)
74  j2 = bc_j_n(l)
75  k1 = bc_k_b(l)
76  k2 = bc_k_t(l)
77 
78  SELECT CASE (bc_type_enum(l))
79  CASE (free_slip_wall)
80  CALL set_wall_bc1 (i1, i2, j1, j2, k1, k2, &
81  bc_jj_ps(l))
82 
83  CASE (no_slip_wall)
84  CALL set_wall_bc1 (i1, i2, j1, j2, k1, k2, &
85  bc_jj_ps(l))
86 
87  CASE (par_slip_wall)
88 ! updating the boundary velocity may improve convergence
89  END SELECT
90  ENDIF
91  ENDDO
92 
93 
94 ! The above section did not address bc_type=undefined (which by default
95 ! is either a ns wall, or if i=1 and cylindrical, a fs wall) or
96 ! bc_type='dummy' conditions. The section below will handle both events
97 ! since default_wall_at will register as true
98  k1 = 1
99  DO j1 = jstart3, jend3
100  DO i1 = istart3, iend3
101  IF(k1.NE.kstart2) EXIT
102  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
103  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
104  ijk = funijk(i1,j1,k1)
105  IF (default_wall_at(ijk)) CALL set_wall_bc1 (i1, i1,&
106  j1, j1, k1, k1, 0)
107  ENDDO
108  ENDDO
109 
110 ! top xy-plane
111  k1 = kmax2
112  DO j1 = jstart3, jend3
113  DO i1 = istart3, iend3
114  IF(k1.NE.kend2) EXIT
115  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
116  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
117  ijk = funijk(i1,j1,k1)
118  IF (default_wall_at(ijk)) CALL set_wall_bc1 (i1, i1, &
119  j1, j1, k1, k1, 0)
120  ENDDO
121  ENDDO
122 
123 ! south xz-plane
124  j1 = 1
125  DO k1 = kstart3, kend3
126  DO i1 = istart3, iend3
127  IF(j1.NE.jstart2) EXIT
128  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
129  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
130  ijk = funijk(i1,j1,k1)
131  IF (default_wall_at(ijk)) CALL set_wall_bc1 (i1, i1, &
132  j1, j1, k1, k1, 0)
133  ENDDO
134  ENDDO
135 
136 ! north xz-plane
137  j1 = jmax2
138  DO k1 = kstart3, kend3
139  DO i1 = istart3, iend3
140  IF(j1.NE.jend2) EXIT
141  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
142  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
143  ijk = funijk(i1,j1,k1)
144  IF (default_wall_at(ijk)) CALL set_wall_bc1 (i1, i1, &
145  j1, j1, k1, k1, 0)
146  ENDDO
147  ENDDO
148 
149 ! west zy-plane
150  i1 = 1
151  DO k1 = kstart3, kend3
152  DO j1 = jstart3, jend3
153  IF(i1.NE.istart2) EXIT
154  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
155  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
156  ijk = funijk(i1,j1,k1)
157  IF (default_wall_at(ijk)) CALL set_wall_bc1 (i1, i1, &
158  j1, j1, k1, k1, 0)
159 
160 ! For cylindrical coordinates the azimuthal component should be zero
161 ! at center (this forces no-slip for the azimuthal component at what
162 ! is a free-slip wall)
163  IF (cylindrical .AND. xmin==zero) THEN
164  ipjk = ip_of(ijk)
165  w_g(ijk) = -w_g(ipjk)
166  IF (mmax > 0) THEN
167  w_s(ijk,:mmax) = -w_s(ipjk,:mmax)
168  ENDIF
169  ENDIF
170  ENDDO
171  ENDDO
172 
173 ! east zy-plane
174  i1 = imax2
175  DO k1 = kstart3, kend3
176  DO j1 = jstart3, jend3
177  IF(i1.NE.iend2) EXIT
178  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
179  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
180  ijk = funijk(i1,j1,k1)
181  IF (default_wall_at(ijk)) CALL set_wall_bc1 (i1, i1, &
182  j1, j1, k1, k1, 0)
183  ENDDO
184  ENDDO
185  RETURN
186 
187  CONTAINS
188 
189  include 'functions.inc'
190 
191  END SUBROUTINE set_wall_bc
192 
193 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
194 ! C
195 ! Subroutine: SET_WALL_BC1 C
196 ! C
197 ! Purpose: Set U, V, and W components for the specified cells by C
198 ! copying the same or negative values from near by fluid C
199 ! cell C
200 ! C
201 ! Author: M. Syamlal Date: 21-JAN-92 C
202 ! Reviewer: M. Syamlal, S. Venkatesan, P. Nicoletti Date: 29-JAN-92 C
203 ! W. Rogers C
204 ! C
205 ! Revision Number: C
206 ! Purpose: C
207 ! Author: Date: dd-mmm-yy C
208 ! Reviewer: Date: dd-mmm-yy C
209 ! C
210 ! Literature/Document References: C
211 ! C
212 ! Variables referenced: V_g, W_g, U_g, V_s, W_s, U_s in fluid cell C
213 ! adjacent to wall cell C
214 ! Variables modified: V_g, W_g, U_g, V_s, W_s, U_s in wall cell C
215 ! C
216 ! C
217 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
218 
219  SUBROUTINE set_wall_bc1(II1, II2, JJ1, JJ2, KK1, KK2, &
220  bc_jj_psl)
222 !-----------------------------------------------
223 ! Modules
224 !-----------------------------------------------
225  USE param
226  USE param1
227  USE bc
228  USE fldvar
229  USE geometry
230  USE indices
231  USE physprop
232  USE run
233  USE funits
234  USE compar
235  IMPLICIT NONE
236 !-----------------------------------------------
237 ! Dummy arguments
238 !-----------------------------------------------
239 ! Starting and ending I index
240  INTEGER, INTENT(IN) :: II1, II2
241 ! Starting and ending J index
242  INTEGER, INTENT(IN) :: JJ1, JJ2
243 ! Starting and ending K index
244  INTEGER, INTENT(IN) :: KK1, KK2
245 ! Johnson-Jackson boundary condition: 0= no, 1=yes
246  INTEGER, INTENT(IN) :: BC_JJ_PSL
247 !-----------------------------------------------
248 ! Local variables
249 !-----------------------------------------------
250 ! Sign with legal values +1 or -1
251  DOUBLE PRECISION :: SIGN0
252 ! Local indices near wall cell
253  INTEGER :: I, J, K
254  INTEGER :: IJK, IMJK, IJMK, IJKM, IPJK, IJPK, IJKP
255  INTEGER :: I1, I2, J1, J2, K1, K2
256 ! Local index for a fluid cell near the wall cell
257  INTEGER :: LFLUID
258 !-----------------------------------------------
259 
260 ! Limit I1, I2 and all to local processor first ghost layer
261  i1 = ii1
262  i2 = ii2
263  j1 = jj1
264  j2 = jj2
265  k1 = kk1
266  k2 = kk2
267 
268  IF(i1.LE.iend2) i1 = max(i1, istart2)
269  IF(j1.LE.jend2) j1 = max(j1, jstart2)
270  IF(k1.LE.kend2) k1 = max(k1, kstart2)
271  IF(i2.GE.istart2) i2 = min(i2, iend2)
272  IF(j2.GE.jstart2) j2 = min(j2, jend2)
273  IF(k2.GE.kstart2) k2 = min(k2, kend2)
274 
275  DO k = k1, k2
276  DO j = j1, j2
277  DO i = i1, i2
278  ijk = funijk(i,j,k)
279 
280  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
281 
282 
283  IF(ns_wall_at(ijk))THEN
284  sign0 = -one
285  ELSE
286 ! note fs_wall occurs for default_wall_at at i==1 if cylindrical and
287 ! xmin=zero
288  sign0 = one
289  ENDIF
290 
291  IF (wall_at(ijk)) THEN
292  imjk = im_of(ijk)
293  ijmk = jm_of(ijk)
294  ijkm = km_of(ijk)
295  ipjk = ip_of(ijk)
296  ijpk = jp_of(ijk)
297  ijkp = kp_of(ijk)
298 
299 ! Fluid cell at West
300  IF (.NOT.wall_at(imjk)) THEN
301  lfluid = imjk
302 ! Wall cell at North
303  IF (wall_at(ijpk)) THEN
304  v_g(ijk) = sign0*v_g(lfluid)
305  IF(bc_jj_psl==0) CALL equal(v_s,ijk,sign0,v_s,lfluid)
306  ENDIF
307 ! Wall cell at Top
308  IF (wall_at(ijkp)) THEN
309  w_g(ijk) = sign0*w_g(lfluid)
310  IF(bc_jj_psl==0) CALL equal(w_s,ijk,sign0,w_s,lfluid)
311  ENDIF
312  ENDIF
313 
314 ! Fluid cell at East
315  IF (.NOT.wall_at(ipjk)) THEN
316  lfluid = ipjk
317 ! Wall cell at North
318  IF (wall_at(ijpk)) THEN
319  v_g(ijk) = sign0*v_g(lfluid)
320  IF(bc_jj_psl==0) CALL equal(v_s,ijk,sign0,v_s,lfluid)
321  ENDIF
322 ! Wall cell at Top
323  IF (wall_at(ijkp)) THEN
324  w_g(ijk) = sign0*w_g(lfluid)
325  IF(bc_jj_psl==0) CALL equal(w_s,ijk,sign0,w_s,lfluid)
326  ENDIF
327  ENDIF
328 
329 
330 ! Fluid cell at South
331  IF (.NOT.wall_at(ijmk)) THEN
332  lfluid = ijmk
333 ! Wall cell at East
334  IF (wall_at(ipjk)) THEN
335  u_g(ijk) = sign0*u_g(lfluid)
336  IF(bc_jj_psl==0) CALL equal(u_s,ijk,sign0,u_s,lfluid)
337  ENDIF
338 ! Wall cell at Top
339  IF (wall_at(ijkp)) THEN
340  w_g(ijk) = sign0*w_g(lfluid)
341  IF(bc_jj_psl==0) CALL equal(w_s,ijk,sign0,w_s,lfluid)
342  ENDIF
343  ENDIF
344 
345 ! Fluid cell at North
346  IF (.NOT.wall_at(ijpk)) THEN
347  lfluid = ijpk
348 ! Wall cell at East
349  IF (wall_at(ipjk)) THEN
350  u_g(ijk) = sign0*u_g(lfluid)
351  IF(bc_jj_psl==0) CALL equal(u_s,ijk,sign0,u_s,lfluid)
352  ENDIF
353 ! Wall cell at Top
354  IF (wall_at(ijkp)) THEN
355  w_g(ijk) = sign0*w_g(lfluid)
356  IF(bc_jj_psl==0) CALL equal(w_s,ijk,sign0,w_s,lfluid)
357  ENDIF
358  ENDIF
359 
360 
361  IF (do_k) THEN
362 ! Fluid cell at Bottom
363  IF (.NOT.wall_at(ijkm)) THEN
364  lfluid = ijkm
365 ! Wall cell at East
366  IF (wall_at(ipjk)) THEN
367  u_g(ijk) = sign0*u_g(lfluid)
368  IF (bc_jj_psl == 0) CALL equal(u_s, ijk, &
369  sign0, u_s, lfluid)
370  ENDIF
371 ! Wall cell at North
372  IF (wall_at(ijpk)) THEN
373  v_g(ijk) = sign0*v_g(lfluid)
374  IF (bc_jj_psl == 0) CALL equal(v_s, ijk, &
375  sign0, v_s, lfluid)
376  ENDIF
377  ENDIF
378 
379 ! Fluid cell at Top
380  IF (.NOT.wall_at(ijkp)) THEN
381  lfluid = ijkp
382 ! Wall cell at East
383  IF (wall_at(ipjk)) THEN
384  u_g(ijk) = sign0*u_g(lfluid)
385  IF (bc_jj_psl == 0) CALL equal(u_s, ijk, &
386  sign0, u_s, lfluid)
387  ENDIF
388 ! Wall cell at North
389  IF (wall_at(ijpk)) THEN
390  v_g(ijk) = sign0*v_g(lfluid)
391  IF (bc_jj_psl == 0) CALL equal(v_s, ijk, &
392  sign0, v_s, lfluid)
393  ENDIF
394  ENDIF
395  ENDIF ! end if (do_k)
396 
397  ENDIF ! end if (wall_at(ijk))
398  ENDDO ! end do loop (i = i1, i2)
399  ENDDO ! end do loop (j = j1, j2)
400  ENDDO ! end do loop (k = k1, k2)
401 
402  RETURN
403 
404  CONTAINS
405 
406  include 'functions.inc'
407 
408 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
409 ! C
410 ! Subroutine: EQUAL C
411 ! Purpose: Loop on the number of solids phases to set a variable C
412 ! equal to the value or negative value of another variable C
413 ! C
414 ! Author: M. Syamlal Date: 29-JAN-92 C
415 ! Reviewer: P. Nicoletti, W. Rogers, S. Venkatesan Date: 29-JAN-92 C
416 ! C
417 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
418 
419  SUBROUTINE equal(ARRAY1, IJK1, SIGN0, ARRAY2, IJK2)
421  IMPLICIT NONE
422 !-----------------------------------------------
423 ! Dummy arguments
424 !-----------------------------------------------
425 ! First array
426  DOUBLE PRECISION, INTENT(OUT) :: ARRAY1 (dimension_3, *)
427 ! Second array
428  DOUBLE PRECISION, INTENT(IN) :: ARRAY2 (dimension_3, *)
429 ! IJK index for the first array
430  INTEGER, INTENT(IN) :: IJK1
431 ! IJK index for the second array
432  INTEGER, INTENT(IN) :: IJK2
433 ! Sign to be used when setting ARRAY1. Legal values
434 ! are + or - 1.0.
435  DOUBLE PRECISION, INTENT(IN) :: SIGN0
436 !-----------------------------------------------
437 ! Local variables
438 !-----------------------------------------------
439 !-----------------------------------------------
440 
441  IF (mmax > 0) THEN
442  array1(ijk1,:mmax) = sign0*array2(ijk2,:mmax)
443  ENDIF
444 
445  RETURN
446  END SUBROUTINE equal
447 
448  END SUBROUTINE set_wall_bc1
integer jend2
Definition: compar_mod.f:80
integer, dimension(dimension_bc) bc_k_b
Definition: bc_mod.f:70
integer iend3
Definition: compar_mod.f:80
double precision, dimension(:,:), allocatable v_s
Definition: fldvar_mod.f:105
integer imax2
Definition: geometry_mod.f:61
integer jstart3
Definition: compar_mod.f:80
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
integer, dimension(dimension_bc) bc_i_w
Definition: bc_mod.f:54
integer istart2
Definition: compar_mod.f:80
double precision, dimension(:,:), allocatable w_s
Definition: fldvar_mod.f:117
integer, dimension(dimension_bc) bc_j_n
Definition: bc_mod.f:66
subroutine set_wall_bc()
Definition: set_wall_bc.f:32
integer iend2
Definition: compar_mod.f:80
integer kstart3
Definition: compar_mod.f:80
integer, parameter dimension_bc
Definition: param_mod.f:61
integer, dimension(dimension_bc) bc_type_enum
Definition: bc_mod.f:146
integer kend2
Definition: compar_mod.f:80
integer kstart2
Definition: compar_mod.f:80
double precision, dimension(:,:), allocatable u_s
Definition: fldvar_mod.f:93
integer kend3
Definition: compar_mod.f:80
integer, dimension(dimension_bc) bc_k_t
Definition: bc_mod.f:74
integer mmax
Definition: physprop_mod.f:19
logical, dimension(:,:,:), allocatable dead_cell_at
Definition: compar_mod.f:127
integer jend3
Definition: compar_mod.f:80
integer jmax2
Definition: geometry_mod.f:63
integer, dimension(dimension_bc) bc_j_s
Definition: bc_mod.f:62
integer jstart2
Definition: compar_mod.f:80
double precision, dimension(:), allocatable v_g
Definition: fldvar_mod.f:99
logical, dimension(dimension_bc) bc_defined
Definition: bc_mod.f:207
integer kmax2
Definition: geometry_mod.f:65
double precision, dimension(:), allocatable w_g
Definition: fldvar_mod.f:111
Definition: run_mod.f:13
Definition: param_mod.f:2
subroutine set_wall_bc1(II1, II2, JJ1, JJ2, KK1, KK2, BC_JJ_PSL)
Definition: set_wall_bc.f:221
subroutine equal(ARRAY1, IJK1, SIGN0, ARRAY2, IJK2)
Definition: set_wall_bc.f:420
logical do_k
Definition: geometry_mod.f:30
logical cylindrical
Definition: geometry_mod.f:168
double precision, dimension(:), allocatable u_g
Definition: fldvar_mod.f:87
double precision xmin
Definition: geometry_mod.f:75
integer, dimension(dimension_bc) bc_jj_ps
Definition: bc_mod.f:212
integer istart3
Definition: compar_mod.f:80
integer, dimension(dimension_bc) bc_i_e
Definition: bc_mod.f:58
double precision, parameter zero
Definition: param1_mod.f:27
Definition: bc_mod.f:23