34 . NEL ,NFT ,ILAY ,NLAY ,IXTG ,
35 . ELCUTC ,ELCRKINI ,IEL_CRKTG,INOD_CRK ,IAD_CRKTG,
36 . NODENR ,DIR1 ,DIR2 ,NODEDGE ,CRKNODIAD,
37 . KNOD2ELC ,CRKEDGE ,XEDGE3N ,NGL ,AREA ,
38 . XL2 ,XL3 ,YL2 ,YL3 )
48#include "implicit_f.inc"
53#include "com_xfem1.inc"
58INTEGER IXTG(NIXTG,*),NGL(NEL),IEL_CRKTG(*),
59 . INOD_CRK(*),NODENR(*),IAD_CRKTG(3,*),ELCRKINI(NLAY,*),
60 . ELCUTC(2,*),NODEDGE(2,*),CRKNODIAD(*),KNOD2ELC(
61DIMENSION(NEL) :: ,XL2,YL2,XL3,YL3
62 my_real dir1(nlay,nel),dir2(nlay,nel)
63 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
67 INTEGER I,J,K,,p1,,,ILAY2,NENR1,NENR2,
68 . ienr1,ienr2,newcrk,ied
69 . nod1,nod2,ifi1,ifi2,ie1,ie2,ie10,ie20,elcrk,elcrktg
70 . iedge,icut,sigbeta,itri,nm,np
71 INTEGER (NEL),ELFISS(NEL),EDGEL(3,NEL),ELTIP(),
72 . enr0(3,nel),ienr0(3,nel),tip(nel),iadc(3),
73 . dd(3),d(6),dx(6),isign(3),n(3),ienr(3),nn(3),inv(2)
75 my_real,
DIMENSION(NEL) :: xl1,yl1
76 my_real,
DIMENSION(2,NEL) :: xin,yin
77 my_real,
DIMENSION(3,NEL) :: xxl,yyl,len,fit
78 my_real beta0(3,nel),xn(3),yn(3),zn(3),xmi(2),ymi(2)
79 my_real beta,xint,yint,fi,xxx,yyy,zzz,bmin,bmax,
80 . x10,y10,z10,x20,y20,z20,m12,mm,cross1,cross12,
81 . xint0,yint0,dir11,dir22,x1,y1,x2,y2,x3,y3,area1,area2,area3
86 parameter(bmin = 0.01, bmax = 0.99)
91 IF (elcrkini(ilay,i) == 1)
THEN
96 IF (newcrk == 0)
RETURN
98 pp1 = nxel*(ilay-1) + 1
128 elcrktg = iel_crktg(i+nft)
133 iedge = xedge3n(k,elcrktg)
134 icut = crkedge(ilay)%ICUTEDGE(iedge)
135 nod1 = nodedge(1,iedge)
136 nod2 = nodedge(2,iedge)
137 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
140 ELSE IF (nod2 == ixtg(k+1,i) .and. nod1 == ixtg(dd(k)+1,i))
THEN
148 icrk = crkedge(ilay)%EDGEICRK(iedge)
149 ienr1 = crkedge(ilay)%EDGEENR(1,iedge)
150 ienr2 = crkedge(ilay)%EDGEENR(2,iedge)
151 ifi1 = crkedge(ilay)%EDGEIFI(1,iedge)
152 ifi2 = crkedge(ilay)%EDGEIFI(2,iedge)
162 WRITE(iout,*) 'error in advancing crack --- check crack tip
'
167 IEDGE = XEDGE3N(IED,ELCRKTG)
168 TIP(I) = CRKEDGE(ILAY)%EDGETIP(1,IEDGE)
170 END DO ! DO IR=1,NEWCRK
186 LEN(1,I) = (XL2(I)-XL1(I))*(XL2(I)-XL1(I))
187 . + (YL2(I)-YL1(I))*(YL2(I)-YL1(I))
188 LEN(2,I) = (XL3(I)-XL2(I))*(XL3(I)-XL2(I))
189 . + (YL3(I)-YL2(I))*(YL3(I)-YL2(I))
190 LEN(3,I) = (XL1(I)-XL3(I))*(XL1(I)-XL3(I))
191 . + (YL1(I)-YL3(I))*(YL1(I)-YL3(I))
198 ELCRKTG = IEL_CRKTG(I+NFT)
199 ELCRK = ELCRKTG + ECRKXFEC
203 IF(EDGEL(K,I) > 0)THEN
210 IEDGE = XEDGE3N(K,ELCRKTG)
211.and.
IF (IEDGE > 0 EDGEL(K,I) == 1) THEN
212 ICUT = CRKEDGE(ILAY)%ICUTEDGE(IEDGE)
214 BETA = CRKEDGE(ILAY)%RATIO(IEDGE)
216.or.
IF (BETA > ONE BETA == ZERO) THEN
217 WRITE(*,*) 'error negativ beta, no intersection
221 nod1 = nodedge(1,iedge)
222 nod2 = nodedge(2,iedge)
223 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
226 ELSEIF (nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
235 xint = x10+beta*(x20-x10)
236 yint = y10+beta*(y20-y10)
243 IF (ied1 == 0 .or. ied2 == 0)
GOTO 130
247 dir11 = -dir2(ilay,i)
250 IF (dir11 == zero)
THEN
254 elcrktg = iel_crktg(i+nft)
255 elcrk = elcrktg + ecrkxfec
256 iedge = xedge3n(k,elcrktg)
257 nod1 = nodedge(1,iedge)
258 nod2 = nodedge(2,iedge)
259 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
262 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
267 IF (edgel(k,i) == ied1)
GOTO 140
268 IF (xxl(p1,i) == xxl(p2,i))
GOTO 140
269 m12 = xxl(p2,i)-xxl(p1,i)
270 m12 = (yyl(p2,i)-yyl(p1,i))/m12
272 yint = yyl(p1,i)+m12*(xint-xxl(p1,i))
273 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
274 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
275 IF (cross12 > zero)
GOTO 140
277 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
278 beta = sqrt(cross1 / len(k,i))
279 beta =
max(beta, bmin)
280 beta =
min(beta, bmax)
288 ELSEIF(dir22 == zero)
THEN
292 elcrktg = iel_crktg(i
293 elcrk = elcrktg + ecrkxfec
294 iedge = xedge3n(k,elcrktg)
295 nod1 = nodedge(1,iedge)
296 nod2 = nodedge(2,iedge)
297 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
300 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
305 IF (edgel(k,i) == ied1)
GOTO 150
306 IF (yyl(p1,i) == yyl(p2,i))
GOTO 150
307 m12 = yyl(p2,i)-yyl(p1,i)
308 m12 = (xxl(p2,i)-xxl(p1,i))/m12
310 xint = xxl(p1,i)+m12*(yint-yyl(p1,i))
311 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
312 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
313 IF (cross12 > zero)
GOTO 150
315 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
316 beta = sqrt(cross1 / len(k,i))
317 beta =
max(beta, bmin)
318 beta =
min(beta, bmax)
326 ELSEIF(dir11 /= zero .AND. dir22 /= zero)
THEN
330 elcrktg = iel_crktg(i+nft)
331 elcrk = elcrktg + ecrkxfec
332 iedge = xedge3n(k,elcrktg)
333 nod1 = nodedge(1,iedge)
334 nod2 = nodedge(2,iedge)
335 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
338 ELSE IF (nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
343 IF (edgel(k,i) == ied1)
GOTO 160
344 IF (xxl(p1,i) == xxl(p2,i))
THEN
347 yint = yint0+mm*(xint-xint0)
348 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
349 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
350 IF (cross12 > zero)
GOTO 160
352 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
353 beta = sqrt(cross1 / len(k,i))
354 beta =
max(beta, bmin)
355 beta =
min(beta, bmax)
364 m12 = xxl(p2,i)-xxl(p1,i)
365 m12 = (yyl(p2,i)-yyl(p1,i))/m12
366 IF (mm == m12)
GOTO 160
367 xint = (yint0-yyl(p1,i)+m12*xxl(p1,i)-mm*xint0)/(m12-mm)
368 yint = yint0+mm*(xint-xint0)
369 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
370 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
371 IF (cross12 > zero)
GOTO 160
373 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
374 beta = sqrt(cross1 / len(k,i))
375 beta =
max(beta, bmin)
376 beta =
min(beta, bmax)
395 IF (edgel(k,i)==1 .or. edgel(k,i)==2) fac=fac+1
398 WRITE(iout,*)
'ERROR IN ADVANCING CRACK.NO CUT EDGES'
405 elcrktg = iel_crktg(i+nft)
409 crkedge(ilay)%IEDGETG(k,elcrktg) = ied
433 xmi(ied) = half*(xn(p1)+xn(p2))
434 ymi(ied) = half*(yn(p1)+yn(p2))
439 CALL lsint4(xmi(1),ymi(1),xmi(2),ymi(2),xn(k),yn(k),fi )
440 IF (fit(k,i) == zero) fit(k,i)=fi
446 elcrktg = iel_crktg(i+nft)
451 iedge = xedge3n(k,elcrktg)
453 icut = crkedge(ilay)%ICUTEDGE(iedge)
455 crkedge(ilay)%ICUTEDGE(iedge) = 3
457 crkedge(ilay)%ICUTEDGE(iedge) = 2
458 crkedge(ilay)%RATIO(iedge) = beta0(k,i)
468 elcrktg = iel_crktg(i+nft)
469 elcrk = elcrktg + ecrkxfec
471 iadc(1) = iad_crktg(1,elcrktg)
472 iadc(2) = iad_crktg(2,elcrktg)
473 iadc(3) = iad_crktg(3,elcrktg)
479 nn(1) = inod_crk(n(1))
480 nn(2) = inod_crk(n(2))
481 nn(3) = inod_crk(n(3))
486 numelcrk = numelcrk + 1
488 isign(1) = int(sign(one,fit(1,i)))
489 isign(2) = int(sign(one,fit(2,i)))
490 isign(3) = int(sign(one,fit(3,i)))
492 IF (fit(1,i) == zero) isign(1) = 0
493 IF (fit(2,i) == zero) isign(2) = 0
494 IF (fit(3,i) == zero) isign(3) = 0
500 IF (isign(k) > 0)
THEN
503 ELSEIF (isign(k) < 0)
THEN
510 ELSEIF (itri == 2)
THEN
522 IF(ienr0(k,i) /= 0)
THEN
525 ienr(k) = crknodiad(iadc(k)) + knod2elc(nn(k))*(ilay-1)
533 iedge = xedge3n(k,elcrktg)
534 nod1 = nodedge(1,iedge)
535 nod2 = nodedge(2,iedge)
536 ie10 = crkedge(ilay)%EDGEENR(1,iedge)
537 ie20 = crkedge(ilay)%EDGEENR(2,iedge)
538 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
544 ELSE IF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
551 crkedge(ilay)%EDGEENR(1,iedge) =
max(ie1,ie10)
552 crkedge(ilay)%EDGEENR(2,iedge) =
max(ie2,ie20)
553 IF (crkedge(ilay)%EDGEICRK(iedge) == 0)
554 . crkedge(ilay)%EDGEICRK(iedge) = icrk
558 crkedge(ilay)%LAYCUT(elcrk) = 1
563 iedge = xedge3n(k,elcrktg)
565 crkedge(ilay)%EDGETIP(1,iedge) = tip(i)
566 crkedge(ilay)%EDGETIP(2,iedge) =
567 . crkedge(ilay)%EDGETIP(2,iedge) + 1
578 crklvset(pp1)%ENR0(1,iadc(1)) = -ienr(1)
579 crklvset(pp1)%ENR0(1,iadc(2)) = -ienr(2)
580 crklvset(pp1)%ENR0(1,iadc(3)) = -ienr(3)
582 IF (isign(1) > 0)
crklvset(pp1)%ENR0(1,iadc(1)) = 0
583 IF (isign(2) > 0)
crklvset(pp1)%ENR0(1,iadc(2)) = 0
584 IF (isign(3) > 0)
crklvset(pp1)%ENR0(1,iadc(3)) = 0
588 crklvset(pp2)%ENR0(1,iadc(1)) = -ienr(1)
589 crklvset(pp2)%ENR0(1,iadc(2)) = -ienr(2)
590 crklvset(pp2)%ENR0(1,iadc(3)) = -ienr(3)
592 IF (isign(1) < 0)
crklvset(pp2)%ENR0(1,iadc(1)) = 0
593 IF (isign(2) < 0)
crklvset(pp2)%ENR0(1,iadc(2)) = 0
594 IF (isign(3) < 0)
crklvset(pp2)%ENR0(1,iadc(3)) = 0
599 ie2 = xedge3n(nx3,elcrktg)
600 IF (crkedge(ilay)%ICUTEDGE(ie2) > 1)
THEN
610 crklvset(pp2)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
615 ied = crkedge(ilay)%IEDGETG(nx1,elcrktg)
618 ied = crkedge(ilay)%IEDGETG(nx3,elcrktg)
621 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
622 area1 = area1 /
area(i)
627 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
628 area2 = area2 /
area(i)
629 area3 = one - area1 - area2
635 ELSEIF (itri > 0)
THEN
637 ie1 = xedge3n(nx1,elcrktg)
638 IF (crkedge(ilay)%ICUTEDGE(ie1) > 1)
THEN
645 crklvset(pp1)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
648 ied1= crkedge(ilay)%IEDGETG(nx1,elcrktg)
649 ied2= crkedge(ilay)%IEDGETG(nx3,elcrktg)
656 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
657 area1 = area1 /
area(i)
664 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
665 area2 = area2 /
area(i)
666 area3 = one - area1 - area2
676 IF (area3 < zero .or. area1 > one .or. area2 > one .or. area3 > one
THEN
677 print*,
'ERROR : XFEM PHANTOM ELEMENT AREA: ELCRK=',elcrk