33 1 NEL ,NUPARAM ,NUVAR ,UPARAM ,UVAR ,
34 2 NFUNC ,IFUNC ,NPF ,TF ,NGL ,
35 3 TIME ,TIMESTEP ,IPG ,ILAY ,IPT ,
36 4 EPSXX ,EPSYY ,EPSXY ,DMG_FLAG ,DMG_SCALE,
37 5 EPSPXX ,EPSPYY ,EPSPXY ,ALDT ,ISMSTR ,
38 6 SIGNXX ,SIGNYY ,SIGNXY ,LF_DAMMX ,
39 7 OFF ,OFFLY ,FOFF ,DFMAX ,TDEL )
45#include "implicit_f.inc"
87 INTEGER ,
INTENT(IN) :: NEL,NUPARAM,NUVAR,IPG,ILAY,IPT,ISMSTR
88 INTEGER ,
INTENT(IN) :: LF_DAMMX
89 INTEGER ,
DIMENSION(NEL) ,
INTENT(IN) :: NGL
90 my_real ,
INTENT(IN) :: TIME,TIMESTEP
91 my_real ,
DIMENSION(NEL) ,
INTENT(IN) :: OFF,EPSXX,EPSYY,EPSXY,
92 . EPSPXX,EPSPYY,EPSPXY,ALDT
93 my_real ,
DIMENSION(NUPARAM) ,
INTENT(IN) :: UPARAM
98 INTEGER ,
INTENT(OUT) ::
99 INTEGER ,
DIMENSION(NEL) ,
INTENT(INOUT) :: OFFLY,
100 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: signxx,signyy,signxy
101 my_real ,
DIMENSION(NEL,LF_DAMMX),
INTENT(INOUT) :: dfmax
102 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) :: tdel,dmg_scale
103 my_real ,
DIMENSION(NEL,NUVAR) ,
INTENT(INOUT) :: uvar
107 INTEGER NPF(*), NFUNC, IFUNC(NFUNC)
108 my_real finter ,tf(*)
121 INTEGER I,J,NINDX,FAILI,MODE,XX,XY,YY,IFUNC_SIZ,STRDEF,STRFLAG
122 INTEGER ,
DIMENSION(NEL) :: INDX,IPOSP,IADP,ILENP
123 INTEGER ,
DIMENSION(NEL,6) :: FMODE
124 my_real ODAM(,6),EPSP(NEL,6),
125 . SIGOXX(NEL),SIGOYY(NEL),SIGOXY(NEL),ESCAL(NEL),DYDXE(NEL)
126 my_real DYDX,FRATE,ET1,ET2,ET12,EC1,EC2,EC12,ET3,EC3,EC23,ET23,EC31,
127 . ET31,ET1M,ET2M,ET12M,EC1M,EC2M,EC12M,ET3M,EC3M,EC23M,ET23M,EC31M,
128 . et31m,di,
alpha,damxx,damyy,damxy,odamxx,odamyy,odamxy,theta,c,s,
129 . epspref,epdot,deps,depsm,fact,fscale_siz,ref_siz,epsd1,epsd2,
130 . epst1,epst2,epst_a,epst_b
131 my_real ,
DIMENSION(NEL) :: eps11,eps22,eps12,epsp11,epsp22,epsp12,
132 . epsm1,epsm2,epsm3,epsm4,epsm5,epsm6
133 my_real ,
DIMENSION(:),
POINTER :: fsize
137 dmg_flag = int(uparam(1))
138 alpha =
min(two*pi*uparam(16)*timestep,one)
140 fscale_siz = uparam(26)
142 strdef = nint(uparam(28))
143 ifunc_siz = ifunc(13)
156 IF (strdef == 2)
THEN
157 IF (ismstr /= 1 .AND. ismstr /= 3 .AND. ismstr /= 11)
THEN
160 ELSE IF (strdef == 3)
THEN
161 IF (ismstr == 1 .OR. ismstr == 3 .OR. ismstr == 11)
THEN
166 SELECT CASE (strflag)
170 IF (off(i) == one )
THEN
171 theta = half*atan(epsxy(i) /
max((epsxx(i)-epsyy(i)),em20))
175 epst_a = half*(epsxx(i)+epsyy(i))
176 epst_b = sqrt( (half*(epsxx(i)-epsyy(i)))**2 + (half*epsxy(i))**2)
177 epst1 = epst_a + epst_b
178 epst2 = epst_a - epst_b
179 epst1 = exp(epst1) - one
180 epst2 = exp(epst2) - one
181 eps11(i) = c*c*epst1 + s*s*epst2
182 eps22(i) = s*s*epst1 + c*c*epst2
183 eps12(i) = s*c*(epst2 - epst1)
185 epst_a = half*(epspxx(i)+epspyy(i))
186 epst_b = sqrt( (half*(epspxx(i)-epspyy(i)))**2 + (half*epspxy(i))**2)
187 epsd1 = epst_a + epst_b
188 epsd2 = epst_a - epst_b
189 epsd1 = (one+epst1)*epsd1
190 epsd2 = (one+epst2)*epsd2
191 epsp11(i) = c*c*epsd1 + s*s*epsd2
192 epsp22(i) = s*s*epsd1 + c*c*epsd2
193 epsp12(i) = s*c*(epsd2 - epsd1)
199 IF (off(i) == one )
THEN
200 theta = half*atan(epsxy(i) /
max((epsxx(i)-epsyy(i)),em20))
204 epst_a = half*(epsxx(i)+epsyy(i))
205 epst_b = sqrt( (half*(epsxx(i)-epsyy(i)))**2 + (half*epsxy(i))**2)
206 epst1 = epst_a + epst_b
207 epst2 = epst_a - epst_b
208 epst1 = log(one + epst1)
209 epst2 = log(one + epst2)
210 eps11(i) = c*c*epst1 + s*s*epst2
211 eps22(i) = s*s*epst1 + c*c*epst2
212 eps12(i) = s*c*(epst2 - epst1)
214 epst_a = half*(epspxx(i)+epspyy(i))
215 epst_b = sqrt( (half*(epspxx(i)-epspyy(i)))**2 + (half*epspxy(i))**2)
216 epsd1 = epst_a + epst_b
217 epsd2 = epst_a - epst_b
218 epsd1 = (one/exp(epst1))*epsd1
219 epsd2 = (one/exp(epst2))*epsd2
220 epsp11(i) = c*c*epsd1 + s*s*epsd2
221 epsp22(i) = s*s*epsd1 + c*c*epsd2
222 epsp12(i) = s*c*(epsd2 - epsd1)
228 eps11(1:nel) = epsxx(1:nel)
229 eps22(1:nel) = epsyy(1:nel)
230 eps12(1:nel) = half*epsxy(1:nel)
231 epsp11(1:nel) = epspxx(1:nel)
232 epsp22(1:nel) = epspyy(1:nel)
233 epsp12(1:nel) = half*epspxy(1:nel)
237 fsize => uvar(1:nel,13)
239 IF (fsize(1)==zero)
THEN
240 IF (ifunc_siz > 0)
THEN
241 escal(1:nel) = aldt(1:nel) / ref_siz
243 iadp(1:nel) = npf(ifunc_siz) / 2 + 1
244 ilenp(1:nel) = npf(ifunc_siz + 1) / 2 - iadp(1:nel)
245 CALL vinter2(tf,iadp,iposp,ilenp,nel,escal,dydxe,fsize)
246 fsize(1:nel) = fscale_siz * fsize(1:nel)
258 odam(i,j) =
min(dfmax(i,1+j),one-em3)
259 epsp(i,j) = uvar(i,j)
263 sigoxx(i) = uvar(i,6+xx)
264 sigoyy(i) = uvar(i,6+yy)
265 sigoxy(i) = uvar(i,6+xy)
270 epsp(i,xx) =
alpha * abs(epsp11(i)) + (one-
alpha)*epsp(i,xx)
271 epsp(i,yy) =
alpha * abs(epsp22(i)) + (one-
alpha)*epsp(i,yy)
272 epsp(i,xy) =
alpha * abs(epsp12(i)) + (one-
alpha)*epsp(i,xy)
279 IF (off(i) == one .AND. offly(i) == 1 .AND. foff(i) == 1)
THEN
309 epdot = abs(epsp(i,xx))/epspref
310 IF (ifunc(mode) > 0)
THEN
311 frate = finter(ifunc(mode),epdot,npf,tf,dydx)
315 frate = frate*fsize(i)
318 deps = eps11(i) - et1
319 IF (deps > zero .AND. dfmax(i,1+mode) < one)
THEN
321 fact = et1m / eps11(i)
322 di = fact * deps / depsm
323 dfmax(i,1+mode) =
max(dfmax(i,1+mode), di)
324 IF (dfmax(i,1+mode) >= one)
THEN
327 dfmax(i,1+mode) = one
333 epdot = abs(epsp(i,yy))/epspref
334 IF (ifunc(mode) > 0)
THEN
335 frate = finter(ifunc(mode
339 frate = frate*fsize(i)
342 deps =
max(eps22(i) - et2, zero)
343 IF (deps > zero .AND. dfmax(i,1+mode) < one)
THEN
345 fact = et2m / eps22(i)
346 di = fact * deps / depsm
347 dfmax(i,1+mode) =
max(dfmax(i,1+mode), di)
348 IF (dfmax(i,1+mode) >= one)
THEN
351 dfmax(i,1+mode) = one
357 epdot = abs(epsp(i,xy))/epspref
358 IF (ifunc(mode) > 0)
THEN
359 frate = finter(ifunc(mode),epdot,npf,tf,dydx)
363 frate = frate*fsize(i)
364 et12m = frate * et12m
366 deps =
max(eps12(i) - et12, zero)
367 IF (deps > zero .AND. dfmax(i,1+mode) < one)
THEN
368 depsm = (et12m - et12)
369 fact = et12m / eps12(i)
370 di = fact * deps / depsm
371 dfmax(i,1+mode) =
max(dfmax(i,1+mode), di)
372 IF (dfmax(i,1+mode) >= one)
THEN
375 dfmax(i,1+mode) = one
381 epdot = abs(epsp(i,xx))/epspref
382 IF (ifunc(mode) > 0)
THEN
383 frate = finter(ifunc(mode),epdot,npf,tf,dydx)
387 frate = frate*fsize(i)
390 deps = -eps11(i) - ec1
393 fact = ec1m / abs(eps11(i))
394 di = fact * deps / depsm
395 dfmax(i,1+mode) =
max(dfmax(i,1+mode), di)
396 IF (dfmax(i,1+mode) >= one)
THEN
399 dfmax(i,1+mode) = one
405 epdot = abs(epsp(i,yy))/epspref
406 IF (ifunc(mode) > 0)
THEN
407 frate = finter(ifunc(mode),epdot,npf,tf,dydx)
411 frate = frate*fsize(i)
414 deps =
max(-eps22(i) - ec2, zero)
415 IF (deps > zero .AND. dfmax(i,1+mode) < one)
THEN
417 fact = ec2m / abs(eps22(i))
418 di = fact * deps / depsm
419 dfmax(i,1+mode) =
max(dfmax(i,1+mode), di)
420 IF (dfmax(i,1+mode) >= one)
THEN
423 dfmax(i,1+mode) = one
429 epdot = abs(epsp(i,xy))/epspref
430 IF (ifunc(mode) > 0)
THEN
431 frate = finter(ifunc(mode),epdot,npf,tf,dydx)
435 frate = frate*fsize(i)
436 ec12m = frate * ec12m
438 deps =
max(-eps12(i) - ec12, zero)
439 IF (deps > zero .AND. dfmax(i,1+mode) < one)
THEN
440 depsm = (ec12m - ec12)
441 fact = ec12m / abs(eps12(i))
442 di = fact * deps / depsm
443 dfmax(i,1+mode) =
max(dfmax(i,1+mode), di)
444 IF (dfmax(i,1+mode) >= one)
THEN
447 dfmax(i,1+mode) = one
465 WRITE(iout, 1000) ngl(i),ipg,ilay
466WRITE(istdo,1000) ngl(i
467 IF (fmode(i,1)==1)
WRITE(iout, 2000)
'1 - TRACTION XX'
468 IF (fmode(i,2)==1)
WRITE(iout, 2000)
'2 - TRACTION YY',eps22(i
469 IF (fmode(i,3)==1)
WRITE(iout, 2000)
'3 - POSITIVE SHEAR XY',eps12(i),epsm3(i),epsp(i,xy)
470 IF (fmode(i,4)==1)
WRITE(iout, 2000)
'4 - COMPRESSION XX',eps11(i),epsm4(i),epsp(i,xx)
471 IF (fmode(i,5)==1)
WRITE(iout, 2000)
'5 - COMPRESSION YY',eps22(i),epsm5(i),epsp(i,yy)
472 IF (fmode(i,6)==1)
WRITE(iout, 2000)
'6 - NEGATIVE SHEAR XY',eps12(i),epsm6(i),epsp(i,xy)
473#include "lockoff.inc"
480 IF (dmg_flag == 1)
THEN
482 damxx =
max(dfmax(i,2),dfmax(i,5))
483 damyy =
max(dfmax(i,3),dfmax(i,6))
484 damxy =
max(dfmax(i,4),dfmax(i,7))
485 dfmax(i,1) =
max(dfmax(i,1), damxx)
486 dfmax(i,1) =
max(dfmax(i,1), damyy)
487 dfmax(i,1) =
max(dfmax(i,1), damxy)
488 dfmax(i,1) =
min(one,dfmax(i,1))
489 dmg_scale(i) = one - dfmax(i,1)
493 damxx =
max(dfmax(i,2),dfmax(i,5))
494 damyy =
max(dfmax(i,3),dfmax(i,6))
495 damxy =
max(dfmax(i,4),dfmax(i,7))
496 dfmax(i,1) =
max(dfmax(i,1), damxx)
497 dfmax(i,1) =
max(dfmax(i,1), damyy)
498 dfmax(i,1) =
max(dfmax(i,1), damxy)
499 dfmax(i,1) =
min(one,dfmax(i,1))
500 odamxx =
max(odam(i,1),odam(i,4))
501 odamyy =
max(odam(i,2),odam(i,5))
502 odamxy =
max(odam(i,3),odam(i,6))
504 signxx(i) = sigoxx(i)/(one-odamxx) + (signxx(i) - sigoxx(i))
505 signyy(i) = sigoyy(i)/(one-odamyy) + (signyy(i) - sigoyy(i))
506 signxy(i) = sigoxy(i)/(one-odamxy) + (signxy(i) - sigoxy(i))
508 signxx(i) = signxx(i)* (one-damxx)
509 signyy(i) = signyy(i)* (one-damyy)
510 signxy(i) = signxy(i)* (one-damxy)
511 uvar(i,7) = signxx(i)
512 uvar(i,8) = signyy(i)
513 uvar(i,9) = signxy(i)
519 uvar(i,j) = epsp(i,j)
523 1000
FORMAT(1x,
'FAILURE (ORTHSTR) OF SHELL ELEMENT ',i10,1x,
',GAUSS PT',
524 . i2,1x,
',LAYER',i3,1x,
',INTEGRATION PT',i3)
525 2000
FORMAT(1x,
'MODE',1x,a,
', STRAIN',1pe12.4,
', CRITICAL VALUE',1pe12.4,
526 .
', STRAIN RATE',1pe12.4)