File: N:\mfix\model\set_bc_flow.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  Subroutine: SET_BC_FLOW                                             !
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 SET_BC_FLOW
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
27     ! User specifed 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     
33     ! Global Parameters:
34     !---------------------------------------------------------------------//
35     ! Parameter constants
36           use param1, only: ZERO, ONE, UNDEFINED
37     ! Maximum number of BCs
38           use param, only: DIMENSION_BC
39     ! Maximum number of disperse phases
40           use param, only: DIM_M
41     
42     ! Use the error manager for posting error messages.
43     !---------------------------------------------------------------------//
44           use error_manager
45     
46     
47           IMPLICIT NONE
48     
49     
50     ! Local Variables:
51     !---------------------------------------------------------------------//
52     ! Loop counter for BCs
53           INTEGER :: BCV
54     ! Total number of solids phases (continuum + discrete)
55           INTEGER :: MMAX_TOT
56     ! Flag to skip checks on indexed solid phase.
57           LOGICAL :: SKIP(1:DIM_M)
58     !......................................................................!
59     
60     
61     ! Initialize the error manager.
62           CALL INIT_ERR_MSG("SET_BC_FLOW")
63     
64     ! Total number of solids.
65           MMAX_TOT = SMAX + DES_MMAX
66     
67     ! Loop over each defined BC and check the user data.
68           DO BCV = 1, DIMENSION_BC
69     
70              IF(.NOT.BC_DEFINED(BCV)) CYCLE
71     
72     ! Determine which solids phases are present.
73              SKIP=(BC_ROP_S(BCV,:)==UNDEFINED.OR.BC_ROP_S(BCV,:)==ZERO) &
74                 .AND.(BC_EP_S(BCV,:)==UNDEFINED.OR.BC_EP_S(BCV,:)==ZERO)
75     
76              IF(MMAX_TOT == 1 .AND. BC_EP_g(BCV)/=ONE) SKIP(1) = .FALSE.
77     
78              SELECT CASE (BC_TYPE_ENUM(BCV))
79     
80              CASE (MASS_INFLOW)
81                 CALL FLOW_TO_VEL_NEW(.TRUE., MMAX_TOT, SKIP, BCV)
82                 CALL CHECK_BC_VEL_INFLOW(MMAX_TOT, SKIP, BCV)
83     
84              CASE (MASS_OUTFLOW)
85                 CALL FLOW_TO_VEL_NEW(.TRUE., MMAX_TOT, SKIP, BCV)
86                 CALL CHECK_BC_VEL_OUTFLOW(MMAX_TOT, SKIP, BCV)
87              END SELECT
88           ENDDO
89     
90     ! Cleanup and exit.
91           CALL FINL_ERR_MSG
92     
93           RETURN
94     
95           END SUBROUTINE SET_BC_FLOW
96     
97     
98     
99     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
100     !                                                                      !
101     ! Subroutine: CHECK_BC_VEL_INFLOW                                      !
102     ! Author: J.Musser                                    Date: 01-Mar-14  !
103     !                                                                      !
104     ! Purpose: Provided a detailed error message when the sum of volume    !
105     !                                                                      !
106     ! Comments:                                                            !
107     !     The velocities at the inflow face are fixed and the momentum     !
108     !     equations are not solved in the inflow cells. Since the flow is  !
109     !     into the domain all other scalars that are used need to be       !
110     !     specified (e.g., mass fractions, void fraction, etc.,)           !
111     !                                                                      !
112     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
113           SUBROUTINE CHECK_BC_VEL_INFLOW(M_TOT, SKIP, BCV)
114     
115           USE param, only: DIM_M
116           USE param1, only: ZERO
117           USE param1, only: UNDEFINED
118     
119           use geometry, only: NO_I
120           use geometry, only: NO_J
121           use geometry, only: NO_K
122     
123           use bc
124     
125           use error_manager
126     
127           IMPLICIT NONE
128     
129     
130           INTEGER, INTENT(in) :: BCV
131           INTEGER, INTENT(in) :: M_TOT
132     
133           LOGICAL, INTENT(in) :: SKIP(DIM_M)
134     
135     ! loop/variable indices
136           INTEGER :: M
137     
138           CALL INIT_ERR_MSG("CHECK_BC_VEL_INFLOW")
139     
140     
141     ! Check that gas phase velocities are defined.
142           IF(BC_U_G(BCV) == UNDEFINED) THEN
143              IF(NO_I) THEN
144                 BC_U_G(BCV) = ZERO
145              ELSE
146                 WRITE(ERR_MSG,1000) trim(iVar('BC_U_g',BCV))
147                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
148              ENDIF
149           ENDIF
150     
151           IF (BC_V_G(BCV) == UNDEFINED) THEN
152              IF (NO_J) THEN
153                 BC_V_G(BCV) = ZERO
154              ELSE
155                 WRITE(ERR_MSG,1000) trim(iVar('BC_V_g',BCV))
156                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
157              ENDIF
158           ENDIF
159     
160           IF(BC_W_G(BCV) == UNDEFINED) THEN
161              IF (NO_K) THEN
162                 BC_W_G(BCV) = ZERO
163              ELSE
164                 WRITE(ERR_MSG,1000) trim(iVar('BC_W_g',BCV))
165                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
166              ENDIF
167           ENDIF
168     
169     ! Check that solids phase velocities are defined.
170           DO M = 1, M_TOT
171              IF(BC_U_S(BCV,M) == UNDEFINED) THEN
172                 IF(SKIP(M) .OR. NO_I) THEN
173                    BC_U_S(BCV,M) = ZERO
174                 ELSE
175                    WRITE(ERR_MSG,1000) trim(iVar('BC_U_s',BCV,M))
176                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
177                 ENDIF
178              ENDIF
179     
180              IF(BC_V_S(BCV,M) == UNDEFINED) THEN
181                 IF(SKIP(M) .OR. NO_J) THEN
182                    BC_V_S(BCV,M) = ZERO
183                 ELSE
184                    WRITE(ERR_MSG,1000) trim(iVar('BC_V_s',BCV,M))
185                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
186                 ENDIF
187              ENDIF
188     
189              IF(BC_W_S(BCV,M) == UNDEFINED) THEN
190                 IF(SKIP(M) .OR. NO_K) THEN
191                    BC_W_S(BCV,M) = ZERO
192                 ELSE
193                    WRITE(ERR_MSG,1000) trim(iVar('BC_W_s',BCV,M))
194                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
195                 ENDIF
196              ENDIF
197           ENDDO
198     
199     ! Check that gas phase velocities are consistent.
200           SELECT CASE (BC_PLANE(BCV))
201     
202           CASE ('W')
203              IF(BC_U_G(BCV) > ZERO) THEN
204                 WRITE(ERR_MSG,1300) trim(iVar('BC_U_g',BCV)), '<'
205                 CALL FLUSH_ERR_MSG
206              ENDIF
207              DO M = 1, M_TOT
208                 IF(BC_U_S(BCV,M) > ZERO) THEN
209                    WRITE(ERR_MSG, 1300) trim(iVar('BC_U_s',BCV,M)), '<'
210                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
211                 ENDIF
212              ENDDO
213     
214           CASE('E')
215              IF(BC_U_G(BCV) < ZERO) THEN
216                 WRITE(ERR_MSG,1300) trim(iVar('BC_U_g',BCV)), '>'
217                 CALL FLUSH_ERR_MSG
218              ENDIF
219              DO M = 1, M_TOT
220                 IF(BC_U_S(BCV,M) < ZERO) THEN
221                    WRITE(ERR_MSG, 1300) trim(iVar('BC_U_s',BCV,M)), '>'
222                   CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
223                 ENDIF
224              ENDDO
225     
226           CASE('S')
227              IF(BC_V_G(BCV) > ZERO) THEN
228                 WRITE(ERR_MSG,1300) trim(iVar('BC_V_g',BCV)), '<'
229                 CALL FLUSH_ERR_MSG
230              ENDIF
231              DO M = 1, M_TOT
232                 IF(BC_V_S(BCV,M) > ZERO) THEN
233                    WRITE(ERR_MSG, 1300) trim(iVar('BC_V_s',BCV,M)), '<'
234                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
235                 ENDIF
236              ENDDO
237     
238           CASE('N')
239              IF(BC_V_G(BCV) < ZERO) THEN
240                 WRITE(ERR_MSG,1300) trim(iVar('BC_V_g',BCV)), '>'
241                 CALL FLUSH_ERR_MSG
242              ENDIF
243              DO M = 1, M_TOT
244                 IF(BC_V_S(BCV,M) < ZERO) THEN
245                    WRITE(ERR_MSG, 1300) trim(iVar('BC_V_s',BCV,M)), '>'
246                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
247                 ENDIF
248              ENDDO
249     
250           CASE('B')
251              IF(BC_W_G(BCV) > ZERO) THEN
252                 WRITE(ERR_MSG,1300) trim(iVar('BC_W_g',BCV)), '<'
253                 CALL FLUSH_ERR_MSG
254              ENDIF
255              DO M = 1, M_TOT
256                 IF(BC_W_S(BCV,M) > ZERO) THEN
257                    WRITE(ERR_MSG, 1300) trim(iVar('BC_W_s',BCV,M)), '<'
258                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
259                 ENDIF
260              ENDDO
261     
262           CASE('T')
263              IF(BC_W_G(BCV) < ZERO) THEN
264                 WRITE(ERR_MSG,1300) trim(iVar('BC_W_g',BCV)), '>'
265                 CALL FLUSH_ERR_MSG
266              ENDIF
267              DO M = 1, M_TOT
268                 IF(BC_W_S(BCV,M) < ZERO) THEN
269                    WRITE(ERR_MSG, 1300) trim(iVar('BC_W_s',BCV,M)), '>'
270                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
271                 ENDIF
272              ENDDO
273     
274           END SELECT
275     
276      1300 FORMAT('Error 1300: Invalid flow direction. ',A,' should be ',   &
277              A,' zero. ',/'Please correct the mfix.dat file.')
278     
279           CALL FINL_ERR_MSG
280     
281           RETURN
282     
283      1000 FORMAT('Error 1000: Required input not specified: ',A,/'Please ',&
284              'correct the mfix.dat file.')
285     
286           END SUBROUTINE CHECK_BC_VEL_INFLOW
287     
288     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
289     !                                                                      !
290     ! Subroutine: CHECK_BC_VEL_OUTFLOW                                     !
291     ! Author: J.Musser                                    Date: 01-Mar-14  !
292     !                                                                      !
293     ! Purpose: Provided a detailed error message when the sum of volume    !
294     !                                                                      !
295     ! Comments:                                                            !
296     !     The velocities at the outflow face are fixed and the momentum    !
297     !     equations are not solved in the outflow cells. Since the flow    !
298     !     is out of the domain none of the other scalars should need to    !
299     !     be specified (e.g., mass fractions, void fraction, etc.,).       !
300     !     Such values will become defined according to their adjacent      !
301     !     fluid cell                                                       !
302     !                                                                      !
303     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
304           SUBROUTINE CHECK_BC_VEL_OUTFLOW(M_TOT, SKIP, BCV)
305     
306           USE param
307           USE param1
308           USE geometry
309           USE fldvar
310           USE physprop
311           USE run
312           USE bc
313           USE indices
314           USE funits
315           USE scalars
316           USE compar
317           USE sendrecv
318           USE discretelement
319           USE mfix_pic
320           USE cutcell
321     
322           use error_manager
323     
324           IMPLICIT NONE
325     
326     ! loop/variable indices
327           INTEGER, intent(in) :: BCV
328           INTEGER, intent(in) :: M_TOT
329           LOGICAL, intent(in) :: SKIP(DIM_M)
330     
331     ! Loop variable
332           INTEGER :: M
333     
334           CALL INIT_ERR_MSG("CHECK_BC_VEL_OUTFLOW")
335     
336     ! Check that gas phase velocities are defined.
337           IF(BC_U_G(BCV) == UNDEFINED) THEN
338              IF(NO_I) THEN
339                 BC_U_G(BCV) = ZERO
340              ELSE
341                 WRITE(ERR_MSG,1000) trim(iVar('BC_U_g',BCV))
342                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
343              ENDIF
344           ENDIF
345     
346           IF (BC_V_G(BCV) == UNDEFINED) THEN
347              IF (NO_J) THEN
348                 BC_V_G(BCV) = ZERO
349              ELSE
350                 WRITE(ERR_MSG,1000) trim(iVar('BC_V_g',BCV))
351                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
352              ENDIF
353           ENDIF
354     
355           IF(BC_W_G(BCV) == UNDEFINED) THEN
356              IF (NO_K) THEN
357                 BC_W_G(BCV) = ZERO
358              ELSE
359                 WRITE(ERR_MSG,1000) trim(iVar('BC_W_g',BCV))
360                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
361              ENDIF
362           ENDIF
363     
364     ! Check that solids phase velocities are defined.
365           DO M = 1, M_TOT
366              IF(BC_U_S(BCV,M) == UNDEFINED) THEN
367                 IF(SKIP(M) .OR. NO_I) THEN
368                    BC_U_S(BCV,M) = ZERO
369                 ELSE
370                    WRITE(ERR_MSG,1000) trim(iVar('BC_U_s',BCV,M))
371                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
372                 ENDIF
373              ENDIF
374     
375              IF(BC_V_S(BCV,M) == UNDEFINED) THEN
376                 IF(SKIP(M) .OR. NO_J) THEN
377                    BC_V_S(BCV,M) = ZERO
378                 ELSE
379                    WRITE(ERR_MSG,1000) trim(iVar('BC_V_s',BCV,M))
380                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
381                 ENDIF
382              ENDIF
383     
384              IF(BC_W_S(BCV,M) == UNDEFINED) THEN
385                 IF(SKIP(M) .OR. NO_K) THEN
386                    BC_W_S(BCV,M) = ZERO
387                 ELSE
388                    WRITE(ERR_MSG,1000) trim(iVar('BC_W_s',BCV,M))
389                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
390                 ENDIF
391              ENDIF
392           ENDDO
393     
394     
395     ! Check that gas phase velocities are consistent.
396           SELECT CASE (BC_PLANE(BCV))
397     
398           CASE ('W')
399              IF(BC_U_G(BCV) < ZERO) THEN
400                 WRITE(ERR_MSG,1300) trim(iVar('BC_U_g',BCV)), '>'
401                 CALL FLUSH_ERR_MSG
402              ENDIF
403              DO M = 1, M_TOT
404                 IF(BC_U_S(BCV,M) < ZERO) THEN
405                    WRITE(ERR_MSG, 1300) trim(iVar('BC_U_s',BCV,M)), '>'
406                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
407                 ENDIF
408              ENDDO
409     
410           CASE('E')
411              IF(BC_U_G(BCV) > ZERO) THEN
412                 WRITE(ERR_MSG,1300) trim(iVar('BC_U_g',BCV)), '<'
413                 CALL FLUSH_ERR_MSG
414              ENDIF
415              DO M = 1, M_TOT
416                 IF(BC_U_S(BCV,M) > ZERO) THEN
417                    WRITE(ERR_MSG, 1300) trim(iVar('BC_U_s',BCV,M)), '<'
418                   CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
419                 ENDIF
420              ENDDO
421     
422           CASE('S')
423              IF(BC_V_G(BCV) < ZERO) THEN
424                 WRITE(ERR_MSG,1300) trim(iVar('BC_V_g',BCV)), '>'
425                 CALL FLUSH_ERR_MSG
426              ENDIF
427              DO M = 1, M_TOT
428                 IF(BC_V_S(BCV,M) < ZERO) THEN
429                    WRITE(ERR_MSG, 1300) trim(iVar('BC_V_s',BCV,M)), '>'
430                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
431                 ENDIF
432              ENDDO
433     
434           CASE('N')
435              IF(BC_V_G(BCV) > ZERO) THEN
436                 WRITE(ERR_MSG,1300) trim(iVar('BC_V_g',BCV)), '<'
437                 CALL FLUSH_ERR_MSG
438              ENDIF
439              DO M = 1, M_TOT
440                 IF(BC_V_S(BCV,M) > ZERO) THEN
441                    WRITE(ERR_MSG, 1300) trim(iVar('BC_V_s',BCV,M)), '<'
442                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
443                 ENDIF
444              ENDDO
445     
446           CASE('B')
447              IF(BC_W_G(BCV) < ZERO) THEN
448                 WRITE(ERR_MSG,1300) trim(iVar('BC_W_g',BCV)), '>'
449                 CALL FLUSH_ERR_MSG
450              ENDIF
451              DO M = 1, M_TOT
452                 IF(BC_W_S(BCV,M) < ZERO) THEN
453                    WRITE(ERR_MSG, 1300) trim(iVar('BC_W_s',BCV,M)), '>'
454                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
455                 ENDIF
456              ENDDO
457     
458           CASE('T')
459              IF(BC_W_G(BCV) > ZERO) THEN
460                 WRITE(ERR_MSG,1300) trim(iVar('BC_W_g',BCV)), '<'
461                 CALL FLUSH_ERR_MSG
462              ENDIF
463              DO M = 1, M_TOT
464                 IF(BC_W_S(BCV,M) > ZERO) THEN
465                    WRITE(ERR_MSG, 1300) trim(iVar('BC_W_s',BCV,M)), '<'
466                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
467                 ENDIF
468              ENDDO
469     
470           END SELECT
471     
472      1300 FORMAT('Error 1300: Invalid flow direction. ',A,' should be ',   &
473              A,' zero. ',/'Please correct the mfix.dat file.')
474           CALL FINL_ERR_MSG
475     
476     
477           RETURN
478     
479     
480      1000 FORMAT('Error 1000: Required input not specified: ',A,/'Please ',&
481              'correct the mfix.dat file.')
482     
483           END SUBROUTINE CHECK_BC_VEL_OUTFLOW
484