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

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2     !                                                                      C
3     !  Module name: EOS                                                    C
4     !  Purpose: Equation of state for gas and initial solids density       C
5     !                                                                      C
6     !  Author: M. Syamlal                                 Date: 29-JAN-92  C
7     !                                                                      C
8     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
9     
10           MODULE eos
11     
12           CONTAINS
13     
14     
15     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
16     !                                                                      C
17     !  Function: EOSG                                                      C
18     !  Purpose: Equation of state for gas                                  C
19     !                                                                      C
20     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
21           DOUBLE PRECISION FUNCTION EOSG (MW, PG, TG)
22     
23     ! Global Variables:
24     !---------------------------------------------------------------------//
25           USE constant, only: gas_const
26           USE scales, only: unscale_pressure
27           IMPLICIT NONE
28     
29     ! Dummy arguments
30     !---------------------------------------------------------------------//
31           DOUBLE PRECISION, INTENT(IN) :: MW, PG, TG
32     
33           EOSG = UNSCALE_PRESSURE(PG)*MW/(GAS_CONST*TG)
34           RETURN
35           END FUNCTION EOSG
36     
37     
38     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
39     !                                                                      C
40     !  Function: dROodP_g                                                  C
41     !  Purpose: derivative of gas density w.r.t pressure                   C
42     !                                                                      C
43     !  Author: M. Syamlal                                 Date: 14-AUG-96  C
44     !                                                                      C
45     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
46           DOUBLE PRECISION FUNCTION DROODP_G (ROG, PG)
47     
48     ! Global Variables:
49     !---------------------------------------------------------------------//
50           USE scales, only: p_ref
51           IMPLICIT NONE
52     
53     ! Dummy arguments
54     !---------------------------------------------------------------------//
55     ! gas density and pressure
56           DOUBLE PRECISION, INTENT(IN) :: ROG, PG
57     
58           DROODP_G = ROG/(PG + P_REF)
59           RETURN
60           END FUNCTION DROODP_G
61     
62     
63     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
64     !                                                                      !
65     !  Function: EOSS0                                                     !
66     !  Author: J.Musser                                   Date: 02-Dec-13  !
67     !                                                                      !
68     !  Purpose: Calculate the initial solids density. This calculation is  !
69     !  only valid at time zero. Thus, this routine should only be invoked  !
70     !  by the initialization routines.                                     !
71     !                                                                      !
72     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
73           DOUBLE PRECISION FUNCTION EOSS0(M)
74     
75     ! Global Variables:
76     !---------------------------------------------------------------------//
77     ! Baseline/initial solids density
78           use physprop, only: RO_Xs0
79     ! Baseline/initial solids mass fractions.
80           use physprop, only: X_s0
81     ! Number of species comprising each phase.
82           use physprop, only: NMAX
83     ! Process Rank
84           use compar, only: myPE
85     ! Unit number for RUN_NAME.LOG file
86           use funits, only: UNIT_LOG
87     ! Logical for who writes error messages
88           use funits, only: DMP_LOG
89     
90     ! Global parameters
91     !---------------------------------------------------------------------/
92           use param1, only: ONE
93           use param1, only: ZERO
94           use param1, only: SMALL_NUMBER
95     
96           implicit none
97     
98     ! Passed Arguments:
99     !---------------------------------------------------------------------/
100     ! Solids phase index.
101           INTEGER, intent(in) :: M
102     
103     ! Local Variables:
104     !---------------------------------------------------------------------/
105     ! Alias for inert species index.
106           DOUBLE PRECISION :: OoRO_s0
107     ! Character string for error messages
108           CHARACTER(len=64) :: MSG
109     
110     ! Evaluate the first part of the calculation.
111           OoRO_s0 = sum(X_S0(M,:NMAX(M))/RO_Xs0(M,:NMAX(M)))
112     ! If the value is physical (positive) finish the calculation and return.
113           IF(OoRO_s0 > ZERO) THEN
114              EOSS0 = ONE/OoRO_s0
115              return
116           ENDIF
117     
118     ! This is an extra sanity check that should be caught be one ore more
119     ! of the data checks.
120           MSG=''
121           IF(abs(OoRO_S0) <= SMALL_NUMBER) THEN
122              WRITE(MSG,"('Infinity')")
123           ELSE
124              WRITE(MSG,*) ONE/OoRO_s0
125           ENDIF
126     
127           IF(DMP_LOG) THEN
128              WRITE(*,1000) M, trim(MSG)
129              WRITE(UNIT_LOG,1000) M, trim(MSG)
130           ENDIF
131     
132           CALL MFIX_EXIT(myPE)
133     
134      1000 FORMAT(//1X,70('*')/' From: EOSS',/,' Error 1300:',               &
135              ' Unphysical baseline density calculated:',/' RO_s(',I2,') = ' &
136              ,A,/' Please refer to the Readme file on the required input',  &
137              ' and make',/' the necessary corrections to the data file.',   &
138              /1X,70('*')//)
139     
140           END FUNCTION EOSS0
141     
142     
143     
144     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
145     !                                                                      !
146     !  Function: EOSS                                                      !
147     !  Author: J.Musser                                   Date: 09-Oct-13  !
148     !                                                                      !
149     !  Purpose: Calculate solid density - runtime.                         !
150     !                                                                      !
151     !                                                                      !
152     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
153           DOUBLE PRECISION FUNCTION EOSS(pBase, Xs0_INERT, Xs_INERT)
154     
155           implicit none
156     
157     ! Passed Arguments:
158     !---------------------------------------------------------------------/
159     ! Baseline phase density (unreacted)
160           DOUBLE PRECISION, intent(in) :: pBase
161     ! Baseline inert mass fraction
162           DOUBLE PRECISION, intent(in) :: Xs0_INERT
163     ! Current mass fraction of inert
164           DOUBLE PRECISION, intent(in) :: Xs_INERT
165     
166     ! Evaluate the solids EOS.
167           EOSS = pBase * Xs0_INERT / max(Xs_INERT, 1.0d-8)
168     
169           RETURN
170           END FUNCTION EOSS
171     
172           END MODULE eos
173