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