46
47
48
50 USE eos_param_mod , ONLY : eos_param_
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 IMPLICIT NONE
76#include "my_real.inc"
77
78
79
80 INTEGER, INTENT(IN) :: SNPC,STF
81 INTEGER, INTENT(IN) :: IFLAG, NEL,NPF(SNPC)
82 my_real,
INTENT(IN) :: off(nel), mu(nel), espe(nel), dvol(nel), df(nel), vnew(nel), tf(stf)
83 my_real,
INTENT(INOUT) :: psh(nel), eint(nel), dpdm(nel), dpde(nel), pnew(nel)
85 TYPE(EOS_PARAM_ ),INTENT(IN) :: EOS_STRUCT
86
87
88
89 INTEGER I
91 my_real :: xscale_a,xscale_b,fscale_a,fscale_b
92 INTEGER :: A_fun_id, B_fun_id
93 my_real :: res_a(nel),res_b(nel),deri_a(nel),deri_b(nel)
95
96
97
98 e0 = eos_struct%E0
99 psh(1:nel) = eos_struct%PSH
100 xscale_a = eos_struct%UPARAM(1)
101 xscale_b = eos_struct%UPARAM(2)
102 fscale_a = eos_struct%UPARAM(3)
103 fscale_b = eos_struct%UPARAM(4)
104 a_fun_id = eos_struct%IPARAM(1)
105 b_fun_id = eos_struct%IPARAM(2)
106
107 IF(iflag == 0) THEN
108
109 IF(a_fun_id == 0)THEN
110 DO i=1,nel
111 res_a(i) = zero
112 deri_a(i) = zero
113 res_b(i) = fscale_b*finter(b_fun_id,mu(i),npf,tf,deri_b(i))
114 ENDDO
115 ELSEIF(b_fun_id == 0)THEN
116 DO i=1,nel
117 res_a(i) = fscale_a*finter(a_fun_id,mu(i),npf,tf,deri_a(i))
118 res_b(i) = zero
119 deri_b(i) = zero
120 ENDDO
121 ELSE
122 DO i=1,nel
123 res_a(i) = fscale_a*finter(a_fun_id,mu(i),npf,tf,deri_a(i))
124 res_b(i) = fscale_b*finter(b_fun_id,mu(i),npf,tf,deri_b(i))
125 ENDDO
126 ENDIF
127 DO i=1,nel
128 pp = res_a(i) + res_b(i) * espe(i) - psh(i)
129 dpdm(i) = deri_a(i)+deri_b(i)*espe(i) + res_b(i)*(pp+psh(i))/( (one+mu(i))*(one+mu(i)) )
130 dpde(i) = res_b(i)
131 pnew(i) =
max(pp,pmin)*off(i)
132 ENDDO
133
134
135 ELSEIF(iflag == 1) THEN
136
137 IF(a_fun_id == 0)THEN
138 DO i=1,nel
139 res_a(i) = zero
140 res_b(i) = fscale_b*finter(b_fun_id,mu(i),npf,tf,deri_b(i))
141 ENDDO
142 ELSEIF(b_fun_id == 0)THEN
143 DO i=1,nel
144 res_a(i) = fscale_a*finter(a_fun_id,mu(i),npf,tf,deri_a(i))
145 res_b(i) = zero
146 ENDDO
147 ELSE
148 DO i=1,nel
149 res_a(i) = fscale_a*finter(a_fun_id,mu(i),npf,tf,deri_a(i))
150 res_b(i) = fscale_b*finter(b_fun_id,mu(i),npf,tf,deri_b(i))
151 ENDDO
152 ENDIF
153 DO i=1,nel
154 aa = res_a(i)
155 bb = res_b(i)
156 dpde(i) = bb
157 dvv = half*dvol(i)*df(i) /
max(em15,vnew(i))
158 pp = aa + bb * espe(i)
159 pnew(i) = (aa+bb*(espe(i)-psh(i)*dvv))/(one+bb*dvv)
160 pnew(i) =
max(pnew(i),pmin )*off(i)
161 eint(i) = eint(i) - half*dvol(i)*(pnew(i)+psh(i) )
162 ENDDO
163
164
165 ELSEIF (iflag == 2) THEN
166
167 IF(a_fun_id == 0)THEN
168 DO i=1,nel
169 res_a(i) = zero
170 res_b(i) = fscale_b*finter(b_fun_id,mu(i),npf,tf,deri_b(i))
171 deri_a(i) = zero
172 ENDDO
173 ELSEIF(b_fun_id == 0)THEN
174 DO i=1,nel
175 res_a(i) = fscale_a*finter(a_fun_id,mu(i),npf,tf,deri_a(i))
176 res_b(i) = zero
177 deri_b(i) = zero
178 ENDDO
179 ELSE
180 DO i=1,nel
181 res_a(i) = fscale_a*finter(a_fun_id,mu(i),npf,tf,deri_a(i))
182 res_b(i) = fscale_b*finter(b_fun_id,mu(i),npf,tf,deri_b(i))
183 ENDDO
184 ENDIF
185 DO i=1, nel
186 IF (vnew(i) > zero) THEN
187 pp = res_a(i) + res_b(i)*espe(i) - psh(i)
188 dpdm(i) = deri_a(i)+deri_b(i)*espe(i) + res_b(i)*(pp+psh(i))/( (one+mu(i))*(one+mu(i)) )
189 dpde(i) = res_b(i)
190 pnew(i) = pp
191 ENDIF
192 ENDDO
193
194 ENDIF
195
196 RETURN