63
64
65
66 USE matparam_def_mod , ONLY : matparam_struct_
69
70
71
72#include "implicit_f.inc"
73
74
75
76#include "com08_c.inc"
77
78
79
80 INTEGER,INTENT(IN) :: SNPC, STF,NUMMAT
81 INTEGER, INTENT(IN) :: IFLAG
82 INTEGER, INTENT(IN) :: MATLAW, LOCAL_MATID, NEL, NPROPM, NPROPMI
83 my_real,
INTENT(IN) :: pm(npropm, nummat),sigold(nel,6)
84 INTEGER, INTENT(IN) :: IPM(NPROPMI, NUMMAT)
85 my_real,
INTENT(IN) :: vol(nel), off(nel)
86 my_real,
INTENT(OUT) :: grun(nel)
87 my_real,
INTENT(INOUT) :: eint(nel), rho(nel), theta(nel)
88 my_real,
INTENT(OUT) :: pres(nel), ssp(nel)
89 my_real,
INTENT(IN) :: burntime(nel), deltax(nel), current_time
90 my_real,
INTENT(INOUT) :: burnfrac(nel), bufmat(*)
91 INTEGER, INTENT(IN) :: NPF(SNPC),NVAREOS
92 my_real,
INTENT(IN) :: tf(stf),vareos(nvareos*nel)
93 TYPE(MATPARAM_STRUCT_), INTENT(IN) :: MAT_PARAM
94 INTEGER,INTENT(IN) :: NVARTMP_EOS
95 INTEGER,INTENT(INOUT) :: VARTMP_EOS(NEL,NVARTMP_EOS)
96 my_real,
INTENT(INOUT) :: aburn(nel)
97
98
99
100 INTEGER :: II, EOSTYPE
102 my_real :: mu(nel), mu2(nel), espe(nel), dpde(nel), ecold(nel), dvol(nel),
103 . df(nel), psh(nel),muold(nel)
104 INTEGER :: MAT(NEL)
106 my_real :: b1, b2, r1, r2, w1, vdet, bhe
107 my_real :: r1v, r2v, wdr1v, wdr2v, dr1v, er1v, er2v
109 INTEGER :: IBFRAC
110 INTEGER :: LFT, LLT
111 my_real :: qopt,eadd,tbegin,tend,rr,a,m,n,rr2,alpha_unit,lambda
114
115
116
117 fac_pred = one
119 lft = 1
120 llt = nel
121 rho0(1:nel) = pm(1, local_matid)
122 mat(1:nel) = local_matid
123 dvol(1:nel) = zero
124 mu2(1:nel) = zero
125 mu(1:nel) = zero
126 espe(1:nel) = zero
127 dpde(1:nel) = zero
128 ecold(1:nel) = zero
129 dvol(1:nel) = zero
130 df(1:nel) = one
131 psh(1:nel) = zero
132 muold(1:nel) = zero
133 gamma = zero
134 pstar = zero
135 DO ii = 1, nel
136 IF (vol(ii) > zero) THEN
137 mu(ii) = rho(ii) / rho0(ii) - one
138 df(ii) = rho0(ii) / rho(ii)
139 psh(ii) = pm(88, local_matid)
140 ELSE
141 mu(ii) = zero
142 df(ii) = one
143 psh(ii) = -1e20
144 ENDIF
145 ENDDO
146 SELECT CASE (matlaw)
147 CASE (5)
148
149 b1 = pm(33, local_matid)
150 b2 = pm(34, local_matid)
151 r1 = pm(35, local_matid)
152 r2 = pm(36, local_matid)
153 w1 = pm(45, local_matid)
154 vdet = pm(38, local_matid)
155 bhe = pm(40, local_matid)
156 c0 = pm(43, local_matid)
157 c1 = pm(44, local_matid)
158 qopt = pm(42, local_matid)
159 eadd = pm(160,local_matid)
160 tbegin = pm(161,local_matid)
161 tend = pm(162,local_matid)
162 rr = pm(163,local_matid)
163 a = pm(164,local_matid)
164 m = pm(165,local_matid)
165 n = pm(166,local_matid)
166 rr2 = pm(167,local_matid)
167 alpha_unit = pm(168,mat(1))
168 ibfrac = nint(pm(41, local_matid))
169 grun(1:nel) = zero
170 DO ii = 1, nel
171 IF (vol(ii) > zero) THEN
172
173 IF (iflag == 1) THEN
174 IF (burnfrac(ii) < one) THEN
175 tb = - burntime(ii)
176 bfrac1 = zero
177 bfrac2 = zero
178 IF (ibfrac /= 1 .AND. current_time > tb) THEN
179 bfrac1 = one
180 IF (deltax(ii) > zero) THEN
181 bfrac1 = vdet * (current_time - tb) / three_half / deltax(ii)
182 ENDIF
183 ENDIF
184 IF (ibfrac /= 2) THEN
185 bfrac2 = bhe * (one - df(ii))
186 ENDIF
187
188 burnfrac(ii) =
max(bfrac1, bfrac2)
189 IF (burnfrac(ii) < em04) THEN
190 burnfrac(ii) = zero
191 ENDIF
192 IF (burnfrac(ii) > one) THEN
193 burnfrac(ii) = one
194 ENDIF
195 ENDIF
196 ENDIF
197
198 ENDIF
199 ENDDO
200
201
202 pold(:) = zero
203 DO ii = 1, nel
204 IF (vol(ii) > zero) THEN
205 r1v = b1 * w1 / (r1 * df(ii))
206 r2v = b2 * w1 / (r2 * df(ii))
207 wdr1v = b1 - r1v
208 wdr2v = b2 - r2v
209 dr1v = w1 * eint(ii)
210 er1v = exp(-r1 * df(ii))
211 er2v = exp(-r2 * df(ii))
212 pold(ii) = - psh(ii) + wdr1v * er1v + wdr2v * er2v + dr1v
213 pold(ii) = burnfrac(ii) * pold(ii) + (one - burnfrac(ii)) * (-psh(ii)+(c0 + c1 * mu(ii)))
214 ENDIF
215 ENDDO
216
217
218 IF(eadd /= zero)THEN
219 SELECT CASE (nint(qopt))
220 CASE(0)
221 DO ii=1,nel
222 IF (vol(ii) > zero) THEN
223 lambda = zero
224 IF(current_time > tend .AND. aburn(ii)==one)THEN
225 lambda = one
226 aburn(ii) = one
227 ELSEIF (current_time <= tbegin)THEN
228 lambda = zero
229 aburn(ii) = zero
230 ELSE
231 lambda = one
232 eint(ii) = eint(ii)+(lambda-aburn(ii))*eadd*
max(em20,vol(ii)/df(ii))
233 aburn(ii) = one
234 ENDIF
235 ENDIF
236 ENDDO
237 CASE(1)
238 DO ii=1,nel
239 IF (vol(ii) > zero) THEN
240 lambda = zero
241 IF(current_time > tend .AND. aburn(ii)==one)THEN
242 lambda = one
243 aburn(ii) = one
244 ELSEIF (current_time <= tbegin)THEN
245 lambda = zero
246 aburn(ii) = zero
247 ELSE
248 lambda = (current_time-tbegin)*rr
249 lambda =
min(one,lambda)
250 eint(ii) = eint(ii)+(lambda-aburn(ii))*eadd*
max(em20,vol(ii)/df(ii))
251 aburn(ii) = lambda
252 ENDIF
253 ENDIF
254 ENDDO
255 CASE(2)
256 DO ii=1,nel
257 IF (vol(ii) > zero) THEN
258 lambda = zero
259 IF(current_time > tend .AND. aburn(ii)==one)THEN
260 lambda = one
261 aburn(ii) = one
262 ELSEIF (current_time <= tbegin)THEN
263 lambda = zero
264 aburn(ii) = zero
265 ELSE
266 lambda = half*rr*current_time**2 - rr*tbegin*current_time + rr2
267 lambda =
max(zero,
min(one,lambda))
268 eint(ii) = eint(ii)+(lambda-aburn(ii))*eadd*
max(em20,vol(ii)/df(ii))
269 aburn(ii) = lambda
270 ENDIF
271 ENDIF
272 ENDDO
273 CASE(3)
274 DO ii=1,nel
275 IF (vol(ii) > zero) THEN
276 lambda = zero
277 IF(pold(ii)+psh(ii) > zero )THEN
278 lambda=aburn(ii)+ fac_pred*dt1*a*exp( m*log(one+aburn(ii)) )*exp(n*log(alpha_unit*(pold(ii)+psh(ii))))
279 lambda =
max(lambda,zero)
280 lambda =
min(lambda,one)
281 eint(ii) = eint(ii)+(lambda-aburn(ii))*eadd*
max(em20,vol(ii)/df(ii))/fac_pred
282 aburn(ii)= lambda
283 ENDIF
284 ENDIF
285 ENDDO
286 END SELECT
287 ENDIF
288
289
290 DO ii = 1, nel
291 IF (vol(ii) > zero) THEN
292 r1v = b1 * w1 / (r1 * df(ii))
293 r2v = b2 * w1 / (r2 * df(ii))
294 wdr1v = b1 - r1v
295 wdr2v = b2 - r2v
296 dr1v = w1 * eint(ii)
297 er1v = exp(-r1 * df(ii))
298 er2v = exp(-r2 * df(ii))
299 pres(ii) = - psh(ii) + wdr1v * er1v + wdr2v * er2v + dr1v
300 ssp(ii) = b1 * er1v * (-w1 / df(ii) / r1 + r1 * df(ii) - w1)
301 . + b2 * er2v * (-w1 / df(ii) / r2 + r2 * df(ii) - w1)
302 . + dr1v + (pres(ii) + psh(ii)) * w1
303 pres(ii) = burnfrac(ii) * pres(ii) +
304 . (one - burnfrac(ii)) * (-psh(ii)+(c0 + c1 * mu(ii)))
305 grun(ii) = burnfrac(ii) * w1
306 ssp(ii) = burnfrac(ii) * (ssp(ii) * df(ii) / rho0(ii)) +
307 . (one - burnfrac(ii)) * (c1 / rho0(ii))
308
309
310 ENDIF
311 ENDDO
312 CASE (3, 4, 6, 49)
313 eostype = ipm(4, local_matid)
314 muold(1:nel) = mu(1:nel)
315
316 CALL eosmain(2 , nel , eostype , pm , off , eint,
317 . rho , rho0 , mu , mu2 , espe ,
318 . dvol , df , vol , mat , psh ,
319 . pres , ssp , dpde , theta ,
320 . bufmat , sigold , muold , matlaw ,
321 . npf , tf , vareos , nvareos, mat_param,
322 . burnfrac, nvartmp_eos, vartmp_eos)
323
324 DO ii = 1, nel
325 IF (vol(ii) > zero) THEN
326 ssp(ii) = ssp(ii) / rho0(ii)
327 grun(ii) = dpde(ii) / (one + mu(ii))
328 ELSE
329 ssp(ii) = zero
330 grun(ii) = zero
331 ENDIF
332 ENDDO
333 CASE DEFAULT
334 print*, "LAW", matlaw, "NOT COMPATIBLE WITH LAW 151 (MULTIFLUID)"
336 END SELECT
337
338
339
type(alemuscl_param_) alemuscl_param
subroutine eosmain(iflag, nel, eostyp, pm, off, eint, rho, rho0, mu, mu2, espe, dvol, df, vnew, mat, psh, pnew, dpdm, dpde, theta, bufmat, sig, mu_bak, mlw, npf, tf, vareos, nvareos, mat_param, bfrac, nvartmp, vartmp)