37
38
39
40
41
42
43#include "implicit_f.inc"
44
45
46
47#include "units_c.inc"
48#include "comlock.inc"
49#include "com_xfem1.inc"
50#include "mvsiz_p.inc"
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 INTEGER NEL,NUPARAM,NUVAR,IXFEM,IORTH,IXEL,ILAY,IPT,NPT
75 INTEGER ELCRKINI(NXLAYMAX,NEL),NGL(NEL)
77 my_real,
DIMENSION(NEL) :: ssp,aldt,tdel,crklen,
78 . signxx,signyy,signzz,signxy,signyz,signzx
79 my_real uparam(nuparam),dir_a(nel,2),crkdir(nel,2),dir1_crk(nxlaymax,mvsiz),
80 . dir2_crk(nxlaymax,nel)
81 TARGET :: dir1_crk,dir2_crk
82
83
84
85 INTEGER OFFLY(NEL)
86 my_real uvar(nel,nuvar),off(nel)
87
88
89
90 INTEGER I,J,NINDX,NINDXD,IDEB,ISRATE
91 INTEGER , DIMENSION(NEL) :: INDX,INDXD,RFLAG
92 my_real sigmax,aa,bb,cc,s1,s2,s3,cr,k_ic,k_th,v0,vc,tfact,reflen,
93 . cosi,cosx,cosy,sinx,siny,cos2,sin2,dmg1,dmg3,
94 . sp1,sp2,sp3,geored,cr_foil,cr_air,cr_core,cr_edge,
alpha,alphai,exp_n,exp_m
95 my_real,
DIMENSION(NEL) :: dadv,tpropg,ai,formf,sigp_akt,dmg_scale,
96 . sigp1,sigp2,sigdt1,sigdt2,sig_dtf1,sig_dtf2,sigp_min,sigp_max
97 my_real,
DIMENSION(:),
POINTER :: dir1,dir2
98 CHARACTER (LEN=3) :: XCHAR
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 xchar = ' '
122 IF (ixel > 0) THEN
123 IF (ixel == 1) THEN
124 xchar = '1st'
125 ELSEIF (ixel == 2) THEN
126 xchar = '2nd'
127 ELSEIF (ixel == 3) THEN
128 xchar = '3rd'
129 ENDIF
130 ELSE
131 xchar = 'standard'
132 ENDIF
133
134 rflag(1:nel) = 0
135 indx(1:nel) = 0
136 nindx = 0
137 nindxd = 0
138
139 exp_n = uparam(1)
140 cr_foil = uparam(2)
141 cr_air = uparam(3)
142 cr_core = uparam(4)
143 cr_edge = uparam(5)
144 k_ic = uparam(6)
145 k_th = uparam(7)
146 v0 = uparam(8)
147 vc = uparam(9)
149 geored = uparam(11)
150 reflen = nint(uparam(14))
151 israte = nint(uparam(16))
152 ideb = nint(uparam(17))
153
155 exp_m = one / (one + exp_n)
156
157
158 DO i = 1,nel
159 dadv(i) =
min(one, geored / sqrt(aldt(i)/reflen) )
160 tpropg(i) = crklen(i) /
min(vc,ssp(i))
161 tpropg(i) =
max(tpropg(i), timestep)
162 uvar(i,12)= dadv(i)
163 END DO
164
165
166 IF (time == zero) then
167
168 DO i=1,nel
169 IF (uvar(i,10) == one) THEN
170 ai(i) = cr_edge
171 formf(i) = 1.12
172 ELSE
173 formf(i) = one
174 IF (ipt == 1) THEN
175 ai(i) = cr_foil
176 ELSEIF (ipt == npt) THEN
177 ai(i) = cr_air
178 ELSE
179 ai(i) = cr_core
180 ENDIF
181 ENDIF
182 sigp_akt(i) = (two*(exp_n + one)*k_ic**exp_n) /
183 . ((exp_n - two)*v0*(formf(i)*sqrt(pi))**exp_n*
184 . ai(i)**((exp_n-two)/two))
185 sigp_akt(i) = sigp_akt(i)**exp_m
186
187 sigp_min(i) = k_th / (formf(i)*sqrt(pi*ai(i)))
188 sigp_max(i) = k_ic / (formf(i)*sqrt(pi*ai(i)))
189 uvar(i,5) = sigp_min(i)
190 uvar(i,6) = sigp_max(i)
191 uvar(i,7) = formf(i)
192 uvar(i,8) = ai(i)
193 uvar(i,9) = sigp_akt(i)
194 ENDDO
195 ELSE
196 sigp_min(1:nel) = uvar(1:nel,5)
197 sigp_max(1:nel) = uvar(1:nel,6)
198 formf(1:nel) = uvar(1:nel,7)
199 ai(1:nel) = uvar(1:nel,8)
200 sigp_akt(1:nel) = uvar(1:nel,9)
201 ENDIF
202
203
204
205 DO i = 1,nel
206 aa = (signxx(i) + signyy(i))*half
207 bb = (signxx(i) - signyy(i))*half
208 cc = signxy(i)
209 cr = sqrt(bb**2 + cc**2)
210 s1 = aa + cr
211 s2 = aa - cr
212 sigp1(i) = s1
213 sigp2(i) = s2
214
215
216
217
218
219
220
221
222 END DO
223
224
225
226 IF (israte == 0) THEN
227
228 DO i = 1,nel
229 sigdt1(i) = abs(sigp1(i) - uvar(i,1)) /
max(timestep, em20)
230 sigdt2(i) = abs(sigp2(i) - uvar(i,2)) /
max(timestep, em20)
231 sigdt1(i) =
alpha * sigdt1(i) + alphai * uvar(i,3)
232 sigdt2(i) =
alpha * sigdt2(i) + alphai * uvar(i,4)
233 END DO
234 ELSE
235
236 DO i = 1,nel
237 IF (off(i) == one) THEN
238 sigdt1(i) = abs(sigp1(i) - uvar(i,1)) /
max(timestep, em20)
239 uvar(i,21) = sigdt1(i)
240 DO j = 1,49
241 sigdt1(i) = sigdt1(i) + uvar(i,21+j)
242 ENDDO
243 sigdt1(i) = sigdt1(i) / 50
244 DO j = 70,22,-1
245 uvar(i,j) = uvar(i,j-1)
246 ENDDO
247
248 sigdt2(i) = abs(sigp2(i) - uvar(i,2)) /
max(timestep, em20)
249 uvar(i,71) = sigdt2(i)
250 DO j = 1,49
251 sigdt2(i) = sigdt2(i) + uvar(i,71+j)
252 ENDDO
253 sigdt2(i) = sigdt2(i) / 50
254 DO j = 120,72,-1
255 uvar(i,j) = uvar(i,j-1)
256 ENDDO
257 ELSE
258 sigdt1(i) = zero
259 sigdt2(i) = zero
260 ENDIF
261 END DO
262 ENDIF
263
264
265
266 IF (ipt == npt) THEN
267 DO i = 1,nel
268 sig_dtf1(i) = sigp_akt(i) *abs(sigdt1(i))**exp_m
269 sig_dtf2(i) = sigp_akt(i) *abs(sigdt2(i))**exp_m
270 sig_dtf1(i) =
max(sig_dtf1(i),sigp_min(i))
271 sig_dtf1(i) =
min(sig_dtf1(i),sigp_max(i))
272 sig_dtf2(i) =
max(sig_dtf2(i),sigp_min(i))
273 sig_dtf2(i) =
min(sig_dtf2(i),sigp_max(i))
274 END DO
275 ELSEIF (ipt < npt) THEN
276 DO i = 1,nel
277 IF (uvar(i,10) == one) THEN
278 sig_dtf1(i) = sigp_akt(i)*abs(sigdt1(i))**exp_m
279 sig_dtf2(i) = sigp_akt(i)*abs(sigdt2(i))**exp_m
280 sig_dtf1(i) =
max(sig_dtf1(i),sigp_min(i))
281 sig_dtf1(i) =
min(sig_dtf1(i),sigp_max(i))
282 sig_dtf2(i) =
max(sig_dtf2(i),sigp_min(i))
283 sig_dtf2(i) =
min(sig_dtf2(i),sigp_max(i))
284 ELSE
285 sig_dtf1(i) = sigp_max(i)
286 sig_dtf2(i) = sigp_max(i)
287 ENDIF
288 END DO
289 ENDIF
290
291 IF (ixel == 0) THEN
292 DO i = 1,nel
293 IF (off(i) == one) THEN
294 IF (elcrkini(ilay,i) == 0) THEN
295
296 IF (sigp1(i) > sig_dtf1(i) .and. tdel(i) == zero .and. offly(i) == 1) THEN
297
298 tdel(i) = time
299 offly(i) = 0
300 elcrkini(ilay,i) = -5
301 nindx = nindx+1
302 indx(nindx) = i
303 rflag(i) = 1
304 ENDIF
305 IF (tdel(i) > 0) THEN
306 tfact = (time - tdel(i)) / tpropg(i)
307 tfact =
min(one, tfact)
308 dmg_scale(i) = one - tfact
309 nindxd = nindxd+1
310 indxd(nindxd) = i
311 IF (tfact >= one) THEN
312 elcrkini(ilay,i) = -1
313 off(i) = four_over_5
314 IF (iorth > 0) THEN
315 cosx = dir_a(i,1)
316 sinx = dir_a(i,2)
317 cosy = crkdir(i,1)
318 siny = crkdir(i,2)
319 dir1_crk(ilay,i) = cosx*cosy - sinx*siny
320 dir2_crk(ilay,i) = cosx*siny + sinx*cosy
321 ELSE
322 dir1_crk(ilay,i) = crkdir(i,1)
323 dir2_crk(ilay,i) = crkdir(i,2)
324 ENDIF
325 ELSE
326 ENDIF
327 ENDIF
328
329 ELSEIF (elcrkini(ilay,i) == 2) THEN
330
331 uvar(i,11) = one
332 sig_dtf1(i) = sig_dtf1(i)*dadv(i)
333 sig_dtf2(i) = sig_dtf2(i)*dadv(i)
334 sig_dtf1(i) =
max(sig_dtf1(i),sigp_min(i)*dadv(i))
335 sig_dtf1(i) =
min(sig_dtf1(i),sigp_max(i)*dadv(i))
336 sig_dtf2(i) =
max(sig_dtf2(i),sigp_min(i)*dadv(i))
337 sig_dtf2(i) =
min(sig_dtf2(i),sigp_max(i)*dadv(i))
338 IF (sigp1(i) > sig_dtf1(i) .and. tdel(i) == zero .and. offly(i) == 1) THEN
339 tdel(i) = time
340 offly(i) = 0
341 elcrkini(ilay,i) = 5
342 nindx = nindx+1
343 indx(nindx) = i
344 rflag(i) =-1
345 ENDIF
346 IF (offly(i) == 0) THEN
347 tfact = (time - tdel(i)) / tpropg(i)
348 nindxd = nindxd+1
349 indxd(nindxd) = i
350 IF (tfact >= one) THEN
351 elcrkini(ilay,i) = 1
352 dmg_scale(i) = zero
353 off(i) = four_over_5
354 IF (iorth > 0) THEN
355 cosx = dir_a(i,1)
356 sinx = dir_a(i,2)
357 cosy = crkdir(i,1)
358 siny = crkdir(i,2)
359 dir1_crk(ilay,i) = cosx*cosy - sinx*siny
360 dir2_crk(ilay,i) = cosx*siny + sinx*cosy
361 ELSE
362 dir1_crk(ilay,i) = crkdir(i,1)
363 dir2_crk(ilay,i) = crkdir(i,2)
364 ENDIF
365 ELSE
366 dmg_scale(i) = one - tfact
367 ENDIF
368 ENDIF
369 ENDIF
370 ENDIF
371 ENDDO
372
373
374
375 IF (nindx > 0) THEN
376 DO j=1,nindx
377 i = indx(j)
378 s1 = signxy(i)
379 s2 = sigp1(i) - signxx(i)
380 cr = sqrt(s1**2 + s2**2)
381 IF (cr > zero) THEN
382 crkdir(i,1) = s1 / cr
383 crkdir(i,2) = s2 / cr
384 ELSEIF (s1 > s2) THEN
385 crkdir(i,1) = zero
386 crkdir(i,2) = one
387 ELSE
388 crkdir(i,1) = one
389 crkdir(i,2) = zero
390 ENDIF
391 ENDDO
392
393 IF (iorth > 0) THEN
394 DO j=1,nindx
395 i = indx(j)
396 cosx = dir_a(i,1)
397 sinx = dir_a(i,2)
398 cosy = crkdir(i,1)
399 siny = crkdir(i,2)
400 dir1_crk(ilay,i) = cosx*cosy - sinx*siny
401 dir2_crk(ilay,i) = cosx*siny + sinx*cosy
402 ENDDO
403 ELSE
404 DO j=1,nindx
405 i = indx(j)
406 dir1_crk(ilay,i) = crkdir(i,1)
407 dir2_crk(ilay,i) = crkdir(i,2)
408 ENDDO
409 ENDIF
410 ENDIF
411
412
413
414 IF (nindxd > 0) THEN
415 DO j=1,nindxd
416 i = indxd(j)
417 s1 = signxx(i)
418 s2 = signyy(i)
419 s3 = signxy(i)
420 cosx = crkdir(i,1)
421 sinx = crkdir(i,2)
422 cos2 = cosx * cosx
423 sin2 = sinx * sinx
424 cosi = cosx * sinx
425
426 sp1 = cos2*s1 + sin2*s2 + two*cosi*s3
427 sp2 = sin2*s1 + cos2*s2 - two*cosi*s3
428 sp3 = cosi*(s2 - s1) + (cos2 - sin2)*s3
429
430 dmg1 = dmg_scale(i)
431 dmg3 =
min(one, 0.6 + 0.4 * dmg1)
432
433 sp1 = sp1 * dmg1
434 sp3 = sp3 * dmg3
435
436 signxx(i) = cos2*sp1 + sin2*sp2 - two*cosi*sp3
437 signyy(i) = sin2*sp1 + cos2*sp2 + two*cosi*sp3
438 signxy(i) = cosi*(sp1 - sp2) + (cos2 - sin2)*sp3
439 ENDDO
440
441 if (ideb==1) then
442 DO j=1,nindxd
443 i = indxd(j)
444 write(iout,'(A,I10,3E16.9)') 'DAMAGE ELEMENT N, CRLEN,TPROPG,DMG_SCALE=',
445 . ngl(i),crklen(i),tpropg(i),dmg_scale(i)
446 ENDDO
447 endif
448 ENDIF
449
450 ELSEIF (ixel > 0) THEN
451 DO i = 1,nel
452 IF (off(i) == one) THEN
453 IF (elcrkini(ilay,i) == 2) THEN
454 nindx = nindx+1
455 indx(nindx) = i
456 rflag(i) = 3
457 off(i) = four_over_5
458 ELSE
459 sigp_min(i) = k_th / (sqrt(pi*cr_foil))
460 sigp_max(i) = k_ic / (sqrt(pi*cr_foil))
461 sig_dtf1(i) = sigp_max(i) * dadv(i)
462 IF (sigp1(i) > sig_dtf1(i)) THEN
463
464
465 nindx = nindx+1
466 indx(nindx) = i
467 rflag(i) = 3
468 off(i) = four_over_5
469 ENDIF
470 ENDIF
471 ENDIF
472 ENDDO
473 ENDIF
474
475 DO i=1,nel
476 uvar(i,1) = sigp1(i)
477 uvar(i,2) = sigp2(i)
478 uvar(i,3) = sigdt1(i)
479 uvar(i,4) = sigdt2(i)
480 END DO
481
482 IF (nindx > 0) THEN
483 DO j=1,nindx
484 i = indx(j)
485#include "lockon.inc"
486 WRITE(iout, 3000)ngl(i),ilay,ipt
487 WRITE(istdo,3100)ngl(i),ilay,ipt,time
488
489 IF (rflag(i) == 1) WRITE(iout ,4000)
490 IF (rflag(i) == 1) WRITE(istdo,4000)
491
492 IF (rflag(i) == -1) WRITE(iout, 4200)
493 IF (rflag(i) == -1) WRITE(istdo,4200)
494 if (ideb==1 .and. abs(rflag(i))==1) then
495 write(iout,'(A,5E16.9)') 'SIGP1,SIG_DTF1,SIGP_AKT,SIGP_MAX,SIGDT1=',
496 . sigp1(i),sig_dtf1(i),sigp_akt(i),sigp_max(i),sigdt1(i)
497 write(iout,'(A,5E16.9)') 'SIGP2,SIG_DTF2,SIGP_AKT,SIGP_MIN,SIGDT2=',
498 . sigp2(i),sig_dtf2(i),sigp_akt(i),sigp_min(i),sigdt2(i)
499 if (rflag(i)==-1) then
500 write(iout,'(A,E16.9)') 'advancement => crit reduction, DADV =',dadv
501 endif
502 endif
503
504 IF (rflag(i) == 3) WRITE(iout, 4400) xchar,ngl(i)
505 IF (rflag(i) == 3) WRITE(istdo,4500) xchar,ngl(i),time
506#include "lockoff.inc"
507 ENDDO
508 ENDIF
509
510 3000 FORMAT(1x,'FAILURE IN SHELL',i10,1x,'LAYER',i2,1x,'INT POINT',i2)
511 3100 FORMAT(1x,'FAILURE IN SHELL',i10,1x,'LAYER',i2,1x,'INT POINT',i2,
512 . 1x,'AT TIME ',1pe12.4)
513 4000 FORMAT(10x,'CRACK INITIALIZATION')
514 4200 FORMAT(10x,'CRACK ADVANCEMENT')
515 4400 FORMAT(1x,'DELETE ',a4,' PHANTOM ELEMENT, SHELL ID=',i10)
516 4500 FORMAT(1x,'DELETE ',a4,' PHANTOM ELEMENT, SHELL ID=',i10,/
517 . 1x,'AT TIME :',1pe12.4)
518
519 RETURN