File: RELATIVE:/../../../mfix.git/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, only: BC_TYPE
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 (TRIM(BC_TYPE(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      1001 FORMAT('Error 1001: Illegal or unknown input: ',A,' = ',A,/   &
287              'Please correct the mfix.dat file.')
288     
289           END SUBROUTINE CHECK_BC_VEL_INFLOW
290     
291     
292     
293     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
294     !                                                                      !
295     ! Subroutine: CHECK_BC_VEL_OUTFLOW                                     !
296     ! Author: J.Musser                                    Date: 01-Mar-14  !
297     !                                                                      !
298     ! Purpose: Provided a detailed error message when the sum of volume    !
299     !                                                                      !
300     ! Comments:                                                            !
301     !     The velocities at the outflow face are fixed and the momentum    !
302     !     equations are not solved in the outflow cells. Since the flow    !
303     !     is out of the domain none of the other scalars should need to    !
304     !     be specified (e.g., mass fractions, void fraction, etc.,).       !
305     !     Such values will become defined according to their adjacent      !
306     !     fluid cell                                                       !
307     !                                                                      !
308     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
309           SUBROUTINE CHECK_BC_VEL_OUTFLOW(M_TOT, SKIP, BCV)
310     
311           USE param
312           USE param1
313           USE geometry
314           USE fldvar
315           USE physprop
316           USE run
317           USE bc
318           USE indices
319           USE funits
320           USE scalars
321           USE compar
322           USE sendrecv
323           USE discretelement
324           USE mfix_pic
325           USE cutcell
326     
327           use error_manager
328     
329           IMPLICIT NONE
330     
331     ! loop/variable indices
332           INTEGER, intent(in) :: BCV
333           INTEGER, intent(in) :: M_TOT
334           LOGICAL, intent(in) :: SKIP(DIM_M)
335     
336     ! Loop variable
337           INTEGER :: M
338     
339           CALL INIT_ERR_MSG("CHECK_BC_VEL_OUTFLOW")
340     
341     ! Check that gas phase velocities are defined.
342           IF(BC_U_G(BCV) == UNDEFINED) THEN
343              IF(NO_I) THEN
344                 BC_U_G(BCV) = ZERO
345              ELSE
346                 WRITE(ERR_MSG,1000) trim(iVar('BC_U_g',BCV))
347                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
348              ENDIF
349           ENDIF
350     
351           IF (BC_V_G(BCV) == UNDEFINED) THEN
352              IF (NO_J) THEN
353                 BC_V_G(BCV) = ZERO
354              ELSE
355                 WRITE(ERR_MSG,1000) trim(iVar('BC_V_g',BCV))
356                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
357              ENDIF
358           ENDIF
359     
360           IF(BC_W_G(BCV) == UNDEFINED) THEN
361              IF (NO_K) THEN
362                 BC_W_G(BCV) = ZERO
363              ELSE
364                 WRITE(ERR_MSG,1000) trim(iVar('BC_W_g',BCV))
365                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
366              ENDIF
367           ENDIF
368     
369     ! Check that solids phase velocities are defined.
370           DO M = 1, M_TOT
371              IF(BC_U_S(BCV,M) == UNDEFINED) THEN
372                 IF(SKIP(M) .OR. NO_I) THEN
373                    BC_U_S(BCV,M) = ZERO
374                 ELSE
375                    WRITE(ERR_MSG,1000) trim(iVar('BC_U_s',BCV,M))
376                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
377                 ENDIF
378              ENDIF
379     
380              IF(BC_V_S(BCV,M) == UNDEFINED) THEN
381                 IF(SKIP(M) .OR. NO_J) THEN
382                    BC_V_S(BCV,M) = ZERO
383                 ELSE
384                    WRITE(ERR_MSG,1000) trim(iVar('BC_V_s',BCV,M))
385                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
386                 ENDIF
387              ENDIF
388     
389              IF(BC_W_S(BCV,M) == UNDEFINED) THEN
390                 IF(SKIP(M) .OR. NO_K) THEN
391                    BC_W_S(BCV,M) = ZERO
392                 ELSE
393                    WRITE(ERR_MSG,1000) trim(iVar('BC_W_s',BCV,M))
394                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
395                 ENDIF
396              ENDIF
397           ENDDO
398     
399     
400     ! Check that gas phase velocities are consistent.
401           SELECT CASE (BC_PLANE(BCV))
402     
403           CASE ('W')
404              IF(BC_U_G(BCV) < ZERO) THEN
405                 WRITE(ERR_MSG,1300) trim(iVar('BC_U_g',BCV)), '>'
406                 CALL FLUSH_ERR_MSG
407              ENDIF
408              DO M = 1, M_TOT
409                 IF(BC_U_S(BCV,M) < ZERO) THEN
410                    WRITE(ERR_MSG, 1300) trim(iVar('BC_U_s',BCV,M)), '>'
411                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
412                 ENDIF
413              ENDDO
414     
415           CASE('E')
416              IF(BC_U_G(BCV) > ZERO) THEN
417                 WRITE(ERR_MSG,1300) trim(iVar('BC_U_g',BCV)), '<'
418                 CALL FLUSH_ERR_MSG
419              ENDIF
420              DO M = 1, M_TOT
421                 IF(BC_U_S(BCV,M) > ZERO) THEN
422                    WRITE(ERR_MSG, 1300) trim(iVar('BC_U_s',BCV,M)), '<'
423                   CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
424                 ENDIF
425              ENDDO
426     
427           CASE('S')
428              IF(BC_V_G(BCV) < ZERO) THEN
429                 WRITE(ERR_MSG,1300) trim(iVar('BC_V_g',BCV)), '>'
430                 CALL FLUSH_ERR_MSG
431              ENDIF
432              DO M = 1, M_TOT
433                 IF(BC_V_S(BCV,M) < ZERO) THEN
434                    WRITE(ERR_MSG, 1300) trim(iVar('BC_V_s',BCV,M)), '>'
435                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
436                 ENDIF
437              ENDDO
438     
439           CASE('N')
440              IF(BC_V_G(BCV) > ZERO) THEN
441                 WRITE(ERR_MSG,1300) trim(iVar('BC_V_g',BCV)), '<'
442                 CALL FLUSH_ERR_MSG
443              ENDIF
444              DO M = 1, M_TOT
445                 IF(BC_V_S(BCV,M) > ZERO) THEN
446                    WRITE(ERR_MSG, 1300) trim(iVar('BC_V_s',BCV,M)), '<'
447                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
448                 ENDIF
449              ENDDO
450     
451           CASE('B')
452              IF(BC_W_G(BCV) < ZERO) THEN
453                 WRITE(ERR_MSG,1300) trim(iVar('BC_W_g',BCV)), '>'
454                 CALL FLUSH_ERR_MSG
455              ENDIF
456              DO M = 1, M_TOT
457                 IF(BC_W_S(BCV,M) < ZERO) THEN
458                    WRITE(ERR_MSG, 1300) trim(iVar('BC_W_s',BCV,M)), '>'
459                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
460                 ENDIF
461              ENDDO
462     
463           CASE('T')
464              IF(BC_W_G(BCV) > ZERO) THEN
465                 WRITE(ERR_MSG,1300) trim(iVar('BC_W_g',BCV)), '<'
466                 CALL FLUSH_ERR_MSG
467              ENDIF
468              DO M = 1, M_TOT
469                 IF(BC_W_S(BCV,M) > ZERO) THEN
470                    WRITE(ERR_MSG, 1300) trim(iVar('BC_W_s',BCV,M)), '<'
471                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
472                 ENDIF
473              ENDDO
474     
475           END SELECT
476     
477      1300 FORMAT('Error 1300: Invalid flow direction. ',A,' should be ',   &
478              A,' zero. ',/'Please correct the mfix.dat file.')
479           CALL FINL_ERR_MSG
480     
481     
482           RETURN
483     
484     
485      1000 FORMAT('Error 1000: Required input not specified: ',A,/'Please ',&
486              'correct the mfix.dat file.')
487     
488           END SUBROUTINE CHECK_BC_VEL_OUTFLOW
489