MFIX  2016-1
mod_bc_k.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2 ! !
3 ! Module name: MOD_BC_K (BC, I_w, J_s, K_b, K_t, PLANE) !
4 ! Author: P. Nicoletti Date: 10-DEC-91 !
5 ! !
6 ! Purpose: modify the "K" values for the b.c. plane !
7 ! !
8 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
9  SUBROUTINE mod_bc_k(BCV)
10 
11  use bc, only: bc_i_w, bc_i_e
12  use bc, only: bc_j_s, bc_j_n
13  use bc, only: bc_k_b, bc_k_t
14  use bc, only: bc_plane
15 
16  USE geometry, only: icbc_flag
17 
18  USE compar
19  USE mpi_utility
20 
21  use error_manager
22  USE functions
23 
24  IMPLICIT NONE
25 
26 ! boundary condition index
27  INTEGER, INTENT(in) :: BCV
28 
29 ! calculated cell indices in I,J,K directions
30  INTEGER :: K_b, K_t
31  INTEGER :: I_w, J_s
32 
33  INTEGER :: OWNER
34 
35  INTEGER :: I, J
36  INTEGER :: IJK, IJKP
37 
38  INTEGER :: IER
39  LOGICAL :: ERROR
40  INTEGER :: K_FLUID, IJK_FLUID
41  INTEGER :: K_WALL, IJK_WALL
42 
43 
44 !-----------------------------------------------
45 
46  CALL init_err_msg("MOD_BC_K")
47 
48  k_b = bc_k_b(bcv)
49  k_t = bc_k_t(bcv)
50 
51  i_w = bc_i_w(bcv)
52  j_s = bc_j_s(bcv)
53 
54 
55 ! Establish the OWNER of the BC
56  owner = merge(mype, 0, is_on_mype_owns(i_w, j_s, k_b))
57  CALL global_all_sum(owner)
58 
59  IF(mype == owner) THEN
60 
61  ijk = funijk(i_w, j_s, k_b)
62  ijkp = funijk(i_w, j_s, k_b+1)
63 
64  IF(wall_icbc_flag(ijk) .AND. icbc_flag(ijkp)(1:1)=='.')THEN
65  k_b = k_b
66  k_t = k_t
67  bc_plane(bcv) = 'T'
68  ELSEIF(wall_icbc_flag(ijkp) .AND. icbc_flag(ijk)(1:1)=='.')THEN
69  k_b = k_b + 1
70  k_t = k_t + 1
71  bc_plane(bcv) = 'B'
72  ELSE
73  bc_plane(bcv) = '.'
74  ENDIF
75  ENDIF
76 
77 ! The owner distributes the new Iw/Ie coordinates to the other ranks.
78  CALL bcast(k_b,owner)
79  CALL bcast(k_t,owner)
80  CALL bcast(bc_plane(bcv),owner)
81 
82 ! If there is an error, send IJK/IPJK to all ranks. Report and exit.
83  IF(bc_plane(bcv) == '.') THEN
84  CALL bcast(ijkp,owner)
85  CALL bcast(ijk, owner)
86 
87  WRITE(err_msg, 1100) bcv, k_b, k_t, i_w, j_s, &
88  ijk, icbc_flag(ijk), ijkp, icbc_flag(ijkp)
89  CALL flush_err_msg(abort=.true.)
90  ENDIF
91 
92  1100 FORMAT('Error 1100: Cannot locate flow plane for boundary ', &
93  'condition ',i3,'.',2/3x,'K Bottom = ',i6,' K Top = ',i6,/&
94  3x,'I West = ',i6,' J South = ',i6,2/' The following ', &
95  'should conttain a wall cell and fluid cell:',/3x,'IJK ',i9, &
96  ' :: ',a3,/3x,'IJKP ',i9,' :: ',a3,2/' Maybe no IC was ', &
97  'specified for the fluid cell.')
98 
99 ! Store the new values in the global data array.
100  bc_k_b(bcv) = k_b
101  bc_k_t(bcv) = k_t
102 
103 ! Set up the I-indices for checking the entire BC region.
104  k_wall = bc_k_b(bcv)
105  k_fluid = merge(k_wall-1, k_wall+1, bc_plane(bcv)=='B')
106 
107 
108  error = .false.
109  DO j = bc_j_s(bcv), bc_j_n(bcv)
110  DO i = bc_i_w(bcv), bc_i_e(bcv)
111 
112 ! Only check cells that you own and contain fluid.
113  IF(.NOT.is_on_mype_plus2layers(i,j,k_fluid)) cycle
114  IF(.NOT.is_on_mype_plus2layers(i,j,k_wall )) cycle
115  IF(dead_cell_at(i,j,k_fluid)) cycle
116  IF(dead_cell_at(i,j,k_wall )) cycle
117 
118  ijk_wall = funijk(i,j,k_wall)
119  ijk_fluid = funijk(i,j,k_fluid)
120 
121  IF(.NOT.(wall_icbc_flag(ijk_wall) .AND. &
122  icbc_flag(ijk_fluid)(1:1)=='.')) error = .true.
123 
124  ENDDO
125  ENDDO
126 
127 ! Sync up the error flag across all processes.
128  CALL global_all_or(error)
129 ! If an error is detected, have each rank open a log file and write
130 ! it's own message. Otherwise, we need to send all the data back to
131 ! PE_IO and that's too much work!
132  IF(error) THEN
133 
134  CALL open_pe_log(ier)
135 
136  WRITE(err_msg, 1200) bcv
137  CALL flush_err_msg(footer=.false.)
138 
139  1200 FORMAT('Error 1200: Illegal geometry for boundary condition:',i3)
140 
141  DO j = bc_j_s(bcv), bc_j_n(bcv)
142  DO i = bc_i_w(bcv), bc_i_e(bcv)
143 
144 ! Only check cells that you own and contain fluid.
145  IF(.NOT.is_on_mype_plus2layers(i,j,k_fluid)) cycle
146  IF(.NOT.is_on_mype_plus2layers(i,j,k_wall )) cycle
147  IF(dead_cell_at(i,j,k_fluid)) cycle
148  IF(dead_cell_at(i,j,k_wall )) cycle
149 
150  ijk_wall = funijk(i,j,k_wall)
151  ijk_fluid = funijk(i,j,k_fluid)
152 
153  IF(.NOT.(wall_icbc_flag(ijk_wall) .AND. &
154  icbc_flag(ijk_fluid)(1:1)=='.')) THEN
155 
156  WRITE(err_msg, 1201) &
157  i, j, k_wall, ijk_wall, icbc_flag(ijk_wall), &
158  i, j, k_fluid, ijk_fluid, icbc_flag(ijk_fluid)
159  CALL flush_err_msg(header=.false., footer=.false.)
160  ENDIF
161 
162  1201 FORMAT(' ',/14x,'I',7x,'J',7x,'K',7x,'IJK',4x,'FLAG',/3x, &
163  'WALL ',3(2x,i6),2x,i9,3x,a,/3x,'FLUID',3(2x,i6),2x,i9,3x,a)
164 
165  ENDDO
166  ENDDO
167 
168  WRITE(err_msg,"('Please correct the mfix.dat file.')")
169  CALL flush_err_msg(header=.false., abort=.true.)
170 
171  ENDIF
172 
173  CALL finl_err_msg
174 
175  RETURN
176  END SUBROUTINE mod_bc_k
integer, dimension(dimension_bc) bc_k_b
Definition: bc_mod.f:70
subroutine finl_err_msg
integer, dimension(dimension_bc) bc_i_w
Definition: bc_mod.f:54
integer, dimension(dimension_bc) bc_j_n
Definition: bc_mod.f:66
character(len=3), dimension(:), pointer icbc_flag
Definition: geometry_mod.f:111
character, dimension(dimension_bc) bc_plane
Definition: bc_mod.f:217
subroutine init_err_msg(CALLER)
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(dimension_bc) bc_j_s
Definition: bc_mod.f:62
subroutine mod_bc_k(BCV)
Definition: mod_bc_k.f:10
integer mype
Definition: compar_mod.f:24
character(len=line_length), dimension(line_count) err_msg
subroutine open_pe_log(IER)
Definition: open_files.f:270
integer, dimension(dimension_bc) bc_i_e
Definition: bc_mod.f:58
subroutine flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, CALL_TREE)
Definition: bc_mod.f:23