40
41
42
45
46
47
48#include "implicit_f.inc"
49
50
51
52#include "com04_c.inc"
53#include "units_c.inc"
54#include "comlock.inc"
55#include "sms_c.inc"
56
57
58
59 INTEGER :: NEL,NUPARAM,NUVAR,JSMS,NUMTABL,NVARTMP,JTHE
61 INTEGER ,DIMENSION(NEL) ,INTENT(IN) :: NGL
62 INTEGER ,DIMENSION(NUMTABL),INTENT(IN) :: ITABLE
63 my_real ,
DIMENSION(NUPARAM),
INTENT(IN) :: uparam
64 my_real ,
DIMENSION(NEL) ,
INTENT(IN) :: thick,temp,
65 . depszz,depsyz,depszx,
66 . sigozz,sigoyz,sigozx,
area
67
68 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) :: epsd
69 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) ::
70 . signzz,signyz,signzx
71 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: off,pla,stifm,dmels,dmg
72 my_real ,
DIMENSION(NEL,NUVAR) ,
INTENT(INOUT) :: uvar
73 INTEGER,DIMENSION(NEL,NVARTMP) ,INTENT(INOUT) :: VARTMP
74 TYPE(TTABLE) ,DIMENSION(NTABLE) ,INTENT(IN) :: TABLE
75
76
77
78 INTEGER :: I,II,ITER,NITER,NINDX,NINDF,ITRX,IDAM
80 INTEGER :: IPOS1(,1), IPOS2(NEL,2), IPOS3(NEL,3)
81 INTEGER :: NDIM_YLD,FUNC_YLD
82 my_real :: xvec1(nel,1), xvec2(nel,2), xvec3(nel,3)
83 INTEGER ,DIMENSION(NEL) :: INDX,INDF
84 my_real :: young,nu,g,g2,bulk,yld0,qq,beta,hh,c11,c12,
85 . a1f,a2f,as,d1c,d2c,d1f,d2f,d_trx,d_jc,dm,expn,a1h,a2h
86
87 my_real cc,epsdref,epsdmax,frate,fcut,
alpha,alphai,epsdot
88
89 my_real facr,triax,rvoce,i1p,ip,jp,tp,fact,facd,dfac,dtinv,
90 . dlam,ddep,dfdlam,dyld_dpla,dpla_dlam,dphi_dlam,dfdpla,dtb,
91 . gamc,gamf,np_xx,np_yy,np_zz,np_xy,np_yz,np_zx,
92 . nf_xx,nf_yy,nf_zz,nf_xy,nf_yz,nf_zx,dpxx,dpyy,dpzz,dpxy,dpyz,dpzx
93 my_real ,
DIMENSION(NEL) :: a1, a2, i1,j2,yld,phi,dam,fdam,jcrate,stf,hardp,hardp_i,fvm,
94 . sxx,syy,szz,sxy,syz,szx,dpla,jcr_log,gamma,dgamm,pla_nl,dpdt_nl,yld_i,fdp
95
96
97 young = uparam(1)
98 nu = uparam(2)
99 g = uparam(3)
100 bulk = uparam(4)
101
102 yld0 = uparam(5)
103 qq = uparam(6)
104 beta = uparam(7)
105 hh = uparam(8)
106 a1f = uparam(9)
107 a2f = uparam(10)
108 a1h = uparam(11)
109 a2h = uparam(12)
110 as = uparam(13)
111
112 d1c = uparam(14)
113 d2c = uparam(15)
114 d1f = uparam(16)
115 d2f = uparam(17)
116 d_trx = uparam(18)
117 d_jc = uparam(19)
118 expn = uparam(20)
119
120 cc = uparam(21)
121 epsdref = uparam(22)
122 epsdmax = uparam(23)
123 fcut = uparam(24)
124
125 itrx = nint(uparam(26))
126 idam = nint(uparam(27))
127
128 xscale = uparam(30)
129 yscale = uparam(31)
130
131 func_yld = itable(1)
132 ndim_yld = table(func_yld)%NDIM
133
134
135
136
137
138 g2 = g * two
141 dtinv = one / (
max(timestep, em20))
142
143 stf(1:nel) = young *
area(1:nel)
144 stifm(1:nel) = stifm(1:nel) + stf(1:nel)*off(1:nel)
145
146 dam(1:nel) = dmg(1:nel)
147 dpla(1:nel) = zero
148 fdam(1:nel) = one - dam(1:nel)
149 DO i = 1,nel
150 IF (off(i) < 0.001) off(i) = zero
151 IF (off(i) < one) off(i) = off(i)*four_over_5
152 IF (off(i) == one) THEN
153 signzz(i) = sigozz(i)/fdam(i) + (depszz(i) /thick(i) )*young
154 signyz(i) = sigoyz(i)/fdam(i) + (depsyz(i) /thick(i) )*g
155 signzx(i) = sigozx(i)/fdam(i) + (depszx(i) /thick(i) )*g
156 i1(i) = signzz(i)
157
158 sxx(i) = - i1(i) * third
159 syy(i) = - i1(i) * third
160 szz(i) = signzz(i) - i1(i) * third
161 syz(i) = signyz(i)
162 szx(i) = signzx(i)
163 j2(i) = (sxx(i)**2 + syy(i)**2 + szz(i)**2)*half
164 . + syz(i)**2 + szx(i)**2
165 END IF
166 ENDDO
167
168
169 jcrate(1:nel) = one
170 DO i=1,nel
171 IF (off(i) == one) THEN
172 epsdot = sqrt(depsyz(i)**2 + depszx(i)**2 + depszz(i)**2)
173 epsdot = epsdot * dtinv / thick(i)
174 epsd(i) =
min(epsdot ,epsdmax)
175 epsd(i) =
alpha *epsd(i) + alphai * uvar(i,3)
176 uvar(i,3) = epsd(i)
177 IF (epsd(i) > epsdref) THEN
178 jcr_log(i) = log(epsd(i) / epsdref)
179 jcrate(i) = one + cc * jcr_log(i)
180 END IF
181 END IF
182 ENDDO
183
184
185
186 IF (ndim_yld == 1) THEN
187 xvec1(1:nel,1) = pla(1:nel)
188 ipos1(1:nel,1) = vartmp(1:nel,1)
189
190 CALL table_vinterp(table(func_yld),nel,nel,ipos1,xvec1,yld,hardp)
191
192 yld(1:nel) = yld(1:nel) * yscale * jcrate(1:nel)
193 hardp(1:nel) = hardp(1:nel) * yscale * jcrate(1:nel
194 vartmp(1:nel,1) = ipos1(1:nel,1)
195
196 ELSE IF (ndim_yld == 2) THEN
197 xvec2(1:nel,1) = pla(1:nel)
198 xvec2(1:nel,2) = epsd(1:nel)
199 ipos2(1:nel,1) = vartmp(1:nel,1)
200 ipos2(1:nel,2) = 1
201
202 CALL table_vinterp(table(func_yld),nel,nel,ipos2,xvec2,yld,hardp)
203
204 yld(1:nel) = yld(1:nel) * yscale
205 hardp(1:nel) = hardp(1:nel) * yscale
206 vartmp(1:nel,1) = ipos2(1:nel,1)
207
208 ELSE
209 xvec3(1:nel,1) = pla(1:nel)
210 xvec3(1:nel,2) = epsd(1:nel)
211 IF (jthe > 0) THEN
212 xvec3(1:nel,3) = temp(1:nel)
213 ELSE
214 xvec3(1:nel,3) = zero
215 END IF
216 ipos3(1:nel,1) = vartmp(1:nel,1)
217 ipos3(1:nel,2) = 1
218 ipos3(1:nel,3) = 1
219
220 CALL table_vinterp(table(func_yld),nel,nel,ipos3,xvec3,yld,hardp)
221
222 yld(1:nel) = yld(1:nel) * yscale
223 hardp(1:nel) = hardp(1:nel) * yscale
224 vartmp(1:nel,1) = ipos3(1:nel,1)
225
226 END IF
227
228 DO i = 1,nel
229 a1(i) = a1f + a1h * pla(i)
230 a2(i) =
max(zero, a2f + a2h * pla(i))
231 fdp(i) = third*(sqr3*yld0*a1(i)*i1(i) + a2(i)*
max(zero,i1(i))**2)
232 phi(i) = j2(i) + fdp(i) - yld(i)**2
233 ENDDO
234
235
236
237 nindx = 0
238 nindf = 0
239 DO i = 1,nel
240 IF (phi(i) > zero .and. off(i) == one) THEN
241 nindx = nindx + 1
242 indx(nindx) = i
243 END IF
244 ENDDO
245
246 IF (nindx > 0) THEN
247
248 niter = 4
249 dpla(1:nel) = zero
250
251 DO iter = 1,niter
252
253 DO ii = 1,nindx
254 i = indx(ii)
255
256
257 i1p =
max(zero, i1(i))
258 jp = third * as * i1p
259 tp = two * jp
260
261 np_xx = sxx(i)
262 np_yy = syy(i)
263 np_zz = szz(i) + tp
264 np_yz = syz(i)
265 np_zx = szx(i)
266
267
268 ip = third*(sqr3*yld0*a1(i) + two*a2(i)*i1p)
269 nf_xx = sxx(i)
270 nf_yy = syy(i)
271 nf_zz = szz(i) + ip
272 nf_yz = syz(i)
273 nf_zx = szx(i)
274
275
276 dfdlam = - nf_zz * (young * np_zz )
277 . -(nf_yz*np_yz + nf_zx*np_zx)*two*g2
278
279 dfdpla = third*(sqr3*a1h*yld0*i1(i) + a2h*i1p**2)
280
281 dpla_dlam = two*sqrt((j2(i) + tp*as*i1(i)))
282
283 dphi_dlam = dfdlam + (dfdpla - two*yld(i)*hardp(i))*dpla_dlam
284
285 dlam = -phi(i) / dphi_dlam
286
287
288 dpzz = dlam*np_zz
289 dpyz = dlam*np_yz
290 dpzx = dlam*np_zx
291
292 signzz(i) = signzz(i) - young *dpzz
293 signyz(i) = signyz(i) - g2 *dpyz
294 signzx(i) = signzx(i) - g2 *dpzx
295
296
297 ddep = dlam * dpla_dlam
298 dpla(i)=
max(zero, dpla(i) + ddep)
299 pla(i) = pla(i) + ddep
300 ENDDO
301
302
303
304
305 IF (ndim_yld == 1) THEN
306 DO ii = 1, nindx
307 i = indx(ii)
308 xvec1(ii,1) = pla(i)
309 ipos1(ii,1) = vartmp(i,1)
310 ENDDO
311
312 CALL table_vinterp(table(func_yld),nel,nel,ipos1,xvec1,yld_i,hardp_i)
313
314 DO ii = 1, nindx
315 i = indx(ii)
316 yld(i) = yld_i(ii)*yscale
317 hardp(i) = hardp_i(ii)*yscale
318 vartmp(i,1) = ipos1(ii,1)
319 ENDDO
320
321 ELSE IF (ndim_yld == 2) THEN
322 DO ii = 1, nindx
323 i = indx(ii)
324 xvec2(ii,1) = pla(i)
325 xvec2(ii,2) = epsd(i)
326 ipos2(ii,1) = vartmp(i,1)
327 ENDDO
328
329 CALL table_vinterp(table(func_yld),nel,nindx,ipos2,xvec2,yld_i,hardp_i)
330
331 DO ii = 1, nindx
332 i = indx(ii)
333 yld(i) = yld_i(ii)*yscale
334 hardp(i) = hardp_i(ii)*yscale
335 vartmp(i,1) = ipos2(ii,1)
336 ENDDO
337
338 ELSE
339 DO ii = 1, nindx
340 i = indx(ii)
341 xvec3(ii,1) = pla(i)
342 xvec3(ii,2) = epsd(i)
343 xvec3(ii,3) = temp(i)
344 ipos3(ii,1) = vartmp(i,1)
345 ENDDO
346
347 CALL table_vinterp(table(func_yld),nel,nel,ipos3,xvec3,yld_i,hardp_i)
348
349 DO ii = 1, nindx
350 i = indx(ii)
351 yld(i) = yld_i(ii)*yscale
352 hardp(i) = hardp_i(ii)*yscale
353 vartmp(i,1) = ipos3(ii,1)
354 ENDDO
355 END IF
356
357
358
359 DO ii = 1,nindx
360 i = indx(ii)
361 i1(i) = signzz(i)
362 i1p =
max(zero, i1(i))
363 sxx(i) = - i1(i)*third
364 syy(i) = - i1(i)*third
365 szz(i) = signzz(i) - i1(i)*third
366 syz(i) = signyz(i)
367 szx(i) = signzx(i)
368 j2(i) =(sxx(i)**2 + syy(i)**2 + szz(i)**2 ) * half
369 . + syz(i)**2 + szx(i)**2
370 a1(i) = a1f + a1h * pla(i)
371 a2(i) =
max(zero, a2f + a2h * pla(i))
372 fdp(i) = third*(sqr3*yld0*a1(i)*i1(i) + a2(i)*i1p**2)
373 phi(i) = j2(i) + fdp(i) - yld(i)**2
374 uvar(i,4) = phi(i) / yld(i)**2
375 END DO
376
377 END DO
378
379 END IF
380
381
382
383 IF (idam > 0) THEN
384 IF (idam == 1) THEN
385 dgamm(1:nel) = dpla(1:nel)
386 gamma(1:nel) = pla(1:nel)
387 ELSE
388 dgamm(1:nel) = dpla(1:nel) * fdam(1:nel)
389 uvar(1:nel,1) = uvar(1:nel,1) + dgamm(1:nel)
390 gamma(1:nel) = uvar(1:nel,1)
391 END IF
392
393 DO ii = 1,nindx
394 i = indx(ii)
395
396 triax = zero
397 fact = one
398 facr = one + d_jc * jcr_log(i)
399 IF ( j2(i)/= zero)triax = third * i1(i) / sqrt(three*j2(i))
400 IF (itrx == 1 ) THEN
401 fact = exp(-d_trx*triax)
402 ELSE
403 IF (triax > zero )fact = exp(-d_trx*triax)
404 ENDIF
405 gamc = (d1c + d2c * fact) * facr
406 gamf = (d1f + d2f * fact) * facr
407 IF (gamma(i) > gamc) THEN
408 IF (dam(i) == zeroTHEN
409 nindf = nindf + 1
410 indf(nindf) = i
411 END IF
412 IF (expn == one) THEN
413 dam(i) = dam(i) + dgamm(i) / (gamf - gamc)
414 ELSE
415 dfac = (gamma(i) - gamc) / (gamf - gamc)
416 dam(i) = dam(i) + expn * dfac**(expn-one) * dgamm(i) / (gamf - gamc)
417 END IF
418 IF (dam(i) >= one) THEN
419 dam(i) = one
420 off(i) = four_over_5
421 END IF
422 dmg(i) = dam(i)
423 END IF
424 ENDDO
425
426 DO i = 1, nel
427 facd = one - dam(i)
428 signzz(i) = signzz(i) * facd
429 signyz(i) = signyz(i) * facd
430 signzx(i) = signzx(i) * facd
431 END DO
432 END IF
433
434 IF (nindf > 0) THEN
435 DO ii=1,nindf
436#include "lockon.inc"
437 WRITE(iout, 1000) ngl(indf(ii))
438 WRITE(istdo,1100) ngl(indf(ii)),time
439#include "lockoff.inc"
440 ENDDO
441 END IF
442
443 1000 FORMAT(1x,'START DAMAGE IN SOLID ELEMENT NUMBER ',i10)
444 1100 FORMAT(1x,'START DAMAGE IN SOLID ELEMENT NUMBER ',i10,1x,' AT TIME :',g11.4)
445
446
447
448 IF (idtmins==2 .AND. jsms/=0 ) THEN
449 dtb = (dtmins/dtfacs)**2
450 DO i=1,nel
451 dmels(i)=
max(dmels(i),half*dtb*stf(i)*off(i))
452 ENDDO
453 ENDIF
454
455 RETURN
subroutine area(d1, x, x2, y, y2, eint, stif0)