File: /nfs/home/0/users/jenkins/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
27           IMPLICIT NONE
28     
29     ! Dummy arguments
30     !---------------------------------------------------------------------//
31           DOUBLE PRECISION, INTENT(IN) :: MW, PG, TG
32     
33           EOSG = UNSCALE(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: UNDEFINED
95           use param1, only: SMALL_NUMBER
96     
97           implicit none
98     
99     ! Passed Arguments:
100     !---------------------------------------------------------------------/
101     ! Solids phase index.
102           INTEGER, intent(in) :: M
103     
104     ! Local Variables:
105     !---------------------------------------------------------------------/
106     ! Alias for inert species index.
107           DOUBLE PRECISION :: OoRO_s0
108     ! Character string for error messages
109           CHARACTER(len=64) :: MSG
110     
111     ! Evaluate the first part of the calculation.
112           OoRO_s0 = sum(X_S0(M,:NMAX(M))/RO_Xs0(M,:NMAX(M)))
113     ! If the value is physical (positive) finish the calculation and return.
114           IF(OoRO_s0 > ZERO) THEN
115              EOSS0 = ONE/OoRO_s0
116              return
117           ENDIF
118     
119     ! This is an extra sanity check that should be caught be one ore more
120     ! of the data checks.
121           MSG=''
122           IF(abs(OoRO_S0) <= SMALL_NUMBER) THEN
123              WRITE(MSG,"('Infinity')")
124           ELSE
125              WRITE(MSG,*) ONE/OoRO_s0
126           ENDIF
127     
128           IF(DMP_LOG) THEN
129              WRITE(*,1000) M, trim(MSG)
130              WRITE(UNIT_LOG,1000) M, trim(MSG)
131           ENDIF
132     
133           CALL MFIX_EXIT(myPE)
134     
135      1000 FORMAT(//1X,70('*')/' From: EOSS',/,' Error 1300:',               &
136              ' Unphysical baseline density calculated:',/' RO_s(',I2,') = ' &
137              ,A,/' Please refer to the Readme file on the required input',  &
138              ' and make',/' the necessary corrections to the data file.',   &
139              /1X,70('*')//)
140     
141           END FUNCTION EOSS0
142     
143     
144     
145     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
146     !                                                                      !
147     !  Function: EOSS                                                      !
148     !  Author: J.Musser                                   Date: 09-Oct-13  !
149     !                                                                      !
150     !  Purpose: Calculate solid density - runtime.                         !
151     !                                                                      !
152     !                                                                      !
153     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
154           DOUBLE PRECISION FUNCTION EOSS(pBase, Xs0_INERT, Xs_INERT)
155     
156           implicit none
157     
158     ! Passed Arguments:
159     !---------------------------------------------------------------------/
160     ! Baseline phase density (unreacted)
161           DOUBLE PRECISION, intent(in) :: pBase
162     ! Baseline inert mass fraction
163           DOUBLE PRECISION, intent(in) :: Xs0_INERT
164     ! Current mass fraction of inert
165           DOUBLE PRECISION, intent(in) :: Xs_INERT
166     
167     ! Evaluate the solids EOS.
168           EOSS = pBase * Xs0_INERT / max(Xs_INERT, 1.0d-8)
169     
170           RETURN
171           END FUNCTION EOSS
172     
173           END MODULE eos
174