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