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