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

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  Subroutine: CHECK_BOUNDARY_CONDITIONS                               !
4     !  Author: P. Nicoletti                               Date: 10-DEC-91  !
5     !                                                                      !
6     !  Purpose: Check boundary condition specifications                    !
7     !     - convert physical locations to i, j, k's (GET_FLOW_BC)          !
8     !     - compute area of boundary surfaces (GET_BC_AREA)                !
9     !     - convert mass and volumetric flows to velocities (FLOW_TO_VEL)  !
10     !     - check specification of physical quantities                     !
11     !                                                                      !
12     !  Comments:                                                           !
13     !                                                                      !
14     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
15           SUBROUTINE CHECK_BOUNDARY_CONDITIONS
16     
17     ! Global Variables:
18     !---------------------------------------------------------------------//
19     ! Total number of (actual) continuum solids.
20           use physprop, only: SMAX
21     ! Total number of discrete solids.
22           use discretelement, only: DES_MMAX
23     ! Type of run: NEW/RESTART
24           use run, only: RUN_TYPE
25     ! Flag: BC dimensions or Type is specified
26           use bc, only: BC_DEFINED
27     ! Use specified BC type
28           use bc, only: BC_TYPE
29     ! User specifed BC solids bulk density
30           use bc, only: BC_ROP_s
31     ! Solids volume fraction at BC
32           use bc, only: BC_EP_s
33           use bc, only: BC_EP_g
34     ! Run-time flag for DEM solids
35           use run, only: DEM_SOLIDS
36     ! Run-time flag for PIC solids
37           use run, only: PIC_SOLIDS
38     
39     ! Global Parameters:
40     !---------------------------------------------------------------------//
41     ! Parameter constants
42           use param1, only: ZERO, ONE, UNDEFINED
43     ! Maximum number of BCs
44           use param, only: DIMENSION_BC
45     ! Maximum number of disperse phases
46           use param, only: DIM_M
47     
48     ! Use the error manager for posting error messages.
49     !---------------------------------------------------------------------//
50           use error_manager
51     
52     
53           IMPLICIT NONE
54     
55     
56     ! Local Variables:
57     !---------------------------------------------------------------------//
58     ! Loop counter for BCs
59           INTEGER :: BCV
60     ! Total number of solids phases (continuum + discrete)
61           INTEGER :: MMAX_TOT
62     ! Flag to skip checks on indexed solid phase.
63           LOGICAL :: SKIP(1:DIM_M)
64     !......................................................................!
65     
66     
67     ! Initialize the error manager.
68           CALL INIT_ERR_MSG("CHECK_BOUNDARY_CONDITIONS")
69     
70     ! Determine which BCs are DEFINED
71           CALL CHECK_BC_GEOMETRY
72     
73     ! Total number of solids.
74           MMAX_TOT = SMAX + DES_MMAX
75     
76     ! Loop over each defined BC and check the user data.
77           DO BCV = 1, DIMENSION_BC
78     
79              IF (BC_DEFINED(BCV)) THEN
80     
81     ! Determine which solids phases are present.
82                 SKIP=(BC_ROP_S(BCV,:)==UNDEFINED.OR.BC_ROP_S(BCV,:)==ZERO) &
83                    .AND.(BC_EP_S(BCV,:)==UNDEFINED.OR.BC_EP_S(BCV,:)==ZERO)
84     
85                 IF(MMAX_TOT == 1 .AND. BC_EP_g(BCV)/=ONE) SKIP(1) = .FALSE.
86     
87                 SELECT CASE (TRIM(BC_TYPE(BCV)))
88     
89                 CASE ('MASS_INFLOW')
90                    CALL CHECK_BC_GEOMETRY_FLOW(BCV)
91                    CALL CHECK_BC_MASS_INFLOW(MMAX_TOT, SKIP, BCV)
92                    CALL CHECK_BC_INFLOW(MMAX_TOT,SKIP,BCV)
93     
94                 CASE ('P_INFLOW')
95                    CALL CHECK_BC_GEOMETRY_FLOW(BCV)
96                    CALL CHECK_BC_P_INFLOW(MMAX_TOT, SKIP, BCV)
97                    CALL CHECK_BC_INFLOW(MMAX_TOT, SKIP, BCV)
98                    CALL CHECK_BC_OUTFLOW(MMAX_TOT, BCV)
99     
100                 CASE ('OUTFLOW')
101                    CALL CHECK_BC_GEOMETRY_FLOW(BCV)
102                    CALL CHECK_BC_OUTFLOW(MMAX_TOT, BCV)
103     
104                 CASE ('MASS_OUTFLOW')
105                    CALL CHECK_BC_GEOMETRY_FLOW(BCV)
106                    CALL CHECK_BC_MASS_OUTFLOW(MMAX_TOT, BCV)
107                    CALL CHECK_BC_OUTFLOW(MMAX_TOT, BCV)
108     
109                 CASE ('P_OUTFLOW')
110                    CALL CHECK_BC_GEOMETRY_FLOW(BCV)
111                    CALL CHECK_BC_P_OUTFLOW(MMAX_TOT, BCV)
112                    CALL CHECK_BC_OUTFLOW(MMAX_TOT, BCV)
113     
114                 CASE ('FREE_SLIP_WALL')
115                    CALL CHECK_BC_GEOMETRY_WALL(BCV)
116                    CALL CHECK_BC_WALLS(MMAX_TOT, SKIP, BCV)
117     
118                 CASE ('NO_SLIP_WALL')
119                    CALL CHECK_BC_GEOMETRY_WALL(BCV)
120                    CALL CHECK_BC_WALLS(MMAX_TOT, SKIP, BCV)
121     
122                 CASE ('PAR_SLIP_WALL')
123                    CALL CHECK_BC_GEOMETRY_WALL(BCV)
124                    CALL CHECK_BC_WALLS(MMAX_TOT, SKIP, BCV)
125     
126                 END SELECT
127     
128     ! Check whether BC values are specified for undefined BC locations
129              ELSEIF(BC_TYPE(BCV) /= 'DUMMY' .AND.                          &
130                 BC_TYPE(BCV)(1:2) /= 'CG') THEN
131     
132                 CALL CHECK_BC_RANGE(BCV)
133     
134              ENDIF
135           ENDDO
136     ! Additional checks needed for DEM boundaries
137           IF(DEM_SOLIDS) CALL CHECK_BC_DEM(MMAX_TOT)
138     ! Additional checks needed for PIC inflow/outflow boundaries
139           IF(PIC_SOLIDS) CALL CHECK_BC_PIC(MMAX_TOT)
140     
141     ! Cleanup and exit.
142           CALL FINL_ERR_MSG
143     
144           RETURN
145     
146           END SUBROUTINE CHECK_BOUNDARY_CONDITIONS
147     
148     
149     
150     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
151     !                                                                      !
152     !  Subroutine: CHECK_BC_RANGE                                          !
153     !  Author: P. Nicoletti                               Date: 10-DEC-91  !
154     !                                                                      !
155     !  Purpose: Verify that data was not given for undefined BC regions.   !
156     !                                                                      !
157     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
158           SUBROUTINE CHECK_BC_RANGE(BCV)
159     
160     ! Global Variables:
161     !---------------------------------------------------------------------//
162     ! Gas phase BC varaibles
163           use bc, only: BC_EP_g, BC_T_g, BC_X_g, BC_P_g
164           use bc, only: BC_U_g, BC_V_g, BC_W_g
165     ! Sslids phase BC variables.
166           USE bc, only: BC_EP_s, BC_ROP_s, BC_T_s, BC_X_s
167           use bc, only: BC_U_s, BC_V_s, BC_W_s
168     ! Scalar equation BC variables.
169           USE bc, only: BC_SCALAR
170     
171     
172     ! Global Parameters:
173     !---------------------------------------------------------------------//
174     ! Parameter constant for unspecifed values.
175           use param1, only: UNDEFINED
176     ! Maximum number of disperse phases.
177           use param, only: DIM_M
178     ! Maximum number of species gas/solids
179           use param, only: DIMENSION_N_G, DIMENSION_N_S
180     ! Maximum number of scalar equations.
181           use param, only: DIM_SCALAR
182     
183     
184     ! Use the error manager for posting error messages.
185     !---------------------------------------------------------------------//
186           use error_manager
187     
188     
189           IMPLICIT NONE
190     
191     
192     ! Dummy Arguments:
193     !---------------------------------------------------------------------/
194     ! Boundary condition index.
195           INTEGER, INTENT(in) :: BCV
196     
197     ! Local Variables:
198     !---------------------------------------------------------------------//
199     ! Generic loop varaibles.
200           INTEGER :: M, N
201     !......................................................................!
202     
203     
204     ! Initialize the error manager.
205           CALL INIT_ERR_MSG("CHECK_BC_RANGE")
206     
207     
208     ! Check gas phase variables.
209           IF(BC_U_G(BCV) /= UNDEFINED) THEN
210              WRITE(ERR_MSG,1100) trim(iVar('BC_U_g',BCV))
211              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
212           ENDIF
213           IF(BC_V_G(BCV) /= UNDEFINED) THEN
214              WRITE(ERR_MSG,1100) trim(iVar('BC_V_g',BCV))
215              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
216           ENDIF
217           IF (BC_W_G(BCV) /= UNDEFINED) THEN
218              WRITE(ERR_MSG,1100) trim(iVar('BC_W_g',BCV))
219              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
220           ENDIF
221           IF (BC_EP_G(BCV) /= UNDEFINED) THEN
222              WRITE(ERR_MSG,1100) trim(iVar('BC_EP_g',BCV))
223              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
224           ENDIF
225           IF (BC_P_G(BCV) /= UNDEFINED) THEN
226              WRITE(ERR_MSG,1100) trim(iVar('BC_P_g',BCV))
227              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
228           ENDIF
229           IF (BC_T_G(BCV) /= UNDEFINED) THEN
230              WRITE(ERR_MSG,1100) trim(iVar('BC_T_g',BCV))
231              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
232           ENDIF
233     
234           DO N = 1, DIMENSION_N_G
235              IF(BC_X_G(BCV,N) /= UNDEFINED) THEN
236                 WRITE(ERR_MSG,1100) trim(iVar('BC_X_g',BCV,N))
237                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
238              ENDIF
239           ENDDO
240     
241     ! Check solids phase variables.
242           DO M = 1, DIM_M
243              IF(BC_ROP_S(BCV,M) /= UNDEFINED) THEN
244                 WRITE(ERR_MSG,1100) trim(iVar('BC_ROP_s',BCV,M))
245                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
246              ENDIF
247              IF(BC_EP_S(BCV,M) /= UNDEFINED) THEN
248                 WRITE(ERR_MSG,1100) trim(iVar('BC_EP_s',BCV,M))
249                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
250              ENDIF
251              IF(BC_U_S(BCV,M) /= UNDEFINED) THEN
252                 WRITE(ERR_MSG,1100) trim(iVar('BC_U_s',BCV,M))
253                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
254              ENDIF
255              IF(BC_V_S(BCV,M) /= UNDEFINED) THEN
256                 WRITE(ERR_MSG,1100) trim(iVar('BC_V_s',BCV,M))
257                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
258              ENDIF
259     
260              IF(BC_W_S(BCV,M) /= UNDEFINED) THEN
261                 WRITE(ERR_MSG,1100) trim(iVar('BC_W_s',BCV,M))
262                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
263              ENDIF
264              IF(BC_T_S(BCV,M) /= UNDEFINED) THEN
265                 WRITE(ERR_MSG,1100) trim(iVar('BC_T_s',BCV,M))
266                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
267              ENDIF
268     
269              DO N = 1, DIMENSION_N_S
270                 IF(BC_X_S(BCV,M,N) /= UNDEFINED) THEN
271                    WRITE(ERR_MSG,1100) trim(iVar('BC_X_s',BCV,M,N))
272                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
273                 ENDIF
274              ENDDO
275     
276           ENDDO
277     
278     ! Check scalar equation variables.
279           DO N = 1, DIM_SCALAR
280              IF(BC_Scalar(BCV,N) /= UNDEFINED) THEN
281                 WRITE(ERR_MSG,1100) trim(iVar('BC_Scalar',BCV))
282                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
283              ENDIF
284           ENDDO
285     
286     
287           CALL FINL_ERR_MSG
288     
289     
290           RETURN
291     
292      1100 FORMAT('Error 1100:',A,' specified for an undefined BC location')
293     
294           END SUBROUTINE CHECK_BC_RANGE
295