43
44
45
46
47
48#include "implicit_f.inc"
49
50
51
52#include "units_c.inc"
53#include "comlock.inc"
54#include "com_xfem1.inc"
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 INTEGER NEL,NUPARAM,NUVAR,NFUNC,IPT,IPTT,NPTOT,IXFEM,IXEL,ILAY,NPTT
83 INTEGER ELCRKINI(NXLAYMAX,NEL),NOFF(NEL),IFUNC(NFUNC),NGL(NEL),FLD_IDX(NEL)
85 . time,uparam(nuparam),signxx(nel),signyy(nel),
86 . signxy(nel),signyz(nel),signzx(nel),ssp(nel),
87 . epsxx(nel),epsyy(nel),epsxy(nel),epsyz(nel),epszx(nel),
88 . tens(nel,5),dfmax(nel,lf_dammx),tdel(nel),npttf(nel),dam(nel)
89 INTEGER, INTENT(IN) :: NIPARAM, LF_DAMMX
90 INTEGER, DIMENSION(NIPARAM), INTENT(IN) :: IPARAM
91 my_real,
DIMENSION(NEL),
INTENT(IN) :: pla,depsxx,depsyy,depsxy
93
94
95
96 my_real uvar(nel,nuvar),off(nel),offl(nel)
97
98
99
100 INTEGER NPF(*)
101 my_real finter , finterfld ,tf(*)
102 EXTERNAL finter
103
104
105
106
107
108
109
110
111
112
113 INTEGER I,II,J,IENG,IAD,NINDX,NINDXP,ISHELL,LAYXFEM,LENF
114 INTEGER INDX(NEL),INDXP(NEL),RFLAG(NEL),RFLAGP(NEL)
116 . rani,r1,r2,dadv,s1,s2,ss,q,dydx,e12
117 my_real,
ALLOCATABLE,
DIMENSION(:) :: xf
119 . emaj(nel),emin(nel),
120 . em(nel),em_dcrit(nel),em_dadv(nel),demaj(nel),demin(nel),
121 . beta(nel),
alpha,fcut
122 CHARACTER (LEN=3) :: XCHAR
123
124 iad = (ipt-1)*nel
125 xchar = ' '
126 DO i=1,nel
127 rflag(i) = 0
128 rflagp(i)= 0
129 indxp(i) = 0
130 indx(i) = 0
131 ENDDO
132 nindx = 0
133 nindxp = 0
134
135
136
137
138
139
140 ishell = iparam(1)
141 ieng = iparam(3)
142
143 dadv = uparam(2)
144 rani = uparam(3)
145 fcut = uparam(5)
146 IF (uparam(6) > zero) THEN
148 ELSE
149 alpha = two*pi*fcut*dt1/(one + two*pi*fcut*dt1)
150 ENDIF
151
152 layxfem = ixfem
153 IF (ixfem == 1 .and. ishell == 1) ishell=2
154
155 DO i=1,nel
156 em_dcrit(i)= zero
157 em_dadv(i) = zero
158 END DO
159
160
161
162
163 DO i = 1,nel
164
165 e12= half*epsxy(i)
166 s1 = half*(epsxx(i) + epsyy(i))
167 s2 = half*(epsxx(i) - epsyy(i))
168 q = sqrt(s2**2 + e12**2)
169 emaj(i) = s1 + q
170 emin(i) = s1 - q
171 IF (emin(i) >= emaj(i)) THEN
172 ss = emin(i)
173 emin(i) = emaj(i)
174 emaj(i) = ss
175 ENDIF
176
177 e12 = half*depsxy(i)
178 s1 = half*(depsxx(i) + depsyy(i))
179 s2 = half*(depsxx(i) - depsyy(i))
180 q = sqrt(s2**2 + e12**2)
181 demaj(i) = s1 + q
182 demin(i) = s1 - q
183
184 demaj(i) =
alpha*demaj(i) + (one -
alpha)*uvar(i,2)
185 demin(i) =
alpha*demin(i) + (one -
alpha)*uvar(i,3)
186 beta(i) = demin(i)/sign(
max(abs(demaj(i)),em20),demaj(i))
187 uvar(i,2) = demaj(i)
188 uvar(i,3) = demin(i)
189 IF (ieng == 2) THEN
190 dfmax(i,4) = beta(i)
191 ENDIF
192 ENDDO
193
194
195
196
197
198 IF (ieng == 1) THEN
199 ii = npf(ifunc(1))
200 lenf = npf(ifunc(1)+ 1) - npf(ifunc(1))
201 ALLOCATE(xf(lenf))
202 DO i = 1,lenf
203 xf(i) = log(tf(ii + i-1) + one)
204 ENDDO
205
206 DO i = 1,nel
207 em(i) = finterfld(emin(i),lenf,xf)
208 dam(i) = emaj(i) / em(i)
209 dfmax(i,2) = dam(i)
210 dfmax(i,1) =
min(one, dam(i))
211 ENDDO
212
213 ELSE
214
215 IF (ieng == 0) THEN
216 DO i = 1,nel
217 em(i) = finter(ifunc(1),emin(i),npf,tf,dydx)
218 dam(i) = emaj(i) / em(i)
219 dfmax(i,2) = dam(i)
220 dfmax(i,1) =
min(one, dam(i))
221 ENDDO
222
223 ELSEIF (ieng == 2) THEN
224 DO i = 1,nel
225 em(i) = finter(ifunc(1),emin(i),npf,tf,dydx)
226 dam(i) =
max(pla(i) / em(i),dam(i))
227 dfmax(i,2) = dam(i)
228 dfmax(i,1) =
min(one, dam(i))
229 ENDDO
230 ENDIF
231 ENDIF
232
233
234
235
236 r1 = two*em02
237 r2 = rani/(rani+one)
238 IF (ieng < 2) THEN
239 DO i = 1,nel
240 IF (emaj(i) >= em(i)) THEN
241 fld_idx(i) = 6
242 ELSEIF (emaj(i) >= em(i) - em01) THEN
243 fld_idx(i) = 5
244 ELSEIF (emaj(i)**2 + emin(i)**2 < r1**2) THEN
245 fld_idx(i) = 1
246 ELSEIF (emaj(i) >= abs(emin(i))) THEN
247 fld_idx(i) = 4
248 ELSEIF (emaj(i) >= r2*abs(emin(i))) THEN
249 fld_idx(i) = 3
250 ELSE
251 fld_idx(i) = 2
252 ENDIF
253 dfmax(i,3) = fld_idx(i)
254 ENDDO
255 ELSE
256 DO i = 1,nel
257 IF (pla(i) >= em(i)) THEN
258 fld_idx(i) =
max(6,fld_idx(i))
259 ELSEIF (pla(i) >= em(i) - em01) THEN
260 fld_idx(i) =
max(5,fld_idx(i))
261 ELSEIF (pla(i)**2 + beta(i)**2 < r1**2) THEN
262 fld_idx(i) =
max(1,fld_idx(i))
263 ELSEIF (pla(i) >= abs(beta(i))) THEN
264 fld_idx(i) =
max(4,fld_idx(i))
265 ELSEIF (pla(i) >= r2*abs(beta(i))) THEN
266 fld_idx(i) =
max(3,fld_idx(i))
267 ELSE
268 fld_idx(i) =
max(2,fld_idx(i))
269 ENDIF
270 dfmax(i,3) = fld_idx(i)
271 ENDDO
272 ENDIF
273
274 DO i = 1,nel
275 tens(i,1) = signxx(i)
276 tens(i,2) = signyy(i)
277 tens(i,3) = signxy(i)
278 tens(i,4) = signyz(i)
279 tens(i,5) = signzx(i)
280 em_dcrit(i)= em(i)
281 IF (nfunc > 1 .and. ifunc(2) > 0) THEN
282 em_dadv(i) = dadv*finter(ifunc(2),emin(i),npf,tf,dydx)
283 ELSE
284 em_dadv(i) = dadv*em_dcrit(i)
285 ENDIF
286 END DO
287
288 IF (ixel > 0) THEN
289 IF (ixel == 1) THEN
290 xchar = '1st'
291 ELSEIF (ixel == 2) THEN
292 xchar = '2nd'
293 ELSEIF (IXEL == 3) THEN
294 XCHAR = '3rd'
295 ENDIF
296 ELSE
297 XCHAR = 'standard'
298 ENDIF
299
300 SELECT CASE (LAYXFEM)
301
302 CASE (1) ! multilayer XFEM
303
304 DO I = 1,NEL
305 IF (IENG == 2) EMAJ(I) = PLA(I)
306 IF (OFF(I) == ONE) THEN
307 IF (UVAR(I,1) == ZERO) THEN
308 IF (IXEL == 0) THEN
309.and. IF (ELCRKINI(ILAY,I)==0 EMAJ(I)>=EM_DCRIT(I)) THEN
310 NINDXP = NINDXP+1
311 INDXP(NINDXP) = I
312 UVAR(I,1) = ONE
313 OFFL(I) = ZERO
314 NOFF(I) = NOFF(I) + 1
315 NPTTF(I) = NPTTF(I) + ONE
316 RFLAGP(I) = 1
317 IF (INT(NPTTF(I)) == NPTT) THEN
318 NINDX = NINDX+1
319 INDX(NINDX) = I
320 ELCRKINI(ILAY,I) = -1 ! one layer failed (by initiation)
321 RFLAG(I) = 1
322 ENDIF
323 IF (NOFF(I) == NPTOT) THEN
324 OFF(I) = FOUR_OVER_5
325 TDEL(I)= TIME
326 ENDIF
327.and. ELSEIF (ELCRKINI(ILAY,I)==2 EMAJ(I)>=EM_DADV(I)) THEN
328 NINDXP = NINDXP + 1
329 INDXP(NINDXP) = I
330 UVAR(I,1) = ONE
331 OFFL(I) = ZERO
332 NOFF(I) = NOFF(I) + 1
333 NPTTF(I) = NPTTF(I)+ ONE
334 RFLAGP(I) = 1
335 IF (INT(NPTTF(I)) == NPTT) THEN
336 NINDX = NINDX+1
337 INDX(NINDX) = I
338 ELCRKINI(ILAY,I) = 1 ! one layer failed (by advancing)
339 RFLAG(I) = -1
340 ENDIF
341 IF (NOFF(I) == NPTOT) THEN
342 OFF(I) = FOUR_OVER_5
343 TDEL(I)= TIME
344 ENDIF
345 ENDIF
346 ELSEIF (EMAJ(I) >= EM_DCRIT(I)) THEN ! IXEL > 0
347 NINDXP = NINDXP + 1
348 INDXP(NINDXP) = I
349 UVAR(I,1) = ONE
350 OFFL(I) = ZERO
351 NPTTF(I) = NPTTF(I) + ONE
352 RFLAGP(I) = 1
353 IF (INT(NPTTF(I)) == NPTT) THEN
354 NINDX = NINDX+1
355 INDX(NINDX) = I
356 OFF(I) = FOUR_OVER_5
357 TDEL(I) = TIME
358 RFLAG(I) = 3
359 ENDIF
360 ENDIF ! IXEL == 0
361 ELSEIF (UVAR(I,1) == ONE) THEN
362 SIGNXX(I) = ZERO
363 SIGNYY(I) = ZERO
364 SIGNXY(I) = ZERO
365 SIGNYZ(I) = ZERO
366 SIGNZX(I) = ZERO
367 ENDIF ! UVAR
368 ENDIF ! IF (OFF(I) == ONE)
369 ENDDO ! DO I=1,NEL
370 IF (NINDXP > 0) THEN
371 DO J=1,NINDXP
372 I = INDXP(J)
373 SIGNXX(I) = ZERO
374 SIGNYY(I) = ZERO
375 SIGNXY(I) = ZERO
376 SIGNYZ(I) = ZERO
377 SIGNZX(I) = ZERO
378#include "lockon.inc"
379 IF (RFLAGP(I) == 1) WRITE(IOUT, 3800)NGL(I),ILAY,IPTT
380 IF (RFLAGP(I) == 1) WRITE(ISTDO,3900)NGL(I),ILAY,IPTT,TIME
381#include "lockoff.inc"
382 ENDDO
383 ENDIF ! NINDXP > 0
384 IF (NINDX > 0) THEN
385 DO J=1,NINDX
386 I = INDX(J)
387#include "lockon.inc"
388
389 IF (RFLAG(I) == 1) WRITE(IOUT ,3000) NGL(I),ILAY
390 IF (RFLAG(I) == 1) WRITE(ISTDO,3100) NGL(I),ILAY,TIME
391
392 IF (RFLAG(I) == -1) WRITE(IOUT ,3200) NGL(I),ILAY
393 IF (RFLAG(I) == -1) WRITE(ISTDO,3300) NGL(I),ILAY,TIME
394
395 IF (RFLAG(I) == 3) WRITE(IOUT, 3400) XCHAR,NGL(I),ILAY
396 IF (RFLAG(I) == 3) WRITE(ISTDO,3500) XCHAR,NGL(I),ILAY,TIME
397#include "lockoff.inc"
398 ENDDO
399 ENDIF ! NINDX > 0
400
401 CASE (2) ! monolayer XFEM
402
403 IF (ISHELL == 1) THEN
404
405 IF (LAYXFEM > 0) THEN
406 DO I = 1,NEL
407 IF (IENG == 2) EMAJ(I) = PLA(I)
408 IF (OFF(I) == ONE) THEN
409 IF (IXEL == 0) THEN ! not cut yet
410.and. IF (ELCRKINI(ILAY,I) == 0
411 . EMAJ(I) >= EM_DCRIT(I)) THEN
412 ELCRKINI(ILAY,I) = -1 ! ready to start
413 OFF(I) = FOUR_OVER_5
414 NINDX=NINDX+1
415 INDX(NINDX)=I
416 RFLAG(I) = 1
417 TDEL(I)= TIME
418.and. ELSEIF (ELCRKINI(ILAY,I) == 2
419 . EMAJ(I) >= EM_DADV(I)) THEN
420 ELCRKINI(ILAY,I) = 1 ! ready to advance
421 OFF(I) = FOUR_OVER_5
422 NINDX=NINDX+1
423 INDX(NINDX)=I
424 RFLAG(I) = -1
425 TDEL(I)= TIME
426 ENDIF
427 ELSE IF (EMAJ(I) >= EM_DCRIT(I)) THEN! IXEL > 0
428 OFF(I) = FOUR_OVER_5
429 NINDX=NINDX+1
430 INDX(NINDX)=I
431 RFLAG(I) = 3
432 ENDIF ! IXEL
433 ENDIF
434 ENDDO
435 ENDIF ! LAYXFEM
436
437 IF (NINDX > 0) THEN
438 DO J=1,NINDX
439 I=INDX(J)
440#include "lockon.inc"
441 WRITE(IOUT, 4800)NGL(I),IPTT
442 WRITE(ISTDO,4900)NGL(I),IPTT,TIME
443
444 IF (RFLAG(I) == 1) WRITE(IOUT ,4000) NGL(I)
445 IF (RFLAG(I) == 1) WRITE(ISTDO,4100) NGL(I),TIME
446
447 IF (RFLAG(I) == -1) WRITE(IOUT, 4200) NGL(I)
448 IF (RFLAG(I) == -1) WRITE(ISTDO,4300) NGL(I),TIME
449
450 IF (RFLAG(I) == 3) WRITE(IOUT, 4400) XCHAR,NGL(I)
451 IF (RFLAG(I) == 3) WRITE(ISTDO,4500) XCHAR,NGL(I),TIME
452#include "lockoff.inc"
453 ENDDO
454 ENDIF
455
456 ELSEIF (ISHELL == 2)THEN
457
458 DO I = 1,NEL
459 IF (IENG == 2) EMAJ(I) = PLA(I)
460 IF (OFF(I) == ONE) THEN
461 IF (UVAR(I,1) == ZERO) THEN
462 IF (IXEL == 0) THEN ! testing standard element
463.and. IF (ELCRKINI(ILAY,I) == 0 EMAJ(I) >= EM_DCRIT(I)) THEN
464 UVAR(I,1) = ONE
465 NINDX=NINDX+1
466 INDX(NINDX)=I
467 NINDXP = NINDXP + 1
468 INDXP(NINDXP) = I
469 RFLAGP(I) = 1
470 NOFF(I) = NOFF(I) + 1
471 IF (NOFF(I) == NPTOT) THEN
472 ELCRKINI(ILAY,I) = -1 ! one layer failed (by initiation)
473 OFF(I) = FOUR_OVER_5
474 RFLAG(I) = 1
475 TDEL(I)= TIME
476 ENDIF
477.and. ELSEIF (ELCRKINI(ILAY,I) == 2 EMAJ(I) >= EM_DADV(I)) THEN
478 UVAR(I,1) = ONE
479 NINDX=NINDX+1
480 INDX(NINDX)=I
481 NINDXP = NINDXP + 1
482 INDXP(NINDXP) = I
483 RFLAGP(I) = 1
484 NOFF(I) = NOFF(I) + 1
485 IF (NOFF(I) == NPTOT) THEN
486 OFF(I) = FOUR_OVER_5
487 ELCRKINI(ILAY,I) = 1 ! one layer failed (by advancing)
488 RFLAG(I) = -1
489 TDEL(I)= TIME
490 ENDIF
491 ENDIF
492 ELSEIF (EMAJ(I) >= EM_DCRIT(I)) THEN ! IXEL > 0
493 UVAR(I,1) = ONE
494 NINDX = NINDX+1
495 INDX(NINDX) = I
496 NINDXP = NINDXP + 1
497 INDXP(NINDXP) = I
498 RFLAGP(I) = 1
499 NOFF(I) = NOFF(I) + 1
500 IF (NOFF(I) == NPTOT) THEN
501 OFF(I) = FOUR_OVER_5
502 RFLAG(I) = 3
503 ENDIF
504 ENDIF ! IXEL
505 ELSEIF (UVAR(I,1) == ONE) THEN
506 SIGNXX(I) = ZERO
507 SIGNYY(I) = ZERO
508 SIGNXY(I) = ZERO
509 SIGNYZ(I) = ZERO
510 SIGNZX(I) = ZERO
511 ENDIF ! UVAR
512 ENDIF
513 ENDDO
514
515 IF (NINDXP > 0) THEN
516 DO J=1,NINDXP
517 I = INDXP(J)
518 SIGNXX(I) = ZERO
519 SIGNYY(I) = ZERO
520 SIGNXY(I) = ZERO
521 SIGNYZ(I) = ZERO
522 SIGNZX(I) = ZERO
523#include "lockon.inc"
524 IF (RFLAGP(I) == 1) WRITE(IOUT, 4800)NGL(I),IPTT
525 IF (RFLAGP(I) == 1) WRITE(ISTDO,4900)NGL(I),IPTT,TIME
526#include "lockoff.inc"
527 ENDDO
528 ENDIF ! NINDXP > 0
529 IF (NINDX > 0) THEN
530 DO J=1,NINDX
531 I = INDX(J)
532#include "lockon.inc"
533
534 IF (RFLAG(I) == 1) WRITE(IOUT ,4000) NGL(I)
535 IF (RFLAG(I) == 1) WRITE(ISTDO,4100) NGL(I),TIME
536
537 IF (RFLAG(I) == -1) WRITE(IOUT, 4200) NGL(I)
538 IF (RFLAG(I) == -1) WRITE(ISTDO,4300) NGL(I),TIME
539
540 IF (RFLAG(I) == 3) WRITE(IOUT, 4400) XCHAR,NGL(I)
541 IF (RFLAG(I) == 3) WRITE(ISTDO,4500) XCHAR,NGL(I),TIME
542#include "lockoff.inc"
543 ENDDO
544 ENDIF ! NINDX > 0
545 ENDIF ! ISHELL
546
547 END SELECT ! LAYXFEM
548
549 IF (IENG == 1) DEALLOCATE(XF)
550
551
552 3000 FORMAT(1X,'crack initialization in shell element',I10,1X,'layer',I3)
553 3100 FORMAT(1X,'crack initialization in shell element',I10,1X,'layer',I3,/
554 . 1X,'at time :',1PE12.4)
555 3200 FORMAT(1X,'crack advancement in shell element',I10,' layer',I3)
556 3300 FORMAT(1X,'crack advancement in shell element',I10,' layer',I3/
557 . 1X,'at time :',1PE12.4)
558 3400 FORMAT(1X,'delete
',A4,' phantom element, shell
id=
',I10,' layer
',I3)
559 3500 FORMAT(1X,'delete
',A4,' phantom element, shell
id=
',I10,' layer
',I3,/
560 . 1X,'at time :',1PE12.4)
561 3800 FORMAT(1X,'fld failure in shell',I10,1X,'layer',I3,1X,'int point',I2)
562 3900 FORMAT(1X,'fld failure in shell',I10,1X,'layer',I3,1X,'int point',I2,/
563 . 1X,'at time :',1PE12.4)
564
565 4000 FORMAT(1X,'crack initialization in shell element',I10)
566 4100 FORMAT(1X,'crack initialization in shell element',I10,/
567 . 1X,'at time :',1PE12.4)
568 4200 FORMAT(1X,'crack advancement in shell element',I10)
569 4300 FORMAT(1X,'crack advancement in shell element',I10,/
570 . 1X,'at time :',1PE12.4)
571 4400 FORMAT(1X,'delete
',A4,' phantom element, shell
id=
',I10)
572 4500 FORMAT(1X,'delete
',A4,' phantom element, shell
id=
',I10,/
573 . 1X,'at time :',1PE12.4)
574 4800 FORMAT(1X,'fld failure in shell',I10,1X,'int point',I2)
575 4900 FORMAT(1X,'fld failure in shell',I10,1X,'int point',I2,1X,'at time :',1PE12.4)
576
577 RETURN