42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60#include "implicit_f.inc"
61
62
63
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), depsyz(nel), depszx(nel),
71 . epsxx(nel), epsyy(nel), epszz(nel), epsxy(nel), epsyz(nel), epszx(nel),
72 . sigoxx(nel), sigoyy(nel), sigozz(nel), sigoxy(nel), sigoyz(nel), sigozx(nel),
73 . off(nel) , pla(nel) , dpla(nel) , epsd(nel)
74
75
76
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)
83
84
85
87 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: temp
88 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: fheat
89
90
91
92 INTEGER :: NPF(*), NFUNC, IFUNC(NFUNC)
94
95
96
97 INTEGER
98
99 . e,nu,g,a,b,cm,cn,tm,tref,epsm,sigmam,
100 . mu,mu0,lambda0,mu_ratio,bulk,lambda,
101 . f,tol,interval,e0, nu0,t0,
102 . sxx,syy,szz,sxy,syz,szx,eqvm,trc,ratio,
103 . sigxx,sigyy,sigzz,sigxy,sigyz,sigzx,
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
109 . finter,dydx
110 LOGICAL :: CONVERGED
111 EXTERNAL finter
112
113
114
115 e = uparam(1)
116 nu = uparam(2)
117 a = uparam(3)
118 b = uparam(4)
119 cm = uparam(5)
120 cn = uparam(6)
121 tm = uparam(7)
122 tref = uparam(8)
123 epsm = uparam(11)
124 sigmam = uparam(12)
125 nmax = uparam(13)
126 tol = uparam(14)
127 cs = uparam(15)
128
129
130
131 IF(timestep == zero)THEN
132 DO i=1,nel
133 uvar(i,1)=zero
134 uvar(i,2)=zero
135 uvar(i,3)=zero
136 uvar(i,4)=zero
137 uvar(i,5)=zero
138 uvar(i,6)=zero
139 uvar(i,7)=zero
140 uvar(i,8)=zero
141 uvar(i,9)=zero
142
143 IF (ifunc(1) > 0) THEN
144 e = uparam(1)*finter(ifunc(1),temp(i),npf,tf,dydx)
145 ENDIF
146 IF (ifunc(3) > 0) THEN
147 nu = uparam(2)*finter(ifunc(3),temp(i),npf,tf,dydx)
148 ENDIF
149 uvar(i,10)=e
150 uvar(i,11)=nu
151 uvar(i,12)=temp(i)
152 pla(i) = zero
153 ENDDO
154 ENDIF
155
156 interval=one
157 DO i=1,nel
158 t0 = uvar(i,12)
159
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)
165 ENDIF
166 ENDIF
167 IF (ifunc(3) > 0) THEN
168 nu = uparam(2)*finter(ifunc(3),temp(i),npf,tf,dydx)
169 ENDIF
170
171 IF (uvar(i,10) == zero) THEN
172 uvar(i,10) = e
173 ENDIF
174 IF (uvar(i,11) == zero) THEN
175 uvar(i,11) = nu
176 ENDIF
177
178
179 nu0 = uvar(i, 11)
180 e0 = uvar(i, 10)
181
182 mu = half * e / (one + nu)
183 mu0 = half * e0 / (one + nu0)
184 mu_ratio = mu / mu0
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)
188
189
190 soundsp(i) = sqrt((two*mu+lambda)/rho(i))
191 viscmax(i) = zero
192
193
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
199 sxy = sigoxy(i)
200 syz = sigoyz(i)
201 szx = sigozx(i)
202
203
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
208 exy = depsxy(i)
209 eyz = depsyz(i)
210 ezx = depszx(i)
211
212
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)
219
220 trc = epsxx(i) + epsyy(i) + epszz(i)
221
222
223 pressure = - bulk * trc
224
225
226
227 CALL jc(uvar(i,1),temp(i),a,b,cm,cn,tref,tm,epsm,sigmam,uvar(i
228 eqvm = sqrt(three_half*(sxx**2+syy**2+szz**2+two*(sxy**2+syz
229 f = eqvm - uvar(i,2)
230
231 uvar(i, 13) = zero
232 uvar(i, 14) = zero
233
234 IF (f <= zero) THEN
235
236
237
238 dpla(i) = zero
239 ratio = one
240 ELSEIF(temp(i) >= tm) THEN
241
242
243
244 dpla(i) = zero
245 ratio = zero
246 ELSE
247
248
249
250
251
252
253
254 v0 = eqvm / (three * mu)
255 CALL jc(uvar(i,1)+v0,temp(i),a,b,cm,cn,tref,tm,epsm,sigmam,jc_val,djc_val)
256 fun = eqvm - three * mu * v0 - jc_val
257 norm_fun0 = abs(fun)
258 norm_v0 = abs(v0)
259 converged = .false.
260 iter = 0
261 error2 = zero
262 iter_max = nmax
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
266 error1 = abs(fun)
267 converged = error1 < tol * norm_fun0
268 IF (.NOT. converged) THEN
269 dfun = -three * mu - djc_val
270 incr = - fun / dfun
272 IF (incr < zero) THEN
273 alpha =
min(one , - nine / ten * v0 / incr)
274 ENDIF
275 v0 = v0 +
alpha * incr
276 error2 = abs(
alpha * incr)
277 converged = error2 < tol * abs(v0)
278 ENDIF
279 iter = iter + 1
280 ENDDO
281
282 uvar(i, 13) = iter
283 uvar(i, 14) = error2
284
285 dpla(i) = 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
295
296 uvar(i,2)=uvar(i,2)
297 uvar(i,3)=uvar(i,3)
298 ratio = (one - three * mu * v0 / eqvm)
299
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
304 ENDIF
305 ENDIF
306
307 uvar(i,10) = e
308 uvar(i,11) = nu
309 uvar(i,12) = temp(i)
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
316 ENDDO
317
318 pla(1:nel) = uvar(1:nel,1)
319
320 DO i=1,nel
321 viscmax(i)= zero
322 sigvxx(i) = zero
323 sigvyy(i) = zero
324 sigvzz(i) = zero
325 sigvxy(i) = zero
326 sigvyz(i) = zero
327 sigvzx(i) = zero
328 ENDDO
329
330 RETURN
subroutine jc(p, t, a, b, cm, cn, tref, tm, epsm, sigmam, jc_yield, tan_jc)