MFIX  2016-1
dif_phi_bc_des.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2 ! !
3 ! Subroutine: DIFFUSE_MEAN_FIELDS !
4 ! Author: J.Musser Date: 11-NOV-14 !
5 ! !
6 ! Purpose: !
7 ! !
8 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
9  SUBROUTINE dif_phi_bc_des(PHI, M, A_M, B_M)
10 
11  USE param
12  USE param1
13  USE geometry
14  USE indices
15  USE bc
16  USE compar
18  USE fun_avg
19  USE functions
20 
21  IMPLICIT NONE
22 
23 !-----------------------------------------------
24 ! Dummy arguments
25 !-----------------------------------------------
26 
27 
28  DOUBLE PRECISION, INTENT(IN) :: PHI(dimension_3)
29 ! Phase index
30  INTEGER, INTENT(IN) :: M
31 ! Septadiagonal matrix A_m
32  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
33 ! Vector b_m
34  DOUBLE PRECISION, INTENT(INOUT) :: B_m(dimension_3, 0:dimension_m)
35 !-----------------------------------------------
36 ! Local variables
37 !-----------------------------------------------
38 ! Boundary condition index
39  INTEGER :: L
40 ! Indices
41  INTEGER :: I, J, K, I1, I2, J1, J2, K1, K2, IJK, &
42  IM, JM, KM
43 !-----------------------------------------------
44 
45 ! Set up the default walls (i.e., bc_type='dummy' or undefined/default
46 ! boundaries) as non-conducting...
47 ! ---------------------------------------------------------------->>>
48 ! when setting up default walls do not use cutcells to avoid conflict
49 
50  IF(.NOT.cartesian_grid) THEN
51 
52 ! west yz plane
53  i1 = imin2
54  DO k1 = kmin3, kmax3
55  DO j1 = jmin3, jmax3
56  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
57  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
58  ijk = funijk(i1,j1,k1)
59  IF (default_wall_at(ijk)) THEN
60 ! Cutting the neighbor link between fluid cell and wall cell
61  a_m(ip_of(ijk),west,m) = zero
62 ! Setting the wall value equal to the adjacent fluid cell value
63  a_m(ijk,:,m) = zero
64  a_m(ijk,east,m) = one
65  a_m(ijk,0,m) = -one
66  b_m(ijk,m) = zero
67  ENDIF
68  ENDDO
69  ENDDO
70 
71 ! east yz plane
72  i1 = imax2
73  DO k1 = kmin3, kmax3
74  DO j1 = jmin3, jmax3
75  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
76  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
77  ijk = funijk(i1,j1,k1)
78  IF (default_wall_at(ijk)) THEN
79 ! Cutting the neighbor link between fluid cell and wall cell
80  a_m(im_of(ijk),east,m) = zero
81 ! Setting the wall value equal to the adjacent fluid cell value
82  a_m(ijk,:,m) = zero
83  a_m(ijk,west,m) = one
84  a_m(ijk,0,m) = -one
85  b_m(ijk,m) = zero
86  ENDIF
87  ENDDO
88  ENDDO
89 
90 ! south xz plane
91  j1 = 1
92  DO k1 = kmin3, kmax3
93  DO i1 = imin3, imax3
94  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
95  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
96  ijk = funijk(i1,j1,k1)
97  IF (default_wall_at(ijk)) THEN
98 ! Cutting the neighbor link between fluid cell and wall cell
99  a_m(jp_of(ijk),south,m) = zero
100 ! Setting the wall value equal to the adjacent fluid cell value
101  a_m(ijk,:,m) = zero
102  a_m(ijk,north,m) = one
103  a_m(ijk,0,m) = -one
104  b_m(ijk,m) = zero
105  ENDIF
106  ENDDO
107  ENDDO
108 
109 ! north xz plane
110  j1 = jmax2
111  DO k1 = kmin3, kmax3
112  DO i1 = imin3, imax3
113  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
114  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
115  ijk = funijk(i1,j1,k1)
116  IF (default_wall_at(ijk)) THEN
117 ! Cutting the neighbor link between fluid cell and wall cell
118  a_m(jm_of(ijk),north,m) = zero
119 ! Setting the wall value equal to the adjacent fluid cell value
120  a_m(ijk,:,m) = zero
121  a_m(ijk,south,m) = one
122  a_m(ijk,0,m) = -one
123  b_m(ijk,m) = zero
124  ENDIF
125  ENDDO
126  ENDDO
127 
128  IF (do_k) THEN
129 ! bottom xy plane
130  k1 = 1
131  DO j1 = jmin3, jmax3
132  DO i1 = imin3, imax3
133  IF (.NOT.is_on_mype_plus2layers(i1,j1,k1)) cycle
134  IF (dead_cell_at(i1,j1,k1)) cycle ! skip dead cells
135  ijk = funijk(i1,j1,k1)
136 
137  IF (default_wall_at(ijk)) THEN
138 ! Cutting the neighbor link between fluid cell and wall cell
139  a_m(kp_of(ijk),bottom,m) = zero
140 ! Setting the wall value equal to the adjacent fluid cell value (set
141 ! the boundary cell value equal to adjacent fluid cell value)
142  a_m(ijk,:,m) = zero
143  a_m(ijk,top,m) = one
144  a_m(ijk,0,m) = -one
145  b_m(ijk,m) = zero
146  ENDIF
147  ENDDO
148  ENDDO
149 
150 ! top xy plane
151  k1 = kmax2
152  DO j1 = jmin3, jmax3
153  DO i1 = imin3, imax3
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)) THEN
158 ! Cutting the neighbor link between fluid cell and wall cell
159  a_m(km_of(ijk),top,m) = zero
160 ! Setting the wall value equal to the adjacent fluid cell value
161  a_m(ijk,:,m) = zero
162  a_m(ijk,bottom,m) = one
163  a_m(ijk,0,m) = -one
164  b_m(ijk,m) = zero
165  ENDIF
166  ENDDO
167  ENDDO
168  ENDIF
169 
170  ENDIF
171 
172 ! Set user defined wall boundary conditions
173 ! ---------------------------------------------------------------->>>
174  DO l = 1, dimension_bc
175  IF (bc_defined(l)) THEN
176 
177  i1 = bc_i_w(l)
178  i2 = bc_i_e(l)
179  j1 = bc_j_s(l)
180  j2 = bc_j_n(l)
181  k1 = bc_k_b(l)
182  k2 = bc_k_t(l)
183 
184  DO k = k1, k2
185  DO j = j1, j2
186  DO i = i1, i2
187 
188  IF (.NOT.is_on_mype_plus2layers(i,j,k)) cycle
189  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
190 
191  ijk = funijk(i,j,k)
192 
193 
194 ! Set the boundary cell equal to the known value in that
195 ! cell
196  a_m(ijk,:,m) = zero
197  b_m(ijk,m) = zero
198 ! second modify the matrix equation according to the user specified
199 ! boundary condition
200  IF (fluid_at(east_of(ijk))) THEN
201  a_m(ijk,0,m) = -odx_e(i)
202  a_m(ijk,east,m) = odx_e(i)
203 
204  ELSEIF (fluid_at(west_of(ijk))) THEN
205  im = im1(i)
206  a_m(ijk,west,m) = odx_e(im)
207  a_m(ijk,0,m) = -odx_e(im)
208 
209  ELSEIF (fluid_at(north_of(ijk))) THEN
210  a_m(ijk,0,m) = -ody_n(j)
211  a_m(ijk,north,m) = ody_n(j)
212 
213  ELSEIF (fluid_at(south_of(ijk))) THEN
214  jm = jm1(j)
215  a_m(ijk,south,m) = ody_n(jm)
216  a_m(ijk,0,m) = -ody_n(jm)
217 
218  ELSEIF (fluid_at(top_of(ijk))) THEN
219  a_m(ijk,0,m) = -ox(i)*odz_t(k)
220  a_m(ijk,top,m) = ox(i)*odz_t(k)
221 
222  ELSEIF (fluid_at(bottom_of(ijk))) THEN
223  km = km1(k)
224  a_m(ijk,bottom,m) = ox(i)*odz_t(km)
225  a_m(ijk,0,m) = -ox(i)*odz_t(km)
226 
227  ENDIF
228  ENDDO
229  ENDDO
230  ENDDO
231  ENDIF ! end if (bc_defined)
232  ENDDO ! end L do loop over dimension_bc
233 
234 ! modifications for cartesian grid implementation
235  IF(cartesian_grid .AND. .NOT.(cg_safe_mode(1)==1)) &
236  CALL dif_phi_bc_des_cg(phi, 0, a_m, b_m)
237 
238  RETURN
239  END SUBROUTINE dif_phi_bc_des
240 
241 
242 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
243 ! C
244 ! Subroutine: BC_PHI_CG C
245 ! Purpose: Modify boundary conditions for cartesian grid cut-cell C
246 ! implementation C
247 ! C
248 ! Author: Jeff Dietiker C
249 ! C
250 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
251  SUBROUTINE dif_phi_bc_des_cg(PHI, M, A_M, B_M)
253 !-----------------------------------------------
254 ! Modules
255 !-----------------------------------------------
256  USE param
257  USE param1
258  USE geometry
259  USE indices
260  USE bc
261  USE compar
262  USE cutcell
263  USE fun_avg
264  USE functions
265 
266  IMPLICIT NONE
267 
268 !-----------------------------------------------
269 ! Dummy arguments
270 !-----------------------------------------------
271 ! The field variable being solved for:
272 ! e.g., T_g, T_s, x_g, x_s, Theta_m, scalar, K_Turb_G,
273 ! e_Turb_G
274  DOUBLE PRECISION, INTENT(IN) :: PHI(dimension_3)
275 
276 ! Phase index
277  INTEGER, INTENT(IN) :: M
278 ! Septadiagonal matrix A_m
279  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
280 ! Vector b_m
281  DOUBLE PRECISION, INTENT(INOUT) :: B_m(dimension_3, 0:dimension_m)
282 !-----------------------------------------------
283 ! Local variables
284 !-----------------------------------------------
285 ! Indices
286  INTEGER :: I, J, K, IJK, IM, JM, KM
287 
288  LOGICAL :: ALONG_GLOBAL_GHOST_LAYER
289 
290 !-----------------------------------------------
291 
292  DO ijk = ijkstart3, ijkend3
293 
294  i = i_of(ijk)
295  j = j_of(ijk)
296  k = k_of(ijk)
297 
298  along_global_ghost_layer = (i < imin1) .OR. ( i>imax1 ) &
299  .OR. (j < jmin1) .OR. (j > jmax1)
300 
301  IF(do_k) along_global_ghost_layer = along_global_ghost_layer &
302  .OR. (k < kmin1) .OR. (k > kmax1)
303 
304 ! Setting the value in the boundary cell equal to what is known
305  IF(blocked_cell_at(ijk)) THEN
306  a_m(ijk,:,m) = zero
307  a_m(ijk,0,m) = -one
308  b_m(ijk,m) = -phi(ijk)
309  ENDIF
310 
311  IF(blocked_cell_at(ijk).OR.along_global_ghost_layer) THEN
312 
313 
314  IF (cut_cell_at(ip_of(ijk))) THEN
315  IF( bc_id(ip_of(ijk)) > 0 ) THEN
316  a_m(ijk,0,m) = -odx_e(i)
317  a_m(ijk,east,m) = odx_e(i)
318  b_m(ijk,m) = zero
319  ENDIF
320 
321  ELSEIF (cut_cell_at(im_of(ijk))) THEN
322  IF(bc_id(im_of(ijk)) > 0 ) THEN
323  im = im1(i)
324  a_m(ijk,west,m) = odx_e(im)
325  a_m(ijk,0,m) = -odx_e(im)
326  b_m(ijk,m) = zero
327  ENDIF
328 
329  ELSEIF (cut_cell_at(jp_of(ijk))) THEN
330  IF(bc_id(jp_of(ijk)) > 0 ) THEN
331  a_m(ijk,0,m) = -ody_n(j)
332  a_m(ijk,north,m) = ody_n(j)
333  b_m(ijk,m) = zero
334  ENDIF
335 
336  ELSEIF (cut_cell_at(jm_of(ijk))) THEN
337  IF(bc_id(jm_of(ijk)) > 0 ) THEN
338  jm = jm1(j)
339  a_m(ijk,south,m) = ody_n(jm)
340  a_m(ijk,0,m) = -ody_n(jm)
341  b_m(ijk,m) = zero
342  ENDIF
343 
344  ELSEIF (cut_cell_at(kp_of(ijk))) THEN
345  IF(bc_id(kp_of(ijk)) > 0 ) THEN
346  a_m(ijk,0,m) = -ox(i)*odz_t(k)
347  a_m(ijk,top,m) = ox(i)*odz_t(k)
348  b_m(ijk,m) = zero
349  ENDIF
350 
351  ELSEIF (cut_cell_at(km_of(ijk))) THEN
352  IF(bc_id(km_of(ijk)) > 0 ) THEN
353  km = km1(k)
354  a_m(ijk,bottom,m) = ox(i)*odz_t(km)
355  a_m(ijk,0,m) = -ox(i)*odz_t(km)
356  b_m(ijk,m) = zero
357  ENDIF
358  ENDIF
359  ENDIF
360  ENDDO
361 
362  RETURN
363 
364  END SUBROUTINE dif_phi_bc_des_cg
365 
366 
integer, dimension(dimension_bc) bc_k_b
Definition: bc_mod.f:70
integer imax2
Definition: geometry_mod.f:61
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
integer ijkend3
Definition: compar_mod.f:80
integer imax3
Definition: geometry_mod.f:91
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, dimension(dimension_bc) bc_j_n
Definition: bc_mod.f:66
integer, dimension(:), allocatable im1
Definition: indices_mod.f:50
integer, dimension(10) cg_safe_mode
Definition: cutcell_mod.f:415
integer, parameter dimension_bc
Definition: param_mod.f:61
integer east
Definition: param_mod.f:29
integer imin3
Definition: geometry_mod.f:90
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
subroutine dif_phi_bc_des_cg(PHI, M, A_M, B_M)
double precision, dimension(:), allocatable ody_n
Definition: geometry_mod.f:123
integer kmax1
Definition: geometry_mod.f:58
integer, dimension(dimension_bc) bc_k_t
Definition: bc_mod.f:74
logical, dimension(:,:,:), allocatable dead_cell_at
Definition: compar_mod.f:127
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
double precision, dimension(:), allocatable odx_e
Definition: geometry_mod.f:121
integer, dimension(:), allocatable jm1
Definition: indices_mod.f:51
integer imax1
Definition: geometry_mod.f:54
integer jmax2
Definition: geometry_mod.f:63
integer, dimension(dimension_bc) bc_j_s
Definition: bc_mod.f:62
double precision, dimension(:), allocatable ox
Definition: geometry_mod.f:140
integer jmax3
Definition: geometry_mod.f:91
integer north
Definition: param_mod.f:37
logical, dimension(dimension_bc) bc_defined
Definition: bc_mod.f:207
integer south
Definition: param_mod.f:41
integer kmax2
Definition: geometry_mod.f:65
integer jmax1
Definition: geometry_mod.f:56
Definition: param_mod.f:2
integer jmin3
Definition: geometry_mod.f:90
logical cartesian_grid
Definition: cutcell_mod.f:13
integer jmin1
Definition: geometry_mod.f:42
integer kmax3
Definition: geometry_mod.f:91
logical do_k
Definition: geometry_mod.f:30
logical, dimension(:), allocatable cut_cell_at
Definition: cutcell_mod.f:355
integer, dimension(:), allocatable km1
Definition: indices_mod.f:52
integer ijkstart3
Definition: compar_mod.f:80
integer west
Definition: param_mod.f:33
integer kmin3
Definition: geometry_mod.f:90
integer, dimension(:), allocatable bc_id
Definition: cutcell_mod.f:433
integer top
Definition: param_mod.f:45
integer imin2
Definition: geometry_mod.f:89
logical, dimension(:), allocatable blocked_cell_at
Definition: cutcell_mod.f:361
integer imin1
Definition: geometry_mod.f:40
integer dimension_m
Definition: param_mod.f:18
double precision, dimension(:), allocatable odz_t
Definition: geometry_mod.f:125
integer kmin1
Definition: geometry_mod.f:44
integer bottom
Definition: param_mod.f:49
integer, dimension(dimension_bc) bc_i_e
Definition: bc_mod.f:58
double precision, parameter zero
Definition: param1_mod.f:27
subroutine dif_phi_bc_des(PHI, M, A_M, B_M)
Definition: bc_mod.f:23