File: RELATIVE:/../../../mfix.git/model/flow_to_vel.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  Subroutine: FLOW_TO_VEL_NEW                                         !
4     !  Author: M. Syamlal                                 Date: 28-JUL-92  !
5     !                                                                      !
6     !  Purpose: Convert volumetric and mass flow rates to velocities       !
7     !     A specified mass flow rate is first converted to volumetric      !
8     !     flow rate. The volumetric flow rate is then converted to a       !
9     !     velocity.                                                        !
10     !                                                                      !
11     !    When both flow rates and velocities are specified, a consistency  !
12     !    check is done. The first time flow_to_vel is called in by setting !
13     !    the logical DO_VEL_CHECK to .TRUE.. If cut-cells are not used,    !
14     !    flow_to_vel is only called once.  When cut-cells are used,        !
15     !    flow_to_vel is called another time after the cut-cell pre-        !
16     !    processing stage. During, the second call, the velocity check     !
17     !    should not be performed, because the velocity assigned suring the !
18     !    first call will not match the flow rate. Therfore, when called    !
19     !    from cut_cell_preprocessing.f DO_VEL_CHECK is set to .FALSE..     !
20     !                                                                      !
21     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
22           SUBROUTINE FLOW_TO_VEL_NEW(DO_VEL_CHECK, M_TOT, SKIP, BCV)
23     
24           use param, only: DIM_M
25           use param1, only: UNDEFINED
26           use geometry, only: NO_I, NO_J, NO_K
27           use bc, only: BC_MASSFLOW_G
28           use bc, only: BC_VOLFLOW_G
29           use bc, only: BC_MASSFLOW_S
30           use bc, only: BC_VOLFLOW_S
31           use run, only: REINITIALIZING
32     
33           use error_manager
34           use toleranc
35     
36           IMPLICIT NONE
37     !-----------------------------------------------
38     ! Local variables
39     !-----------------------------------------------
40           LOGICAL, intent(in) :: DO_VEL_CHECK
41     
42     ! loop/variable indices
43           INTEGER, intent(in) :: M_TOT
44           LOGICAL, intent(in) :: SKIP(DIM_M)
45     
46     ! loop/variable indices
47           INTEGER, intent(in) :: BCV
48     
49     ! Whether any volumetric flow conversion was done
50           LOGICAL :: CONVERTED = .FALSE.
51     
52     ! Loop index
53           INTEGER :: M
54     
55     
56           CALL INIT_ERR_MSG("FLOW_TO_VEL_NEW")
57     
58     ! Mass flows rates are converted to volumetric flow rates.
59           IF(BC_MASSFLOW_G(BCV) /= UNDEFINED) &
60              CALL GAS_MASSFLOW_TO_VOLFLOW(BCV)
61     
62           DO M=1,M_TOT
63              IF(BC_MASSFLOW_S(BCV,M) /= UNDEFINED) &
64                 CALL SOLIDS_MASSFLOW_TO_VOLFLOW(BCV,M,SKIP(M))
65           ENDDO
66     
67     ! Volumetric flow rates are converted to velocities.
68           IF(BC_VOLFLOW_G(BCV) /= UNDEFINED) THEN
69              CALL GAS_VOLFLOW_TO_VELOCITY(DO_VEL_CHECK, BCV)
70     ! Set the conversion flag.
71              CONVERTED = .TRUE.
72           ENDIF
73     
74           DO M=1,M_TOT
75              IF(BC_VOLFLOW_S(BCV,M) /= UNDEFINED) THEN
76                 CALL SOLIDS_VOLFLOW_TO_VELOCITY(DO_VEL_CHECK,BCV,M,SKIP(M))
77     ! Set the conversion flag.
78                 CONVERTED = .TRUE.
79              ENDIF
80           ENDDO
81     
82           IF(CONVERTED .AND. .NOT.REINITIALIZING .AND. &
83              (NO_I.OR.NO_J.OR.NO_K)) THEN
84              WRITE(ERR_MSG, 1100)
85              CALL FLUSH_ERR_MSG
86           ENDIF
87     
88           CALL FINL_ERR_MSG
89     
90           RETURN
91     
92      1100 FORMAT('Warning 1100: Some volumetric or mass flow rates have ', &
93              'been converted',/'velocity. Ensure that the third (unused) ',&
94              'dimension in 2D simulations',/'is correctly specified (e.g.',&
95              ', in axisymmetric cylindrical coordinates',/'ZLENGTH = 2*Pi)')
96     
97           END SUBROUTINE FLOW_TO_VEL_NEW
98     
99     
100     
101     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
102     !                                                                      !
103     !  Subroutine: GAS_MASSFLOW_TO_VOLFLOW                                 !
104     !  Author: M. Syamlal                                 Date: 28-JUL-92  !
105     !                                                                      !
106     !  Purpose: Convert a gas phase BC input from a mass flow rate to      !
107     !  a volumetric flow rate.                                             !
108     !                                                                      !
109     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
110           SUBROUTINE GAS_MASSFLOW_TO_VOLFLOW(BCV)
111     
112           use bc, only: BC_MASSFLOW_g
113           use bc, only: BC_P_g
114           use bc, only: BC_T_g
115           use bc, only: BC_VOLFLOW_g
116           use bc, only: BC_X_g
117           use eos, only: EOSG
118           use error_manager
119           use param, only: DIMENSION_BC
120           use param1, only: UNDEFINED
121           use param1, only: ZERO
122           use physprop, only: CALC_MW
123           use physprop, only: MW_AVG, MW_g
124           use physprop, only: NMAX
125           use physprop, only: RO_g0
126           use scales, only: P_REF
127           use toleranc
128     
129           IMPLICIT NONE
130     
131           INTEGER, INTENT(in) :: BCV
132     
133     ! Volumetric flow rate computed from mass flow rate
134           DOUBLE PRECISION :: VOLFLOW
135     ! Average molecular weight
136           DOUBLE PRECISION :: MW
137     
138           CALL INIT_ERR_MSG("GAS_MASSFLOW_TO_VOLFLOW")
139     
140     ! No need to convert if the mass flow is zero.
141           IF(COMPARE(BC_MASSFLOW_G(BCV),ZERO)) THEN
142              VOLFLOW = ZERO
143     
144     ! Incompressible gas BC.
145           ELSEIF(RO_G0 /= UNDEFINED) THEN
146              VOLFLOW = BC_MASSFLOW_G(BCV)/RO_G0
147     
148     ! Well-defined compresible gas BC.
149           ELSEIF(BC_P_G(BCV)/=UNDEFINED .AND. BC_T_G(BCV)/=UNDEFINED) THEN
150              IF(MW_AVG == UNDEFINED) THEN
151                 MW = CALC_MW(BC_X_G,DIMENSION_BC,BCV,NMAX(0),MW_G)
152              ELSE
153                 MW = MW_AVG
154              ENDIF
155              VOLFLOW = BC_MASSFLOW_G(BCV) / &
156                 EOSG(MW,(BC_P_G(BCV)-P_REF),BC_T_G(BCV))
157     
158     ! Fails. This shouldn't happen as previous checks should catch any
159     ! errors leading to this routine.
160           ELSE
161              WRITE(ERR_MSG, 1100) BCV
162              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
163     
164      1100 FORMAT('Error 1100: Boundary condition ',I3,' failed sanity ',   &
165           'check.',/'Please report this to the MFIX mailing list.')
166     
167           ENDIF
168     
169     ! Check that a specified volumetric flow matches the calculated value.
170           IF(BC_VOLFLOW_G(BCV) /= UNDEFINED) THEN
171              IF(.NOT.COMPARE(VOLFLOW,BC_VOLFLOW_G(BCV))) THEN
172                 WRITE(ERR_MSG,1101) trim(iVar('BC_MASSFLOW_g',BCV)), BCV,  &
173                    VOLFLOW, BC_VOLFLOW_g(BCV)
174                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
175              ENDIF
176           ELSE
177     
178     ! Store the calculated volumetric flow rate.
179              BC_VOLFLOW_G(BCV) = VOLFLOW
180           ENDIF
181     
182      1101 FORMAT('Error 1101: Volumetric flow rate calculated from ',A,/   &
183              'does NOT equal the specified volumetric flow rate for BC',I3,&
184              /3x,'>>> Calculated: ',G14.7,/3x,'>>> Specified:  ',G14.7,/   &
185              'Please correct the mfix.dat file.')
186     
187     ! Clean up and return.
188           CALL FINL_ERR_MSG
189     
190           RETURN
191     
192           END SUBROUTINE GAS_MASSFLOW_TO_VOLFLOW
193     
194     
195     
196     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
197     !                                                                      !
198     !  Subroutine: SOLIDS_MASSFLOW_TO_VOLFLOW                              !
199     !  Author: M. Syamlal                                 Date: 28-JUL-92  !
200     !                                                                      !
201     !  Purpose: Convert solids phase BC input from a mass flow rate to     !
202     !  a volumetric flow rate.                                             !
203     !                                                                      !
204     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
205           SUBROUTINE SOLIDS_MASSFLOW_TO_VOLFLOW(BCV,M, SKIP_M)
206     
207           USE bc, only: BC_MASSFLOW_s
208           USE bc, only: BC_VOLFLOW_s
209           USE bc, only: BC_X_s
210           USE param1, only: UNDEFINED, ZERO
211           USE physprop, only: BASE_ROs
212           USE physprop, only: INERT_SPECIES
213           USE physprop, only: RO_s0
214           USE physprop, only: X_s0
215           use eos, only: EOSS
216           use error_manager
217           use toleranc
218     
219           IMPLICIT NONE
220     
221     ! loop/variable indices
222           INTEGER, INTENT(in) :: BCV, M
223           LOGICAL, INTENT(in) :: SKIP_M
224     
225     ! Volumetric flow rate computed from mass flow rate
226           DOUBLE PRECISION :: VOLFLOW
227     ! Index of inert species
228           INTEGER :: INERT
229     
230           CALL INIT_ERR_MSG("SOLIDS_MASSFLOW_TO_VOLFLOW")
231     
232     
233           IF(SKIP_M) THEN
234              WRITE(ERR_MSG,1100) M, BCV, trim(iVar("BC_MASSFLOW_S",BCV,M))
235              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
236           ENDIF
237     
238      1100 FORMAT('Error 1100: Solids phase ',I2,' has a specified mass ',  &
239              'flow rate',/'at BC ',I3,', ',A,'. But, both BC_ROP_s and ',&
240              'BC_EP_s are zero or undefined.',/'Please correct the ',&
241              'mfix.dat file.')
242     
243           IF(COMPARE(BC_MASSFLOW_S(BCV,M),ZERO)) THEN
244              VOLFLOW = ZERO
245     ! Constant solids density.
246           ELSEIF(RO_S0(M) /= UNDEFINED) THEN
247              VOLFLOW = BC_MASSFLOW_S(BCV,M)/RO_S0(M)
248           ELSE
249     ! Set an alias for the inert species.
250              INERT = INERT_SPECIES(M)
251     ! Variable solids density.
252              VOLFLOW = BC_MASSFLOW_S(BCV,M)/EOSS(BASE_ROs(M),              &
253                 X_s0(M,INERT), BC_X_S(BCV,M,INERT))
254           ENDIF
255     
256     ! If volumetric flow is also specified compare both
257           IF(BC_VOLFLOW_S(BCV,M) /= UNDEFINED) THEN
258              IF(.NOT.COMPARE(VOLFLOW,BC_VOLFLOW_S(BCV,M))) THEN
259                 WRITE(ERR_MSG,1101) trim(iVar('BC_MASSFLOW_S',BCV,M)), BCV, &
260                    VOLFLOW, BC_VOLFLOW_S(BCV,M)
261                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
262              ENDIF
263           ELSE
264              BC_VOLFLOW_S(BCV,M) = VOLFLOW
265           ENDIF
266     
267           CALL FINL_ERR_MSG
268     
269           RETURN
270     
271      1101 FORMAT('Error 1101: Volumetric flow rate calculated from ',A,/   &
272              'does NOT equal the specified volumetric flow rate for BC',I3,&
273              /3x,'>>> Calculated: ',G14.7,/3x,'>>> Specified:  ',G14.7,/   &
274              'Please correct the mfix.dat file.')
275     
276     
277           END SUBROUTINE SOLIDS_MASSFLOW_TO_VOLFLOW
278     
279     
280     
281     
282     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
283     !                                                                      !
284     !  Subroutine: GAS_VOLFLOW_TO_VELOCITY                                 !
285     !  Author: M. Syamlal                                 Date: 28-JUL-92  !
286     !                                                                      !
287     !  Purpose: Convert gas phase volumetric rate to a velocity.           !
288     !                                                                      !
289     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
290           SUBROUTINE GAS_VOLFLOW_TO_VELOCITY(DO_VEL_CHECK, BCV)
291     
292           USE param
293           USE param1
294           USE geometry
295           USE fldvar
296           USE physprop
297           USE run
298           USE bc
299           USE scales
300           USE indices
301           USE funits
302           USE compar
303           USE discretelement
304           USE mfix_pic
305     
306           use error_manager
307           use toleranc
308     
309           IMPLICIT NONE
310     !-----------------------------------------------
311     ! Local variables
312     !-----------------------------------------------
313     ! loop/variable indices
314           INTEGER, INTENT(in) :: BCV
315     
316     ! Whether any volumetric flow conversion was done
317           LOGICAL, INTENT(in) :: DO_VEL_CHECK
318     
319     
320           DOUBLE PRECISION :: SGN, OFF
321     
322     ! Velocity computed from volumetric flow rate
323           DOUBLE PRECISION :: VEL
324     !-----------------------------------------------
325           CALL INIT_ERR_MSG("GAS_VOLFLOW_TO_VELOCITY")
326     
327           SELECT CASE (trim(BC_TYPE(BCV)))
328           CASE ('MASS_INFLOW');  SGN =  ONE; OFF = ZERO
329           CASE ('MASS_OUTFLOW'); SGN = -ONE; OFF = ONE
330           CASE DEFAULT
331             write(*,*) 'error in GAS_VOLFLOW_TO_VELOCITY'
332             call mfix_exit(myPE)
333           END SELECT
334     
335           SELECT CASE (BC_PLANE(BCV))
336           CASE ('W'); SGN = -SGN
337           CASE ('S'); SGN = -SGN
338           CASE ('B'); SGN = -SGN
339           END SELECT
340     
341     ! Calculate the velocity based on the volumetric flow rate,
342     ! BC area and BC volume fraction.
343           VEL = SGN*BC_VOLFLOW_G(BCV)/(BC_AREA(BCV)*BC_EP_G(BCV))
344     
345     ! if the user also defined the boundary velocity through the plane, then
346     ! check that the calculated value agrees with the specified value. if
347     ! the user did not define the boundary velocity through the plane, then
348     ! if mass_inflow set the value of the boundary velocity to the
349     ! calculated value. otherwise do nothing.
350           IF(BC_PLANE(BCV) == 'W' .OR. BC_PLANE(BCV)== 'E') THEN
351     
352              IF(BC_U_G(BCV) /= UNDEFINED .AND. DO_VEL_CHECK) THEN
353                 IF(.NOT.COMPARE(VEL,BC_U_G(BCV))) THEN
354                    WRITE(ERR_MSG,1100) BCV, VEL, 'BC_U_g', BC_U_G(BCV)
355                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
356                 ENDIF
357              ELSE
358                 BC_U_G(BCV) = VEL
359                 BC_V_G(BCV) = OFF * BC_V_G(BCV)
360                 BC_W_G(BCV) = OFF * BC_W_G(BCV)
361              ENDIF
362     
363           ELSEIF(BC_PLANE(BCV) == 'S' .OR. BC_PLANE(BCV)== 'N') THEN
364              IF(BC_V_G(BCV) /= UNDEFINED .AND. DO_VEL_CHECK) THEN
365                 IF(.NOT.COMPARE(VEL,BC_V_G(BCV))) THEN
366                    WRITE(ERR_MSG, 1100) BCV, VEL, 'BC_V_g', BC_V_G(BCV)
367                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
368                 ENDIF
369              ELSE
370                 BC_V_G(BCV) = VEL
371                 BC_U_G(BCV) = OFF * BC_U_G(BCV)
372                 BC_W_G(BCV) = OFF * BC_W_G(BCV)
373              ENDIF
374     
375           ELSEIF(BC_PLANE(BCV) == 'B' .OR. BC_PLANE(BCV)== 'T') THEN
376              IF(BC_W_G(BCV) /= UNDEFINED .AND. DO_VEL_CHECK) THEN
377                 IF(.NOT.COMPARE(VEL, BC_W_G(BCV))) THEN
378                    WRITE(ERR_MSG, 1100) BCV, VEL, 'BC_W_g', BC_W_G(BCV)
379                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
380                 ENDIF
381              ELSE
382                 BC_W_G(BCV) = VEL
383                 BC_U_G(BCV) = OFF * BC_U_G(BCV)
384                 BC_V_G(BCV) = OFF * BC_V_G(BCV)
385              ENDIF
386     
387           ENDIF
388     
389           CALL FINL_ERR_MSG
390     
391           RETURN
392     
393      1100 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
394              ' Computed velocity is not equal to specified value',/,&
395              ' Value computed from vol. or mass flow  = ',G14.7,/,&
396              ' Specified value (',A,') = ',G14.7,/1X,70('*')/)
397     
398           END SUBROUTINE GAS_VOLFLOW_TO_VELOCITY
399     
400     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
401     !                                                                      !
402     !  Subroutine: SOLIDS_VOLFLOW_TO_VELOCITY                              !
403     !  Author: M. Syamlal                                 Date: 28-JUL-92  !
404     !                                                                      !
405     !  Purpose: Convert volumetric and mass flow rates to velocities       !
406     !     A specified mass flow rate is first converted to volumetric      !
407     !     flow rate. The volumetric flow rate is then converted to a       !
408     !     velocity.                                                        !
409     !                                                                      !
410     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
411           SUBROUTINE SOLIDS_VOLFLOW_TO_VELOCITY(DO_VEL_CHECK, BCV, M, SKIP_M)
412     
413           USE param
414           USE param1
415           USE geometry
416           USE fldvar
417           USE physprop
418           USE run
419           USE bc
420           USE scales
421           USE indices
422           USE funits
423           USE compar
424           USE discretelement
425           USE mfix_pic
426     
427           use error_manager
428           use toleranc
429     
430           IMPLICIT NONE
431     !-----------------------------------------------
432     ! Local variables
433     !-----------------------------------------------
434     ! loop/variable indices
435           INTEGER, INTENT(in) :: BCV, M
436     ! Logical to preform velocity check.
437           LOGICAL, INTENT(in) :: DO_VEL_CHECK, SKIP_M
438     
439     ! Velocity computed from volumetric flow rate
440           DOUBLE PRECISION :: VEL
441     
442           DOUBLE PRECISION :: SGN, OFF
443     
444     !-----------------------------------------------
445     
446           CALL INIT_ERR_MSG("SOLIDS_VOLFLOW_TO_VELOCITY")
447     
448           IF(SKIP_M) THEN
449              WRITE(ERR_MSG,1100) M, BCV, trim(iVar("BC_VOLFLOW_S",BCV,M))
450              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
451           ENDIF
452     
453      1100 FORMAT('Error 1100: Solids phase ',I2,' has a specified ',       &
454              'volumetric flow rate',/'at BC ',I3,', ',A,'. But, both ',&
455              'BC_ROP_s and BC_EP_s are zero or undefined.',/'Please ',&
456              'the mfix.dat file.')
457     
458           SELECT CASE (trim(BC_TYPE(BCV)))
459           CASE ('MASS_INFLOW');  SGN =  ONE; OFF = ZERO
460           CASE ('MASS_OUTFLOW'); SGN = -ONE; OFF = ONE
461           CASE DEFAULT
462             write(*,*) 'error in SOLIDS_VOLFLOW_TO_VELOCITY'
463             call mfix_exit(myPE)
464           END SELECT
465     
466           SELECT CASE (BC_PLANE(BCV))
467           CASE ('W'); SGN = -SGN
468           CASE ('S'); SGN = -SGN
469           CASE ('B'); SGN = -SGN
470           END SELECT
471     
472           IF(BC_EP_S(BCV,M) /= ZERO) THEN
473              VEL = SGN * BC_VOLFLOW_S(BCV,M)/(BC_AREA(BCV)*BC_EP_S(BCV,M))
474           ELSE
475              IF(BC_VOLFLOW_S(BCV,M) == ZERO) THEN
476                 VEL = ZERO
477              ELSE
478                 IF(DMP_LOG)WRITE (UNIT_LOG, 1101) BCV, M
479                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
480              ENDIF
481           ENDIF
482     
483      1101 FORMAT('Error 1101: BC No:',I2,' Non-zero vol. or mass flow ',&
484              'specified with BC_ROP_s', I1,' = 0.')
485     
486           IF(BC_PLANE(BCV) == 'W' .OR. BC_PLANE(BCV)== 'E') THEN
487              IF(BC_U_S(BCV,M) /= UNDEFINED .AND. DO_VEL_CHECK) THEN
488                 IF(.NOT.COMPARE(VEL, BC_U_S(BCV,M))) THEN
489                   WRITE(ERR_MSG, 1300) BCV, (-VEL), 'BC_U_s', M, BC_U_S(BCV,M)
490                   CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
491                 ENDIF
492              ELSE
493                 BC_U_S(BCV,M) = VEL
494                 BC_V_S(BCV,M) = OFF * BC_V_S(BCV,M)
495                 BC_W_S(BCV,M) = OFF * BC_W_S(BCV,M)
496              ENDIF
497     
498           ELSEIF(BC_PLANE(BCV) == 'S' .OR. BC_PLANE(BCV)== 'N') THEN
499              IF(BC_V_S(BCV,M) /= UNDEFINED .AND. DO_VEL_CHECK) THEN
500                 IF(.NOT.COMPARE(VEL,BC_V_S(BCV,M))) THEN
501                    WRITE(ERR_MSG,1300) BCV, VEL, 'BC_V_s', M, BC_V_S(BCV,M)
502                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
503                 ENDIF
504              ELSE
505                 BC_V_S(BCV,M) = VEL
506                 BC_U_S(BCV,M) = OFF * BC_U_S(BCV,M)
507                 BC_W_S(BCV,M) = OFF * BC_W_S(BCV,M)
508              ENDIF
509     
510           ELSEIF(BC_PLANE(BCV) == 'B' .OR. BC_PLANE(BCV)== 'T') THEN
511              IF(BC_W_S(BCV,M) /= UNDEFINED .AND. DO_VEL_CHECK) THEN
512                 IF(.NOT.COMPARE(VEL,BC_W_S(BCV,M))) THEN
513                    WRITE(ERR_MSG, 1300) BCV, VEL, 'BC_W_s', M, BC_W_S(BCV,M)
514                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
515                 ENDIF
516              ELSE
517                 BC_W_S(BCV,M) = VEL
518                 BC_U_S(BCV,M) = OFF * BC_U_S(BCV,M)
519                 BC_V_S(BCV,M) = OFF * BC_V_S(BCV,M)
520              ENDIF
521           ENDIF
522     
523     
524           CALL FINL_ERR_MSG
525     
526           RETURN
527     
528      1300 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
529              ' Computed velocity is not equal to specified value',/,&
530              ' Value computed from vol. or mass flow  = ',G14.7,/,&
531              ' Specified value (',A,I1,') = ',G14.7,/1X,70('*')/)
532     
533           END SUBROUTINE SOLIDS_VOLFLOW_TO_VELOCITY
534     
535     
536     
537     
538     
539     
540     
541     
542     
543     
544     
545     
546     
547     
548     
549     
550     
551     
552     
553     
554     
555     
556     
557     
558     
559     
560     
561     
562     
563     
564     
565     
566     
567     
568     
569     
570     
571     
572     
573     
574     
575     
576     
577     
578     
579     
580     
581     
582     
583     
584     
585     
586     
587     
588     
589     
590     
591     
592     
593     
594     
595     
596     
597     
598     
599     
600     
601     
602     
603     
604     
605     
606     
607     
608     
609     
610     
611     
612     
613     
614     
615     
616     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
617     !                                                                      C
618     !  Subroutine: FLOW_TO_VEL                                             C
619     !  Purpose: Convert volumetric and mass flow rates to velocities       C
620     !     A specified mass flow rate is first converted to volumetric      C
621     !     flow rate. The volumetric flow rate is then converted to a       C
622     !     velocity.                                                        C
623     !                                                                      C
624     !  Author: M. Syamlal                                 Date: 28-JUL-92  C
625     !  Reviewer: W. Rogers                                Date: 11-DEC-92  C
626     !                                                                      C
627     !  Revision Number:                                                    C
628     !  Purpose:                                                            C
629     !  Author:                                            Date: dd-mmm-yy  C
630     !  Reviewer:                                          Date: dd-mmm-yy  C
631     !                                                                      C
632     !  Literature/Document References:                                     C
633     !  Variables referenced:                                               C
634     !  Variables modified:                                                 C
635     !  Local variables:                                                    C
636     !                                                                      C
637     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
638     
639           SUBROUTINE FLOW_TO_VEL(DO_VEL_CHECK)
640     
641     !-----------------------------------------------
642     ! Modules
643     !-----------------------------------------------
644           USE bc
645           USE compar
646           USE discretelement
647           USE eos, ONLY: EOSG, EOSS
648           USE fldvar
649           USE funits
650           USE geometry
651           USE indices
652           USE mfix_pic
653           USE param
654           USE param1
655           USE physprop
656           USE run
657           USE scales
658           USE toleranc
659     
660           IMPLICIT NONE
661     !-----------------------------------------------
662     ! Local variables
663     !-----------------------------------------------
664     ! loop/variable indices
665           INTEGER :: BCV, M
666     ! Volumetric flow rate computed from mass flow rate
667           DOUBLE PRECISION :: VOLFLOW
668     ! Velocity computed from volumetric flow rate
669           DOUBLE PRECISION :: VEL
670     ! Solids phase volume fraction
671           DOUBLE PRECISION :: EPS
672     ! Whether any volumetric flow conversion was done
673           LOGICAL :: CONVERTED,DO_VEL_CHECK
674     ! Average molecular weight
675           DOUBLE PRECISION :: MW
676     ! Index of inert species
677           INTEGER :: INERT
678     ! Solids density at BC plane
679           DOUBLE PRECISION :: BC_ROs
680     !-----------------------------------------------
681     
682     ! When both flow rates and velocities are specified, a consistency check is done
683     ! The first time flow_to_vel is called in
684     ! by setting the logical DO_VEL_CHECK to .TRUE.
685     ! If cut-cells are not used, flow_to_vel is only called once.
686     ! When cut-cells are used, flow_to_vel is called another time after
687     ! the cut-cell preprocessing stage. During, the second call, the velocity check
688     ! should not be performed, because the velocity assigned suring the first call
689     ! will not match the flow rate. Therfore, when called from cut_cell_preprocessing.f
690     ! DO_VEL_CHECK is set to .FALSE.
691     
692     ! initialize
693           VOLFLOW = UNDEFINED
694     
695           CONVERTED = .FALSE.
696           DO BCV = 1, DIMENSION_BC
697              IF (BC_DEFINED(BCV)) THEN
698                 IF (BC_TYPE(BCV)=='MASS_INFLOW' .OR.&
699                     BC_TYPE(BCV)=='MASS_OUTFLOW') THEN
700     
701     ! If gas mass flow is defined convert it to volumetric flow
702     ! ---------------------------------------------------------------->>>
703                    IF (BC_MASSFLOW_G(BCV) /= UNDEFINED) THEN
704                       IF (RO_G0 /= UNDEFINED) THEN
705                          VOLFLOW = BC_MASSFLOW_G(BCV)/RO_G0
706                       ELSE
707                          IF (BC_P_G(BCV)/=UNDEFINED .AND. &
708                              BC_T_G(BCV)/=UNDEFINED) THEN
709                             IF (MW_AVG == UNDEFINED) THEN
710                                MW = CALC_MW(BC_X_G,DIMENSION_BC,BCV,NMAX(0),MW_G)
711                             ELSE
712                                MW = MW_AVG
713                             ENDIF
714                             VOLFLOW = BC_MASSFLOW_G(BCV)/&
715                                EOSG(MW,(BC_P_G(BCV)-P_REF),BC_T_G(BCV))
716     
717                          ELSE
718     ! for mass_inflow, check_data_07 has already required that either ro_g0
719     ! be defined or bc_p_g and bc_t_g be defined. So this branch will never
720     ! be entered when mass_inflow. if mass_outflow, ro_g0 and either bc_p_g,
721     ! or bc_t_g, or both, must be undefined.
722     ! if the code comes through this branch without exiting and massflow is
723     ! non-zero, then volflow will remain undefined.
724     
725                             IF (BC_TYPE(BCV) == 'MASS_OUTFLOW') THEN ! this check seems unnecessary
726     
727     ! if no mass flow through the boundary, the volume flow is zero.
728     ! otherwise check that the value of velocity component through the
729     ! boundary plane is defined, and is non-zero (otherwise would be caught
730     ! by bc_massflow_g == zero branch)
731                                IF (BC_MASSFLOW_G(BCV) == ZERO) THEN
732                                   VOLFLOW = ZERO
733                                ELSEIF (BC_PLANE(BCV)=='W' .OR. &
734                                        BC_PLANE(BCV)=='E') THEN
735                                   IF (BC_U_G(BCV)==UNDEFINED .OR. &
736                                       BC_U_G(BCV)/=ZERO) THEN
737                                      IF(DMP_LOG)WRITE (UNIT_LOG, 1010)&
738                                         BCV, 'BC_U_g'
739                                      call mfix_exit(myPE)
740                                   ENDIF
741                                ELSEIF (BC_PLANE(BCV)=='N' .OR. &
742                                        BC_PLANE(BCV)=='S') THEN
743                                   IF (BC_V_G(BCV)==UNDEFINED .OR. &
744                                       BC_V_G(BCV)/=ZERO) THEN
745                                      IF(DMP_LOG)WRITE (UNIT_LOG, 1010) &
746                                         BCV, 'BC_V_g'
747                                      call mfix_exit(myPE)
748                                   ENDIF
749                                ELSEIF (BC_PLANE(BCV)=='T' .OR. &
750                                        BC_PLANE(BCV)=='B') THEN
751                                   IF (BC_W_G(BCV)==UNDEFINED .OR. &
752                                       BC_W_G(BCV)/=ZERO) THEN
753                                      IF(DMP_LOG)WRITE (UNIT_LOG, 1010) &
754                                         BCV, 'BC_W_g'
755                                      call mfix_exit(myPE)
756                                   ENDIF
757                                ENDIF
758                             ELSE   ! else branch if(bc_type='mass_outflow')
759     ! not sure how this branch will be reached by mass_inflow
760                                IF(DMP_LOG)WRITE (UNIT_LOG, 1020) BCV
761                                call mfix_exit(myPE)
762                             ENDIF   ! end if (bc_type(bcv)=='mass_outflow')
763                          ENDIF
764                       ENDIF   ! end if/else (ro_g0 /=undefined)
765     
766     ! If volumetric flow is also specified compare both
767                       IF (BC_VOLFLOW_G(BCV) /= UNDEFINED) THEN
768     ! volflow may be undefined for mass_outflow boundaries wherein ro_g0 and
769     ! either bc_p_g, or bc_t_g, or both, were undefined.
770                          IF (.NOT.COMPARE(VOLFLOW,BC_VOLFLOW_G(BCV))) THEN
771                             IF(DMP_LOG)WRITE (UNIT_LOG, 1000) BCV, &
772                                VOLFLOW, BC_VOLFLOW_G(BCV)
773                             call mfix_exit(myPE)
774                          ENDIF
775                       ELSE
776                          BC_VOLFLOW_G(BCV) = VOLFLOW
777                       ENDIF
778                    ENDIF   ! end if (bc_massflow_g(bcv) /= undefined)
779     ! end gas mass flow conversion to volumetric flow
780     ! ----------------------------------------------------------------<<<
781     
782     ! If gas volumetric flow is defined convert it to velocity
783     ! ---------------------------------------------------------------->>>
784                    IF (BC_VOLFLOW_G(BCV) /= UNDEFINED) THEN
785     
786                       IF (BC_EP_G(BCV) /= UNDEFINED) THEN
787     ! volumetric flow rate and void fraction at the boundary are specified
788     ! (known) so that the corresponding gas velocity through the boundary
789     ! plane may be calculated.
790                          VEL = BC_VOLFLOW_G(BCV)/(BC_AREA(BCV)*BC_EP_G(BCV))
791                       ELSE
792     ! for mass_inflow, check_data_07 has already required that bc_ep_g be
793     ! defined (i.e., this section will not happen for MI). For mass_outflow
794     ! the routine will exit here if bc_ep_g is not defined.  However, for
795     ! this MO the boundary velocities must also be set or mfix will exit due
796     ! to later checks in check_data_07.
797                          RETURN
798                       ENDIF
799     
800     ! if the user also defined the boundary velocity through the plane, then
801     ! check that the calculated value agrees with the specified value. if
802     ! the user did not define the boundary velocity through the plane, then
803     ! if mass_inflow set the value of the boundary velocity to the
804     ! calculated value. otherwise do nothing.
805                       CONVERTED = .TRUE.
806                       SELECT CASE (TRIM(BC_PLANE(BCV)))
807                       CASE ('W')
808                          IF (BC_U_G(BCV) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
809                             IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
810                                 .NOT.COMPARE((-VEL),BC_U_G(BCV))) THEN
811                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV,&
812                                   (-VEL), 'BC_U_g', BC_U_G(BCV)
813                                call mfix_exit(myPE)
814                             ENDIF
815                             IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
816                                 .NOT.COMPARE(VEL,BC_U_G(BCV))) THEN
817                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, &
818                                   VEL, 'BC_U_g', BC_U_G(BCV)
819                                call mfix_exit(myPE)
820                             ENDIF
821                          ELSE
822                             IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
823                                BC_U_G(BCV) = -VEL
824                                BC_V_G(BCV) = ZERO
825                                BC_W_G(BCV) = ZERO
826                             ELSE
827                                BC_U_G(BCV) = VEL
828                             ENDIF
829                          ENDIF
830                       CASE ('E')
831                          IF (BC_U_G(BCV) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
832                             IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
833                                 .NOT.COMPARE(VEL,BC_U_G(BCV))) THEN
834                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, VEL,&
835                                   'BC_U_g', BC_U_G(BCV)
836                                call mfix_exit(myPE)
837                             ENDIF
838                             IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
839                                 .NOT.COMPARE((-VEL),BC_U_G(BCV))) THEN
840                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, &
841                                   (-VEL), 'BC_U_g', BC_U_G(BCV)
842                                call mfix_exit(myPE)
843                             ENDIF
844                          ELSE
845                             IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
846                                BC_U_G(BCV) = VEL
847                                BC_V_G(BCV) = ZERO
848                                BC_W_G(BCV) = ZERO
849                             ELSE
850                                BC_U_G(BCV) = -VEL
851                             ENDIF
852                          ENDIF
853                       CASE ('S')
854                          IF (BC_V_G(BCV) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
855                             IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
856                                 .NOT.COMPARE((-VEL),BC_V_G(BCV))) THEN
857                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV,&
858                                   (-VEL), 'BC_V_g', BC_V_G(BCV)
859                                call mfix_exit(myPE)
860                             ENDIF
861                             IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
862                                 .NOT.COMPARE(VEL,BC_V_G(BCV))) THEN
863                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, VEL,&
864                                   'BC_V_g', BC_V_G(BCV)
865                                call mfix_exit(myPE)
866                             ENDIF
867                          ELSE
868                             IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
869                                BC_U_G(BCV) = ZERO
870                                BC_V_G(BCV) = -VEL
871                                BC_W_G(BCV) = ZERO
872                             ELSE
873                                BC_V_G(BCV) = VEL
874                             ENDIF
875                          ENDIF
876                       CASE ('N')
877                          IF (BC_V_G(BCV) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
878                             IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
879                                 .NOT.COMPARE(VEL,BC_V_G(BCV))) THEN
880                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, VEL,&
881                                   'BC_V_g', BC_V_G(BCV)
882                                call mfix_exit(myPE)
883                             ENDIF
884                             IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
885                                 .NOT.COMPARE((-VEL),BC_V_G(BCV))) THEN
886                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, &
887                                   (-VEL), 'BC_V_g', BC_V_G(BCV)
888                                call mfix_exit(myPE)
889                             ENDIF
890                          ELSE
891                             IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
892                                BC_U_G(BCV) = ZERO
893                                BC_V_G(BCV) = VEL
894                                BC_W_G(BCV) = ZERO
895                             ELSE
896                                BC_V_G(BCV) = -VEL
897                             ENDIF
898                          ENDIF
899                       CASE ('B')
900                          IF (BC_W_G(BCV) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
901                             IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND.  &
902                                 .NOT.COMPARE((-VEL),BC_W_G(BCV))) THEN
903                                IF(DMP_LOG)WRITE (UNIT_LOG, 1100) BCV,&
904                                   (-VEL), 'BC_W_g', BC_W_G(BCV)
905                                call mfix_exit(myPE)
906                             ENDIF
907                             IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
908                                 .NOT.COMPARE(VEL,BC_W_G(BCV))) THEN
909                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, VEL,&
910                                   'BC_W_g', BC_W_G(BCV)
911                                call mfix_exit(myPE)
912                             ENDIF
913                          ELSE
914                             IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
915                                BC_U_G(BCV) = ZERO
916                                BC_V_G(BCV) = ZERO
917                                BC_W_G(BCV) = -VEL
918                             ELSE
919                                BC_W_G(BCV) = VEL
920                             ENDIF
921                          ENDIF
922                       CASE ('T')
923                          IF (BC_W_G(BCV) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
924                             IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
925                                 .NOT.COMPARE(VEL,BC_W_G(BCV))) THEN
926                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV, VEL,&
927                                   'BC_W_g', BC_W_G(BCV)
928                                call mfix_exit(myPE)
929                             ENDIF
930                             IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
931                                 .NOT.COMPARE((-VEL),BC_W_G(BCV))) THEN
932                                IF(DMP_LOG) WRITE (UNIT_LOG, 1100) BCV,&
933                                   (-VEL), 'BC_W_g', BC_W_G(BCV)
934                                call mfix_exit(myPE)
935                             ENDIF
936                          ELSE
937                             IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
938                                BC_U_G(BCV) = ZERO
939                                BC_V_G(BCV) = ZERO
940                                BC_W_G(BCV) = VEL
941                             ELSE
942                                BC_W_G(BCV) = -VEL
943                             ENDIF
944                          ENDIF
945                       END SELECT    ! end select (trim(bc_plane(bcv))
946                    ENDIF   ! end if (bc_volflow_g(bcv)/=undefined)
947     ! end gas volumetric flow conversion to velocity
948     ! ----------------------------------------------------------------<<<
949     
950                    IF (.NOT.DISCRETE_ELEMENT .OR. (DISCRETE_ELEMENT &
951                        .AND. DES_CONTINUUM_HYBRID).OR. (DISCRETE_ELEMENT &
952                        .AND. MPPIC)) THEN
953     ! The following quantities should not be required for DEM simulations
954     ! To ensure this is the case leave them undefined in mfix.dat
955     ! MPPIC BC's are based on Two Fluid Model based specification.
956     ! So call the below for MPPIC.
957     
958     ! Do flow conversions for solids phases
959                    DO M = 1, SMAX
960     
961     ! initialize
962                       VOLFLOW = UNDEFINED
963                       BC_ROs = UNDEFINED
964     
965                       IF((BC_MASSFLOW_S(BCV,M) /= UNDEFINED) .OR.          &
966                          (BC_VOLFLOW_S(BCV,M)  /= UNDEFINED)) THEN
967     
968     ! Calculate the solid density.
969                          BC_ROs = UNDEFINED
970                          IF(SOLVE_ROs(M))THEN
971                             INERT = INERT_SPECIES(M)
972     ! Verify that the species mass fraction for the inert material is not
973     ! zero in the IC region when the solids is present.
974                             IF(BC_X_S(BCV,M,INERT) == ZERO) THEN
975                                IF(BC_ROP_S(BCV,M) /= ZERO) THEN
976                                   IF(DMP_LOG) THEN
977                                      WRITE(*,1401) M, BCV
978                                      WRITE(UNIT_LOG,1401) M, BCV
979                                   ENDIF
980                                   CALL MFIX_EXIT(myPE)
981                                ELSE
982     ! If the solids isn't present, give it the baseline density.
983                                   BC_ROs = BASE_ROs(M)
984                                ENDIF
985                             ELSE
986     ! Calculate the solids density.
987                                BC_ROs = EOSS(BASE_ROs(M),X_s0(M,INERT),    &
988                                   BC_X_S(BCV,M,INERT))
989                             ENDIF
990                          ELSE
991                             BC_ROs = RO_S0(M)
992                          ENDIF
993                       ELSE
994     ! Set a generic value to pass through sanity check.
995                          BC_ROs = RO_S0(M)
996                       ENDIF
997     
998     
999     ! If solids mass flow is defined convert it to volumetric flow
1000     ! ---------------------------------------------------------------->>>
1001                       IF (BC_MASSFLOW_S(BCV,M) /= UNDEFINED) THEN
1002     
1003     ! Sanity check on solids phase density.
1004                          IF(BC_ROs <= ZERO .OR. BC_ROs==UNDEFINED) THEN
1005                             IF(DMP_LOG)THEN
1006                                WRITE(*,1401) M, BCV
1007                                WRITE(UNIT_LOG,1401) M, BCV
1008                             ENDIF
1009                             CALL MFIX_EXIT(myPE)
1010                          ENDIF
1011     
1012                          VOLFLOW = BC_MASSFLOW_S(BCV,M)/BC_ROs
1013     
1014     ! If volumetric flow is also specified compare both
1015                          IF (BC_VOLFLOW_S(BCV,M) /= UNDEFINED) THEN
1016                             IF (.NOT.COMPARE(VOLFLOW,BC_VOLFLOW_S(BCV,M))) THEN
1017                                IF(DMP_LOG) WRITE(UNIT_LOG,1200) &
1018                                   BCV,VOLFLOW,M,BC_VOLFLOW_S(BCV,M)
1019                                call mfix_exit(myPE)
1020                             ENDIF
1021                          ELSE
1022                             BC_VOLFLOW_S(BCV,M) = VOLFLOW
1023                          ENDIF
1024                       ENDIF   ! end if (bc_massflow_s(bcv,m)/=undefined)
1025     ! end solids mass flow conversion to volumetric flow
1026     ! ----------------------------------------------------------------<<<
1027     
1028     
1029     ! if possible, define bulk density based on ep_g. note if mass_outflow,
1030     ! bc_ep_g may still be undefined at this point wherein bc_rop_s would
1031     ! become set as 1-undefined. to avoid this issue, a check for bc_ep_g
1032     ! defined was added. note if mass_inflow, check_data_07 later performs
1033     ! the same calculations as below but with additional checks.
1034                       IF (BC_ROP_S(BCV,M) == UNDEFINED .AND. &
1035                          BC_EP_G(BCV) /= UNDEFINED ) THEN
1036                          IF (BC_EP_G(BCV) == ONE) THEN
1037                              BC_ROP_S(BCV,M) = ZERO
1038                          ELSEIF (SMAX == 1 .AND. &
1039                                   .NOT.DES_CONTINUUM_HYBRID) THEN
1040     
1041     ! Sanity check on solids phase density.
1042                             IF(BC_ROs <= ZERO .OR. BC_ROs==UNDEFINED) THEN
1043                                IF(DMP_LOG)THEN
1044                                   WRITE(*,1401) M, BCV
1045                                   WRITE(UNIT_LOG,1401) M, BCV
1046                                ENDIF
1047                                CALL MFIX_EXIT(myPE)
1048                             ENDIF
1049     
1050     
1051     ! bulk density must be explicitly defined for hybrid model and cannot be
1052     ! defined from 1-bc_ep_g
1053                              BC_ROP_S(BCV,M) = (ONE - BC_EP_G(BCV))*BC_ROs
1054                          ENDIF
1055                       ENDIF
1056     ! note bc_rop_s may still be undefined at this point
1057     
1058     
1059     ! If solids volumetric flow is defined convert it to velocity
1060     ! ---------------------------------------------------------------->>>
1061                       IF (BC_VOLFLOW_S(BCV,M) /= UNDEFINED) THEN
1062     
1063     ! Sanity check on solids phase density.
1064                          IF(BC_ROs <= ZERO .OR. BC_ROs==UNDEFINED) THEN
1065                             IF(DMP_LOG)THEN
1066                                WRITE(*,1401) M, BCV
1067                                WRITE(UNIT_LOG,1401) M, BCV
1068                             ENDIF
1069                             CALL MFIX_EXIT(myPE)
1070                          ENDIF
1071     
1072                          IF (BC_ROP_S(BCV,M) /= UNDEFINED) THEN
1073                             EPS = BC_ROP_S(BCV,M)/BC_ROs
1074     ! volumetric flow rate and solids volume fraction at the boundary are
1075     ! specified (known) so that the corresponding solids velocity through
1076     ! the boundary plane may be calculated.
1077                             IF (EPS /= ZERO) THEN
1078                                VEL = BC_VOLFLOW_S(BCV,M)/(BC_AREA(BCV)*EPS)
1079                             ELSE
1080                                IF (BC_VOLFLOW_S(BCV,M) == ZERO) THEN
1081                                   VEL = ZERO
1082                                ELSE
1083                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1250) BCV, M
1084                                   call mfix_exit(myPE)
1085                                ENDIF
1086                             ENDIF
1087                          ELSE   ! bc_rop_s is undefined
1088                             IF (BC_VOLFLOW_S(BCV,M) == ZERO) THEN
1089                                VEL = ZERO
1090                             ELSE
1091     ! if bc_rop_s is undefined and bc_volflow_s is not zero exit MFIX with
1092     ! error
1093                                IF(DMP_LOG)WRITE (UNIT_LOG, 1260) BCV, M
1094                                call mfix_exit(myPE)
1095                             ENDIF
1096                          ENDIF
1097     
1098     ! if the user also defined the boundary velocity through the plane, then
1099     ! check that the calculated value agrees with the specified value. if
1100     ! the user did not define the boundary velocity through the plane, then
1101     ! if mass_inflow set the value of the boundary velocity to the
1102     ! calculated value. otherwise do nothing.
1103                          CONVERTED = .TRUE.
1104                          SELECT CASE (TRIM(BC_PLANE(BCV)))
1105                          CASE ('W')
1106                             IF (BC_U_S(BCV,M) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
1107                                IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
1108                                    .NOT.COMPARE((-VEL),BC_U_S(BCV,M))) THEN
1109                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1110                                      (-VEL), 'BC_U_s', M, BC_U_S(BCV,M)
1111                                   call mfix_exit(myPE)
1112                                ENDIF
1113                                IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
1114                                    .NOT.COMPARE(VEL,BC_U_S(BCV,M))) THEN
1115                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1116                                      VEL, 'BC_U_s', M, BC_U_S(BCV,M)
1117                                   call mfix_exit(myPE)
1118                                ENDIF
1119                             ELSE
1120                                IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
1121                                   BC_U_S(BCV,M) = -VEL
1122                                   BC_V_S(BCV,M) = ZERO
1123                                   BC_W_S(BCV,M) = ZERO
1124                                ELSE
1125                                   BC_U_S(BCV,M) = VEL
1126                                ENDIF
1127                             ENDIF
1128                          CASE ('E')
1129                             IF (BC_U_S(BCV,M) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
1130                                IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
1131                                    .NOT.COMPARE(VEL,BC_U_S(BCV,M))) THEN
1132                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1133                                      VEL, 'BC_U_s', M, BC_U_S(BCV,M)
1134                                   call mfix_exit(myPE)
1135                                ENDIF
1136                                IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
1137                                    .NOT.COMPARE((-VEL),BC_U_S(BCV,M))) THEN
1138                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1139                                      (-VEL), 'BC_U_s', M, BC_U_S(BCV,M)
1140                                   call mfix_exit(myPE)
1141                                ENDIF
1142                             ELSE
1143                                IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
1144                                   BC_U_S(BCV,M) = VEL
1145                                   BC_V_S(BCV,M) = ZERO
1146                                   BC_W_S(BCV,M) = ZERO
1147                                ELSE
1148                                   BC_U_S(BCV,M) = -VEL
1149                                ENDIF
1150                             ENDIF
1151                          CASE ('S')
1152                             IF (BC_V_S(BCV,M) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
1153                                IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
1154                                    .NOT.COMPARE((-VEL),BC_V_S(BCV,M))) THEN
1155                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1156                                      (-VEL), 'BC_V_s', M, BC_V_S(BCV,M)
1157                                   call mfix_exit(myPE)
1158                                ENDIF
1159                                IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
1160                                    .NOT.COMPARE(VEL,BC_V_S(BCV,M))) THEN
1161                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1162                                      VEL, 'BC_V_s', M, BC_V_S(BCV,M)
1163                                   call mfix_exit(myPE)
1164                                ENDIF
1165                             ELSE
1166                                IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
1167                                   BC_U_S(BCV,M) = ZERO
1168                                   BC_V_S(BCV,M) = -VEL
1169                                   BC_W_S(BCV,M) = ZERO
1170                                ELSE
1171                                   BC_V_S(BCV,M) = VEL
1172                                ENDIF
1173                             ENDIF
1174                          CASE ('N')
1175                             IF (BC_V_S(BCV,M) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
1176                                IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
1177                                    .NOT.COMPARE(VEL,BC_V_S(BCV,M))) THEN
1178                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1179                                      VEL, 'BC_V_s', M, BC_V_S(BCV,M)
1180                                   call mfix_exit(myPE)
1181                                ENDIF
1182                                IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
1183                                    .NOT.COMPARE((-VEL),BC_V_S(BCV,M))) THEN
1184                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1185                                      (-VEL), 'BC_V_s', M, BC_V_S(BCV,M)
1186                                   call mfix_exit(myPE)
1187                                ENDIF
1188                             ELSE
1189                                IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
1190                                   BC_U_S(BCV,M) = ZERO
1191                                   BC_V_S(BCV,M) = VEL
1192                                   BC_W_S(BCV,M) = ZERO
1193                                ELSE
1194                                   BC_V_S(BCV,M) = -VEL
1195                                ENDIF
1196                             ENDIF
1197                          CASE ('B')
1198                             IF (BC_W_S(BCV,M) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
1199                                IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
1200                                    .NOT.COMPARE((-VEL),BC_W_S(BCV,M))) THEN
1201                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1202                                      (-VEL), 'BC_W_s', M, BC_W_S(BCV,M)
1203                                   call mfix_exit(myPE)
1204                                ENDIF
1205                                IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
1206                                    .NOT.COMPARE(VEL,BC_W_S(BCV,M))) THEN
1207                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1208                                      VEL, 'BC_W_s', M, BC_W_S(BCV,M)
1209                                   call mfix_exit(myPE)
1210                                ENDIF
1211                             ELSE
1212                                IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
1213                                   BC_U_S(BCV,M) = ZERO
1214                                   BC_V_S(BCV,M) = ZERO
1215                                   BC_W_S(BCV,M) = -VEL
1216                                ELSE
1217                                   BC_W_S(BCV,M) = VEL
1218                                ENDIF
1219                             ENDIF
1220                          CASE ('T')
1221                             IF (BC_W_S(BCV,M) /= UNDEFINED.AND.DO_VEL_CHECK) THEN
1222                                IF (BC_TYPE(BCV)=='MASS_INFLOW' .AND. &
1223                                    .NOT.COMPARE(VEL,BC_W_S(BCV,M))) THEN
1224                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1225                                      VEL, 'BC_W_s', M, BC_W_S(BCV,M)
1226                                   call mfix_exit(myPE)
1227                                ENDIF
1228                                IF (BC_TYPE(BCV)=='MASS_OUTFLOW' .AND. &
1229                                   .NOT.COMPARE((-VEL),BC_W_S(BCV,M))) THEN
1230                                   IF(DMP_LOG)WRITE (UNIT_LOG, 1300) BCV, &
1231                                      (-VEL), 'BC_W_s', M, BC_W_S(BCV,M)
1232                                   call mfix_exit(myPE)
1233                                ENDIF
1234                             ELSE
1235                                IF (BC_TYPE(BCV) == 'MASS_INFLOW') THEN
1236                                   BC_U_S(BCV,M) = ZERO
1237                                   BC_V_S(BCV,M) = ZERO
1238                                   BC_W_S(BCV,M) = VEL
1239                                ELSE
1240                                   BC_W_S(BCV,M) = -VEL
1241                                ENDIF
1242                             ENDIF
1243                          END SELECT    ! end select (trim(bc_plane(bcv))
1244                       ENDIF   ! end if (bc_volflow_s(bcv,m) /= undefined)
1245     ! end solids volumetric flow conversion to velocity
1246     ! ----------------------------------------------------------------<<<
1247     
1248                    ENDDO   ! end do m = 1,smax
1249                    ENDIF   ! end if (.not.discrete_element)
1250     
1251                 ENDIF   ! end if (bc_type(bcv)=='mass_inflow' or 'mass_outflow')
1252              ENDIF   ! end if (bc_defined(bcv))
1253           ENDDO   ! end do (bcv =1,dimension_bc)
1254     
1255     
1256           IF (CONVERTED .AND. (NO_I .OR. NO_J .OR. NO_K) &
1257               .AND. DMP_LOG)WRITE (UNIT_LOG, 1500)
1258     
1259           RETURN
1260     
1261      1000 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
1262              ' Computed volumetric flow is not equal to specified value',/,&
1263              ' Value computed from mass flow  = ',G14.7,/,&
1264              ' Specified value (BC_VOLFLOW_g) = ',G14.7,/1X,70('*')/)
1265      1010 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,&
1266              '  BC_P_g, BC_T_g, and BC_X_g or',/' a nonzero value for ',A,&
1267              ' should be specified',/1X,70('*')/)
1268      1020 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,&
1269              '  BC_P_g, BC_T_g, and BC_X_g',/' should be specified',/1X,70('*')/)
1270      1100 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
1271              ' Computed velocity is not equal to specified value',/,&
1272              ' Value computed from vol. or mass flow  = ',G14.7,/,&
1273              ' Specified value (',A,') = ',G14.7,/1X,70('*')/)
1274      1200 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
1275              ' Computed volumetric flow is not equal to specified value',/,&
1276              ' Value computed from mass flow  = ',G14.7,/,&
1277              ' Specified value (BC_VOLFLOW_s',I1,') = ',G14.7,/1X,70('*')/)
1278      1250 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
1279              ' Non-zero vol. or mass flow specified with BC_ROP_s',&
1280              I1,' = 0.',/1X,70('*')/)
1281      1260 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
1282              ' BC_ROP_s',I1,' not specified',/1X,70('*')/)
1283      1300 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/' Message: BC No:',I2,/,&
1284              ' Computed velocity is not equal to specified value',/,&
1285              ' Value computed from vol. or mass flow  = ',G14.7,/,&
1286              ' Specified value (',A,I1,') = ',G14.7,/1X,70('*')/)
1287      1500 FORMAT(/1X,70('*')//' From: FLOW_TO_VEL',/&
1288              ' Message: Some volumetric or mass flow rates have been',/&
1289              '   converted to velocity values.  In 2D simulations ensure',/&
1290              '   that the third (unused) dimension is correctly specified;',/&
1291              '   e.g. in axisymmetric cylindrical coordinates ZLENGTH = 2*Pi'/1X,70&
1292              ('*')/)
1293     
1294      1401 FORMAT(//1X,70('*')/' From: FLOW_TO_VEL',/,' Error 1401:',       &
1295              ' Solids phase ',I2,' failed sanity check in BC region ',I3,  &
1296              '. ',/' Please check mfix.dat file.',/1X,70('*')//)
1297     
1298     
1299           END SUBROUTINE FLOW_TO_VEL
1300