32 A NEL , NUPARAM, NUVAR , NFUNC , IFUNC ,
33 B NPF , TF , TIME , TIMESTEP, UPARAM ,
34 C RHO0 , RHO , VOLUME , EINT ,
35 D DEPSXX , DEPSYY , DEPSZZ , DEPSXY , DEPSYZ , DEPSZX ,
36 E EPSXX , EPSYY , EPSZZ , EPSXY , EPSYZ , EPSZX ,
37 F SIGOXX , SIGOYY , SIGOZZ , SIGOXY , SIGOYZ , SIGOZX ,
38 G SIGNXX , SIGNYY , SIGNZZ , SIGNXY , SIGNYZ , SIGNZX ,
39 H SIGVXX , SIGVYY , SIGVZZ , SIGVXY , SIGVYZ , SIGVZX ,
40 I SOUNDSP, VISCMAX, UVAR , OFF , PLA , DPLA ,
41 J EPSD , TEMP , JTHE , JLAG , FHEAT )
60#include "implicit_f.inc"
64 INTEGER NEL, NUPARAM, NUVAR
65 INTEGER ,
INTENT(IN) :: JTHE
66 INTEGER ,
INTENT(IN) :: JLAG
68 . TIME , TIMESTEP , UPARAM(NUPARAM),
69 . RHO(NEL) , RHO0(NEL) , VOLUME(NEL), EINT(NEL),
70 . DEPSXX(NEL), DEPSYY(NEL), DEPSZZ(NEL), DEPSXY(NEL), (NEL), DEPSZX(NEL),
71 . EPSXX (NEL), EPSYY (NEL), EPSZZ (NEL), EPSXY (NEL), EPSYZ (NEL), EPSZX (NEL),
72 . SIGOXX(NEL), SIGOYY(NEL), SIGOZZ(NEL)
78 . signxx(nel), signyy(nel), signzz(nel),
79 . signxy(nel), signyz(nel), signzx(nel),
80 . sigvxx(nel), sigvyy(nel), sigvzz(nel),
81 . sigvxy(nel), sigvyz(nel), sigvzx(nel),
82 . soundsp(nel), viscmax(nel)
86 my_real :: uvar(nel,nuvar)
87 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: temp
88 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: fheat
92 INTEGER :: NPF(*), NFUNC, (NFUNC)
97 INTEGER I,J,NMAX,N, ITER, ITER_MAX
99 . e,nu,g,a,b,cm,cn,tm,tref,epsm,sigmam,
100 . mu,mu0,lambda0,mu_ratio,bulk,lambda
102 . sxx,syy,szz,sxy,syz,szx,eqvm,trc,ratio
103 . sigxx,sigyy,sigzz,sigxy,sigyz
104 . exx,eyy,ezz,exy,eyz,ezx,trace_deps,trace_sig, pressure, pressure0,
105 . v0,v1,fun,dfun, scale, cs, error, jc_val, djc_val, incr,
alpha,
106 . xx, dxx, norm_fun0, error1, error2, norm_v0,
107 . depsp_xx, depsp_yy, depsp_zz, depsp_xy, depsp_yz, depsp_zx, trceps
131 IF(timestep == zero)
THEN
143 IF (ifunc(1) > 0)
THEN
144 e = uparam(1)*finter(ifunc(1),temp(i),npf,tf,dydx)
146 IF (ifunc(3) > 0)
THEN
147 nu = uparam(2)*finter
160 IF (ifunc(1) > 0)
THEN
161 IF (ifunc(2) == 0 .OR. temp(i) > t0)
THEN
162 e = uparam(1)*finter(ifunc(1),temp(i),npf,tf,dydx)
163 ELSEIF (ifunc(2) > 0)
THEN
164 e = uparam(1)*finter(ifunc(2),temp(i),npf,tf,dydx)
167 IF (ifunc(3) > 0)
THEN
168 nu = uparam(2)*finter(ifunc(3),temp(i),npf,tf,dydx)
171 IF (uvar(i,10) == zero)
THEN
174 IF (uvar(i,11) == zero)
THEN
182 mu = half * e / (one + nu)
183 mu0 = half * e0 / (one + nu0)
185 lambda = e * nu / (one + nu) / (one - two * nu)
186 lambda0 = e0 * nu0 / (one + nu0) / (one - two * nu0)
187 bulk = third * e / (one - two * nu)
190 soundsp(i) = sqrt((two*mu+lambda)/rho(i))
194 trc = sigoxx(i) + sigoyy(i) + sigozz(i)
195 pressure0 = - third * trc
196 sxx = sigoxx(i) + pressure0
197 syy = sigoyy(i) + pressure0
198 szz = sigozz(i) + pressure0
204 trceps = depsxx(i) + depsyy(i) + depszz(i)
205 exx = depsxx(i) - third * trceps
206 eyy = depsyy(i) - third * trceps
207 ezz = depszz(i) - third * trceps
213 sxx = (sxx * mu_ratio + two * mu * exx)
214 syy = (syy * mu_ratio + two * mu * eyy)
215 szz = (szz * mu_ratio + two * mu * ezz)
216 sxy = (sxy * mu_ratio + mu * exy)
217 syz = (syz * mu_ratio + mu * eyz)
218 szx = (szx * mu_ratio + mu * ezx)
220 trc = epsxx(i) + epsyy(i) + epszz(i)
223 pressure = - bulk * trc
227 CALL jc(uvar(i,1),temp(i),a,b,cm,cn,tref,tm,epsm,sigmam,uvar(i,2),uvar(i,3))
228 eqvm = sqrt(three_half*(sxx**2+syy**2+szz**2+two*(sxy**2+syz**2+szx**2)))
240 ELSEIF(temp(i) >= tm)
THEN
254 v0 = eqvm / (three * mu)
256 fun = eqvm - three * mu * v0 - jc_val
263 DO WHILE (.NOT. converged .AND. iter <= iter_max)
264 CALL jc(uvar(i,1)+v0,temp(i),a,b,cm,cn,tref,tm,epsm,sigmam,jc_val,djc_val)
265 fun = eqvm - three * mu * v0 - jc_val
267 converged = error1 < tol * norm_fun0
268 IF (.NOT. converged)
THEN
269 dfun = -three * mu - djc_val
272 IF (incr < zero)
THEN
273 alpha =
min(one , - nine / ten * v0 / incr)
275 v0 = v0 +
alpha * incr
276 error2 = abs(
alpha * incr)
277 converged = error2 < tol * abs(v0)
286 uvar(i,1) = uvar(i,1) + v0
287 CALL jc(uvar(i,1),temp(i),a,b,cm,cn,tref,tm,epsm,sigmam,uvar(i,2),uvar(i,3))
288 scale=three_half*v0/eqvm
289 uvar(i,4) = uvar(i,4) + scale * sxx
290 uvar(i,5) = uvar(i,5) + scale * syy
291 uvar(i,6) = uvar(i,6) + scale * szz
292 uvar(i,7) = uvar(i,7) + scale * sxy
293 uvar(i,8) = uvar(i,8) + scale * syz
294 uvar(i,9) = uvar(i,9) + scale * szx
298 ratio = (one - three * mu * v0
300 IF (jthe /= 0 .AND. jlag /= 0)
THEN
301 fheat(i) = fheat(i) + uvar(i,2)*dpla(i)*volume(i)
302 ELSE IF (cs > zero)
THEN
303 temp(i) = temp(i) + uvar(i,2)*dpla(i)/cs
310 signxx(i) = sxx * ratio - pressure
311 signyy(i) = syy * ratio - pressure
312 signzz(i) = szz * ratio - pressure
313 signxy(i) = sxy * ratio
314 signyz(i) = syz * ratio
315 signzx(i) = szx * ratio
318 pla(1:nel) = uvar(1:nel,1)
subroutine sigeps106(nel, nuparam, nuvar, nfunc, ifunc, npf, tf, time, timestep, uparam, rho0, rho, volume, eint, 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, pla, dpla, epsd, temp, jthe, jlag, fheat)