46
47
48
50 USE eos_param_mod , ONLY : eos_param_
51 use precision_mod , only : wp
52 IMPLICIT NONE
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 INTEGER,INTENT(IN) :: IFLAG, NEL, NVAREOS
91 real(kind=wp) :: pmin,
92 . off(nel) , eint(nel), mu(nel) ,
93 . mu2(nel) , espe(nel), dvol(nel), df(nel),
94 . vnew(nel), pnew(nel), dpdm(nel), dpde(nel)
95 real(kind=wp),INTENT(INOUT) :: vareos(nel,nvareos)
96 real(kind=wp),INTENT(INOUT) :: psh(nel)
97 TYPE(EOS_PARAM_),INTENT(IN) :: EOS_STRUCT
98
99
100
101 INTEGER :: I
102 real(kind=wp) :: aa, bb, dvv, eta, enew, omega, xx, expa, expb,
103 . pp, facc1, facc2, facpb,
104 . c1,c2,ptia,ptib,ezero,
105 .
alpha,beta,esubl,vsubl,
107
108 c1 = eos_struct%UPARAM(1)
109 c2 = eos_struct%UPARAM(2)
110 ptia = eos_struct%UPARAM(3)
111 ptib = eos_struct%UPARAM(4)
112 ezero = eos_struct%UPARAM(5)
113 esubl = eos_struct%UPARAM(6)
114 vsubl = eos_struct%UPARAM(7)
115 alpha = eos_struct%UPARAM(8)
116 beta = eos_struct%UPARAM(9)
117 psh(:) = eos_struct%PSH
118
119 IF(iflag == 0) THEN
120 DO i=1,nel
121 facc1=one
122 facc2=one
123 facpb=one
125 IF(mu(i) < zero) THEN
127 facc2=zero
128 IF(df(i) > vsubl .OR. (df(i) <= vsubl .AND. espe(i) >= esubl)) THEN
130 xx=mu(i)/(one+mu(i))
131 expa=exp(-
alpha*xx*xx)
132 expb=exp(beta*xx)
133 facc1=expa*expb
134 facpb=expa
135 ENDIF
136 ENDIF
137 eta=one+mu(i)
138 omega= one+espe(i)/(ezero*eta**2)
139 aa=facc1*c1*mu(i)+facc2*c2*mu2(i)
140 bb=ptia+facpb*ptib/omega
141 pp=
max(aa+bb*eta*espe(i),pmin)*off(i)
142 dpdm(i)=facc1*c1+two*facc2*c2*mu(i)+bb*eta*pp*df(i)*df(i)
143 . +espe(i)*( bb+(two*espe(i)/eta-pp*df(i)*df(i))
144 . *ptib*facpb/(ezero*eta*omega**2) )
145 dpde(i)=bb*eta
147 pnew(i) =
max(pp,pmin)*off(i)
148 ENDDO
149
150 ELSEIF(iflag == 1) THEN
151
152 DO i=1,nel
153 dvv=half*dvol(i)*df(i) /
max(em15,vnew(i))
154 eta=one+mu(i)
155 omega= one+espe(i)/(ezero*eta**2)
156 facc1=one
157 facc2=one
158 facpb=one
160 IF(mu(i) < zero) THEN
162 facc2=zero
163 IF(df(i) > vsubl .OR. (df(i) <= vsubl .AND. espe(i) >= esubl)) THEN
165 xx=mu(i)/(one+mu(i))
166 expa=exp(-
alpha*xx*xx)
167 expb=exp(beta*xx)
168 facc1=expa*expb
169 facpb=expa
170 ENDIF
171 ENDIF
172 aa=facc1*c1*mu(i)+facc2*c2*mu2(i)
173 bb=(ptia+facpb*ptib/omega)*eta
174 pnew(i)=(aa +bb*espe(i))/(one+ bb*dvv)
175 enew=espe(i) - pnew(i)*dvv
176
177 omega= one+enew/(ezero*eta**2)
178 bb=(ptia+facpb*ptib/omega)*eta
179 pnew(i)=(aa +bb*espe(i))/(one+ bb*dvv)
180 pnew(i)=
max(pnew(i),pmin)*off(i)
181 eint(i)= eint(i) - half*dvol(i)*pnew(i)
182 dpde(i) = bb
184 ENDDO
185
186 ELSEIF(iflag == 2) THEN
187
188 DO i=1, nel
190 IF (vnew(i) > zero) THEN
191 facc1=one
192 facc2=one
193 facpb=one
195 IF(mu(i)<zero) THEN
197 facc2=zero
198 IF(df(i) > vsubl .OR. (df(i) <= vsubl .AND. espe(i) >= esubl)) THEN
200 xx = mu(i)/(one+mu(i))
201 expa= exp(-
alpha*xx*xx)
202 expb= exp(beta*xx)
203 facc1=expa*expb
204 facpb=expa
205 ENDIF
206 ENDIF
207 eta=one+mu(i)
208 omega= one+espe(i)/(ezero*eta**2)
209 aa=facc1*c1*mu(i)+facc2*c2*mu2(i)
210 bb=ptia+facpb*ptib/omega
211 pp=
max(aa+bb*eta*espe(i),pmin)*off(i)
212 dpdm(i)=facc1*c1+two*facc2*c2*mu(i)+bb*eta*pp*df(i)*df(i)
213 . +espe(i)*( bb+(two*espe(i)/eta-pp*df(i)*df(i))
214 . *ptib*facpb/(ezero*eta*omega**2) )
215 dpde(i)=bb*eta
216 pnew(i) = pp
217 ENDIF
219 ENDDO
220 ENDIF
221 RETURN