31 1 NEL ,NUPARAM,NUVAR ,NFUNC ,IFUNC ,NPF ,
32 2 TF ,TIME ,TIMESTEP,UPARAM ,RHO0 ,RHO ,
34 4 EPSPXX ,EPSPYY ,EPSPZZ ,EPSPXY ,EPSPYZ ,EPSPZX ,
35 5 DEPSXX ,DEPSYY ,DEPSZZ ,DEPSXY ,DEPSYZ ,DEPSZX ,
36 6 EPSXX ,EPSYY ,EPSZZ ,EPSXY ,EPSYZ ,EPSZX ,
37 7 SIGOXX ,SIGOYY ,SIGOZZ ,SIGOXY ,SIGOYZ ,SIGOZX ,
38 8 SIGNXX ,SIGNYY ,SIGNZZ ,SIGNXY ,SIGNYZ ,SIGNZX ,
39 9 SIGVXX ,SIGVYY ,SIGVZZ ,SIGVXY ,SIGVYZ ,SIGVZX ,
40 A SOUNDSP,VISCMAX,UVAR ,OFF ,IX ,NIX ,
111#include "implicit_f.inc"
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)
129 my_real,
INTENT(INOUT) ::
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)
138 my_real,
INTENT(INOUT) :: uvar(nel,nuvar), off(nel)
139 INTEGER,
INTENT(IN) :: NPF(*), NFUNC, IFUNC(NFUNC), NIX, IX(NIX,*), NFT
141 my_real,
EXTERNAL :: finter
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
172 isolver = nint(uparam(17))
174 IF(ifunc(1)>0)rhoscale=finter(ifunc(1),time,npf,tf,dydx)
181 p =
max(em30,(-sigoxx(i)-sigoyy(i)-sigozz(i))*third)-psh
183 mu1p1 = ((p-p0)/c1+one)
184 mu2p1 =( p/p0)**(one/gam)
187 a = (rho(i)-rho2)/(rho1-rho2)
192 IF(uvar(i,4)<em20)uvar(i,4)=zero
193 uvar(i,5) = one-uvar(i,4)
200 uvar(i,1) = uvar(i,1)/volume(i)
210 IF(uvar(i,3)/rho10<half)
THEN
212 rho(i) = uvar(i,3)*rhoscale
217 uvar(i,1) = uvar(i,3)
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)
243 mas1 = uvar(i, 1) * vol
249 pold = p0 * rho2t**gam
250 IF (mas1 / mas < em10)
THEN
258 ELSEIF (mas2 / mas < em10)
THEN
265 p = r1 * rho1 - c1 + p0
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
274 df11 = - mas1 / (rho1 * rho1)
275 df12 = - mas2 / (rho2 * rho2)
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))
285 error = abs(drho1 / rho1) + abs(drho2 / rho2)
288 IF (error > tol)
THEN
289 print*,
"*** WARNING LAW37, convergence tolerance ", error, tol
291 p = r1 * rho1 - c1 + p0
294 ssp2 = gam * p0 * (rho2/rho20)**gam
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
308 IF (ssp2 > zero)
THEN
309 ssp2 = uvar(i,5) / ssp2
314 ssp = sqrt(one / ssp / rho(i))
315 p =
max(pmin, p) + psh
319 vis = (b1*rho1*visa1 + b2*rho2*visa2)/rho(i)
321 vis3 = (b1*rho1*visb1 + b2*rho2*visb2)/rho(i)
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)
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))
345 pold = p0 * (rho2/rho20)**gam
346 r2 = gam * pold / rho2
347 c2 = - (one-gam)*pold + p0
352 b = half*(b1*r1+b2*r2+c12)
354 rho1 = ( b + sqrt(
max(zero,b*b - a*c)) ) / a
356 rhn2 =
max(em30,(p + c2) / r2)
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
363 rho2 =
max(em30,(p + c2) / r2)
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
374 vis = (b1*rho1*visa1 + b2*rho2*visa2)/rho(i)
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))
subroutine sigeps37(nel, nuparam, nuvar, nfunc, ifunc, npf, tf, time, timestep, uparam, rho0, rho, volume, eint, epspxx, epspyy, epspzz, epspxy, epspyz, epspzx, depsxx, depsyy, depszz, depsxy, depsyz, depszx, epsxx, epsyy, epszz, epsxy, epsyz, epszx, sigoxx, sigoyy, sigozz, sigoxy, sigoyz, sigozx, signxx, signyy, signzz, signxy, signyz, signzx, sigvxx, sigvyy, sigvzz, sigvxy, sigvyz, sigvzx, soundsp, viscmax, uvar, off, ix, nix, nft)