42
43
44
45
46
47
48
49
50
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111#include "implicit_f.inc"
112
113
114
115 INTEGER NEL, NUPARAM, NUVAR
116 my_real time,timestep,uparam(nuparam),
117 . rho(nel),rho0(nel),volume(nel),eint(nel),
118 . epspxx(nel),epspyy(nel),epspzz(nel),
119 . epspxy(nel),epspyz(nel),epspzx(nel),
120 . depsxx(nel),depsyy(nel),depszz(nel),
121 . depsxy(nel),depsyz(nel),depszx(nel),
122 . epsxx(nel) ,epsyy(nel) ,epszz(nel) ,
123 . epsxy(nel) ,epsyz(nel) ,epszx(nel) ,
124 . sigoxx(nel),sigoyy(nel),sigozz(nel),
125 . sigoxy(nel),sigoyz(nel),sigozx(nel)
126
127
128
130 . signxx(nel),signyy(nel),signzz(nel),
131 . signxy(nel),signyz(nel),signzx(nel),
132 . sigvxx(nel),sigvyy(nel),sigvzz(nel),
133 . sigvxy(nel),sigvyz(nel),sigvzx(nel),
134 . soundsp(nel),viscmax(nel)
135
136
137
138 my_real,
INTENT(INOUT) :: uvar(nel,nuvar), off(nel)
139 INTEGER, INTENT(IN) :: NPF(*), NFUNC, IFUNC(NFUNC), NIX, IX(NIX,*), NFT
142
143
144
145 INTEGER I,J, ISOLVER, NITER, ITER
147 . ssp,vis,vis2,vis3,vv,c1,c2,c12,r1,r2,pmin,a2,rho10,rho20,
148 . rho1,rho2,a1,a,b,c, b1,b2,p,gam,p0,gpr,pold,
149 . pn2,rhn2,visa1,visb1,visa2,visb2,dydx,rhoscale,tol, vol, mas, mas1, mas2,
150 . rho1t,rho2t, error, p1,p2,f1,f2,df11,df12,df21,df22,det,drho1,drho2,
151 . mu1p1, mu2p1, psh, ssp1, ssp2
152
153
154
155
156
157
158
159 visa1 = uparam(1)
160 visb1 = uparam(3)
161 visa2 = uparam(13)
162 visb2 = uparam(15)
163 c1 = uparam(4)
164 gam = uparam(5)
165 r1 = uparam(6)
166 gpr = uparam(7)
167 pmin = uparam(8)
168 p0 = uparam(9)
169 rho10 = uparam(11)
170 rho20 = uparam(12)
171 psh = uparam(16)
172 isolver = nint(uparam(17))
173 rhoscale = one
174 IF(ifunc(1)>0)rhoscale=finter(ifunc(1),time,npf,tf,dydx)
175
176
177
178
179 IF(time==zero)THEN
180 DO i=1,nel
181 p =
max(em30,(-sigoxx(i)-sigoyy(i)-sigozz(i))*third)-psh
182 IF(gam*c1>=em30)THEN
183 mu1p1 = ((p-p0)/c1+one)
184 mu2p1 =( p/p0)**(one/gam)
185 rho1 = rho10*mu1p1
186 rho2 = rho20*mu2p1
187 a = (rho(i)-rho2)/(rho1-rho2)
188 uvar(i,1) = a*rho1
189 uvar(i,2) = rho2
190 uvar(i,3) = rho1
191 uvar(i,4) = a
192 IF(uvar(i,4)<em20)uvar(i,4)=zero
193 uvar(i,5) = one-uvar(i,4)
194 ELSE
195 uvar(i,3)=rho(i)
196 ENDIF
197 ENDDO
198 ELSE
199 DO i=1,nel
200 uvar(i,1) = uvar(i,1)/volume(i)
201 ENDDO
202 ENDIF
203
204
205
206
207
208 IF(gam*c1<em30)THEN
209 DO i=1,nel
210 IF(uvar(i,3)/rho10<half)THEN
211 uvar(i,1) = zero
212 rho(i) = uvar(i,3)*rhoscale
213 uvar(i,2) = rho(i)
214 uvar(i,4) = zero
215 uvar(i,5) = one
216 ELSE
217 uvar(i,1) = uvar(i,3)
218 uvar(i,2) = rho20
219 rho(i) = uvar(i,3)
220 uvar(i,4) = one
221 uvar(i,5) = zero
222 ENDIF
223 soundsp(i) = em30
224 signxx(i) = sigoxx(i)
225 signyy(i) = sigoyy(i)
226 signzz(i) = sigozz(i)
227 signxy(i) = sigoxy(i)
228 signyz(i) = sigoyz(i)
229 signzx(i) = sigozx(i)
230 ENDDO
231 RETURN
232 ENDIF
233
234 IF(isolver==2)THEN
235
236
237
238 tol = em10
239 niter = 20
240 DO i=1,nel
241 vol = volume(i)
242 mas = rho(i) * vol
243 mas1 = uvar(i, 1) * vol
244 mas2 = mas - mas1
245 rho2 = uvar(i, 2)
246 rho1 = uvar(i, 3)
247 rho1t = rho1 / rho10
248 rho2t = rho2 / rho20
249 pold = p0 * rho2t**gam
250 IF (mas1 / mas < em10) THEN
251
252 uvar(i, 1) = zero
253 uvar(i, 4) = zero
254 uvar(i, 5) = one
255 rho2 = mas / vol
256 uvar(i, 2) = rho2
257 p = p0 * (rho2/rho20)**gam
258 ELSEIF (mas2 / mas < em10) THEN
259
260 rho1 = mas / vol
261 uvar(i, 1) = rho1
262 uvar(i, 3) = rho1
263 uvar(i, 4) = one
264 uvar(i, 5) = zero
265 p = r1 * rho1 - c1 + p0
266 ELSE
267 error = ep30
268 iter = 1
269 DO WHILE(iter < niter .AND. error > tol)
270 p1 = r1 * rho1 - c1 + p0
271 p2 = p0 * (rho2/rho20)**gam
272 f1 = mas1 / rho1 + mas2 / rho2 - vol
273 f2 = p1 - p2
274 df11 = - mas1 / (rho1 * rho1)
275 df12 = - mas2 / (rho2 * rho2)
276 df21 = r1
277 df22 = - gam * p0 / (rho20**gam) * rho2**(gam - one)
278 det = df11 * df22 - df12 * df21
279 drho1 = (-df22 * f1 + df12 * f2) / det
280 drho2 = (df21 * f1 - df11 * f2) / det
281 drho1 =
min(three * rho1,
max(drho1, - half * rho1))
282 drho2 =
min(three * rho2,
max(drho2, - half * rho2))
283 rho1 = rho1 + drho1
284 rho2 = rho2 + drho2
285 error = abs(drho1 / rho1) + abs(drho2 / rho2)
286 iter = iter + 1
287 ENDDO
288 IF (error > tol) THEN
289 print*, "*** WARNING LAW37, convergence tolerance ", error, tol
290 ENDIF
291 p = r1 * rho1 - c1 + p0
292 ENDIF
293 ssp1 = r1 * rho1
294 ssp2 = gam * p0 * (rho2/rho20)**gam
295 b1 = uvar(i, 1)
296 b2 = rho(i) - b1
297
298 uvar(i,2) = rho2
299 uvar(i,3) = rho1
300 uvar(i,4) = uvar(i,1)/rho1
301 IF(uvar(i,4)<em20)uvar(i,4)=zero
302 uvar(i,5) = one-uvar(i,4)
303 IF (ssp1 > zero) THEN
304 ssp1 = uvar(i,4) / ssp1
305 ELSE
306 ssp1 = zero
307 ENDIF
308 IF (ssp2 > zero) THEN
309 ssp2 = uvar(i,5) / ssp2
310 ELSE
311 ssp2 = zero
312 ENDIF
313 ssp = ssp1 + ssp2
314 ssp = sqrt(one / ssp / rho(i))
315 p =
max(pmin, p) + psh
316 signxx(i) = -p
317 signyy(i) = -p
318 signzz(i) = -p
319 vis = (b1*rho1*visa1 + b2*rho2*visa2)/rho(i)
320 vis2 = two*vis
321 vis3 = (b1*rho1*visb1 + b2*rho2*visb2)
322 vv = vis3*(epspxx(i)+epspyy(i)+epspzz(i))
323 sigvxx(i) = vis2*epspxx(i)+vv
324 sigvyy(i) = vis2*epspyy(i)+vv
325 sigvzz(i) = vis2*epspzz(i)+vv
326 sigvxy(i) = vis *epspxy(i)
327 sigvyz(i) = vis *epspyz(i)
328 sigvzx(i) = vis *epspzx(i)
329 soundsp(i) = ssp
330 viscmax(i) = vis2 + vis3
331 uvar(i,1) =
max(zero, uvar(i,1))
332 uvar(i,2) =
max(zero, uvar(i,2))
333 uvar(i,3) =
max(zero, uvar(i,3))
334 uvar(i,4) =
max(zero, uvar(i,4))
335 uvar(i,5) =
max(zero, uvar(i,5))
336 enddo
337
338 ELSE
339
340
341
342 DO i=1,nel
343 rho2 = uvar(i,2)
344
345 pold = p0 * (rho2/rho20)**gam
346 r2 = gam * pold / rho2
347 c2 = - (one-gam)*pold + p0
348 c12 = c1 - c2
349 b1 = uvar(i,1)
350 b2 = rho(i) - b1
351 a = r1
352 b = half*(b1*r1+b2*r2+c12)
353 c = b1*c12
354 rho1 = ( b + sqrt(
max(zero,b*b - a*c)) ) / a
355 p = r1*rho1 - c1
356 rhn2 =
max(em30,(p + c2) / r2)
357
358 pn2 = (pold + p0 * (rhn2/rho20)**gam)
359 r2 = gam * pn2 / (rho2+rhn2)
360 b = half*(b1*r1+b2*r2+c12)
361 rho1 = ( b + sqrt(
max(zero,b*b - a*c)) ) / a
362 p = r1*rho1 - c1
363 rho2 =
max(em30,(p + c2) / r2)
364
365 uvar(i,2) = rho2
366 uvar(i,3) = rho1
367 uvar(i,4) = uvar(i,1)/rho1
368 IF(uvar(i,4)<em20)uvar(i,4)=zero
369 uvar(i,5) = one-uvar(i,4)
370 p =
max(pmin, p) +p0+psh
371 signxx(i) = -p
372 signyy(i) = -p
373 signzz(i) = -p
374 vis = (b1*rho1*visa1 + b2*rho2*visa2)/rho(i)
375 vis2 = two*vis
376 vis3 = (b1*rho1*visb1 + b2*rho2*visb2)/rho(i)
377 vv = vis3*(epspxx(i)+epspyy(i)+epspzz(i))
378 sigvxx(i) = vis2*epspxx(i)+vv
379 sigvyy(i) = vis2*epspyy(i)+vv
380 sigvzz(i) = vis2*epspzz(i)+vv
381 sigvxy(i) = vis *epspxy(i)
382 sigvyz(i) = vis *epspyz(i)
383 sigvzx(i) = vis *epspzx(i)
384 soundsp(i) = sqrt(c1/rho1)
385 viscmax(i) = vis2 + vis3
386 uvar(i,1) =
max(zero, uvar(i,1))
387 uvar(i,2) =
max(zero, uvar(i,2))
388 uvar(i,3) =
max(zero, uvar(i,3))
389 uvar(i,4) =
max(zero, uvar(i,4))
390 uvar(i,5) =
max(zero, uvar(i,5))
391 enddo
392 ENDIF
393
394
395 RETURN