35 . NEL ,NFT ,ILAY ,NLAY ,IXTG ,
36 . ELCUTC ,ELCRKINI ,IEL_CRKTG,INOD_CRK ,IAD_CRKTG,
37 . NODENR ,DIR1 ,DIR2 ,NODEDGE ,CRKNODIAD,
38 . KNOD2ELC ,CRKEDGE ,XEDGE3N ,NGL ,AREA ,
39 . XL2 ,XL3 ,YL2 ,YL3 )
46 use element_mod ,
only : nixtg
50#include "implicit_f.inc"
55#include "com_xfem1.inc"
59 INTEGER NEL,NFT,ILAY,NLAY
60 INTEGER IXTG(NIXTG,*),NGL(NEL),IEL_CRKTG(*),
61 . INOD_CRK(*),NODENR(*),IAD_CRKTG(3,*),ELCRKINI(NLAY,*),
62 . ELCUTC(2,*),NODEDGE(2,*),CRKNODIAD(*),KNOD2ELC(*),XEDGE3N(3,*)
63 my_real,
DIMENSION(NEL) :: AREA,XL2,YL2,XL3,YL3
64 my_real dir1(nlay,nel),dir2(nlay,nel)
65 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
70 . ienr1,ienr2,newcrk,ied,ied1,ied2,fac,ok,icrk,pp1,pp2,pp3,
71 . nod1,nod2,ifi1,ifi2,ie1,ie2,ie10,ie20,elcrk,elcrktg,
72 . iedge,icut,sigbeta,itri,nm,np,nx1,nx2,nx3,iad1,iad2,iad3
73 INTEGER JCT(NEL),ELFISS(NEL),EDGEL(3,NEL),
74 . ienr0(3,nel),tip(nel),iadc(3),
75 . dd(3),d(6),dx(6),isign(3),n(3),ienr(3),nn(3),inv(2)
77 my_real,
DIMENSION(NEL) :: xl1,yl1
78 my_real,
DIMENSION(2,NEL) :: xin,yin
79 my_real,
DIMENSION(3,NEL) :: xxl,yyl,len,fit
80 my_real beta0(3,nel),xn(3),yn(3),xmi(2),ymi(2)
81 my_real beta,xint,yint,fi,bmin,bmax,
82 . x10,y10,x20,y20,m12,mm,cross1,cross12,
83 . xint0,yint0,dir11,dir22,x1,y1,x2,y2,x3,y3,area1,area2,area3
88 parameter(bmin = 0.01, bmax = 0.99)
93 IF (elcrkini(ilay,i) == 1)
THEN
98 IF (newcrk == 0)
RETURN
100 pp1 = nxel*(ilay-1) + 1
130 elcrktg = iel_crktg(i+nft)
135 iedge = xedge3n(k,elcrktg)
136 icut = crkedge(ilay)%ICUTEDGE(iedge)
137 nod1 = nodedge(1,iedge)
138 nod2 = nodedge(2,iedge)
139 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
142 ELSE IF (nod2 == ixtg(k+1,i) .and. nod1 == ixtg(dd(k)+1,i))
THEN
150 icrk = crkedge(ilay)%EDGEICRK(iedge)
151 ienr1 = crkedge(ilay)%EDGEENR(1,iedge)
152 ienr2 = crkedge(ilay)%EDGEENR(2,iedge)
153 ifi1 = crkedge(ilay)%EDGEIFI(1,iedge)
154 ifi2 = crkedge(ilay)%EDGEIFI(2,iedge)
164 WRITE(iout,*)
'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
169 iedge = xedge3n(ied,elcrktg)
170 tip(i) = crkedge(ilay)%EDGETIP(1,iedge)
188 len(1,i) = (xl2(i)-xl1(i))*(xl2(i)-xl1(i))
189 . + (yl2(i)-yl1(i))*(yl2(i)-yl1(i))
190 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))
191 . + (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
192 len(3,i) = (xl1(i)-xl3(i))*(xl1(i)-xl3(i))
193 . + (yl1(i)-yl3(i))*(yl1(i)-yl3(i))
200 elcrktg = iel_crktg(i+nft)
201 elcrk = elcrktg + ecrkxfec
205 IF(edgel(k,i) > 0)
THEN
212 iedge = xedge3n(k,elcrktg)
213 IF (iedge > 0 .and. edgel(k,i) == 1)
THEN
214 icut = crkedge(ilay)%ICUTEDGE(iedge)
216 beta = crkedge(ilay)%RATIO(iedge)
218 IF (beta > one .or. beta == zero)
THEN
219 WRITE(*,*)
'ERROR NEGATIV BETA, NO INTERSECTION!'
223 nod1 = nodedge(1,iedge)
224 nod2 = nodedge(2,iedge)
225 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
228 ELSEIF (nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
237 xint = x10+beta*(x20-x10)
238 yint = y10+beta*(y20-y10)
245 IF (ied1 == 0 .or. ied2 == 0)
GOTO 130
249 dir11 = -dir2(ilay,i)
252 IF (dir11 == zero)
THEN
256 elcrktg = iel_crktg(i+nft)
257 elcrk = elcrktg + ecrkxfec
258 iedge = xedge3n(k,elcrktg)
259 nod1 = nodedge(1,iedge)
260 nod2 = nodedge(2,iedge)
261 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
264 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
269 IF (edgel(k,i) == ied1)
GOTO 140
270 IF (xxl(p1,i) == xxl(p2,i))
GOTO 140
271 m12 = xxl(p2,i)-xxl(p1,i)
272 m12 = (yyl(p2,i)-yyl(p1,i))/m12
274 yint = yyl(p1,i)+m12*(xint-xxl(p1,i))
275 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
276 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
277 IF (cross12 > zero)
GOTO 140
279 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
280 beta = sqrt(cross1 / len(k,i))
281 beta =
max(beta, bmin)
282 beta =
min(beta, bmax)
290 ELSEIF(dir22 == zero)
THEN
294 elcrktg = iel_crktg(i+nft)
295 elcrk = elcrktg + ecrkxfec
296 iedge = xedge3n(k,elcrktg)
297 nod1 = nodedge(1,iedge)
298 nod2 = nodedge(2,iedge)
299 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
302 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
307 IF (edgel(k,i) == ied1)
GOTO 150
308 IF (yyl(p1,i) == yyl(p2,i))
GOTO 150
309 m12 = yyl(p2,i)-yyl(p1,i)
310 m12 = (xxl(p2,i)-xxl(p1,i))/m12
312 xint = xxl(p1,i)+m12*(yint-yyl(p1,i))
313 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
314 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
315 IF (cross12 > zero)
GOTO 150
317 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
318 beta = sqrt(cross1 / len(k,i))
319 beta =
max(beta, bmin)
320 beta =
min(beta, bmax)
328 ELSEIF(dir11 /= zero .AND. dir22 /= zero)
THEN
332 elcrktg = iel_crktg(i+nft)
333 elcrk = elcrktg + ecrkxfec
334 iedge = xedge3n(k,elcrktg)
335 nod1 = nodedge(1,iedge)
336 nod2 = nodedge(2,iedge)
337 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
340 ELSE IF (nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
345 IF (edgel(k,i) == ied1)
GOTO 160
346 IF (xxl(p1,i) == xxl(p2,i))
THEN
349 yint = yint0+mm*(xint-xint0)
350 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
351 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
352 IF (cross12 > zero)
GOTO 160
354 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
355 beta = sqrt(cross1 / len(k,i))
356 beta =
max(beta, bmin)
357 beta =
min(beta, bmax)
366 m12 = xxl(p2,i)-xxl(p1,i)
367 m12 = (yyl(p2,i)-yyl(p1,i))/m12
368 IF (mm == m12)
GOTO 160
369 xint = (yint0-yyl(p1,i)+m12*xxl(p1,i)-mm*xint0)/(m12-mm)
370 yint = yint0+mm*(xint-xint0)
371 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
372 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
373 IF (cross12 > zero)
GOTO 160
375 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
376 beta = sqrt(cross1 / len(k,i))
377 beta =
max(beta, bmin)
378 beta =
min(beta, bmax)
397 IF (edgel(k,i)==1 .or. edgel(k,i)==2) fac=fac+1
400 WRITE(iout,*)
'ERROR IN ADVANCING CRACK.NO CUT EDGES'
407 elcrktg = iel_crktg(i+nft)
411 crkedge(ilay)%IEDGETG(k,elcrktg) = ied
435 xmi(ied) = half*(xn(p1)+xn(p2))
436 ymi(ied) = half*(yn(p1)+yn(p2))
441 CALL lsint4(xmi(1),ymi(1),xmi(2),ymi(2),xn(k),yn(k),fi )
442 IF (fit(k,i) == zero) fit(k,i)=fi
448 elcrktg = iel_crktg(i+nft)
453 iedge = xedge3n(k,elcrktg)
455 icut = crkedge(ilay)%ICUTEDGE(iedge)
457 crkedge(ilay)%ICUTEDGE(iedge) = 3
459 crkedge(ilay)%ICUTEDGE(iedge) = 2
460 crkedge(ilay)%RATIO(iedge) = beta0(k,i
470 elcrktg = iel_crktg(i+nft)
471 elcrk = elcrktg + ecrkxfec
473 iadc(1) = iad_crktg(1,elcrktg)
474 iadc(2) = iad_crktg(2,elcrktg)
475 iadc(3) = iad_crktg(3,elcrktg)
481 nn(1) = inod_crk(n(1))
482 nn(2) = inod_crk(n(2))
483 nn(3) = inod_crk(n(3))
488 numelcrk = numelcrk + 1
490 isign(1) = int(sign(one,fit(1,i)))
491 isign(2) = int(sign(one,fit(2,i)))
492 isign(3) = int(sign(one,fit(3,i)))
494 IF (fit(1,i) == zero) isign(1) = 0
495 IF (fit(2,i) == zero) isign(2) = 0
496 IF (fit(3,i) == zero) isign(3) = 0
502 IF (isign(k) > 0)
THEN
505 ELSEIF (isign(k) < 0)
THEN
512 ELSEIF (itri == 2)
THEN
524 IF(ienr0(k,i) /= 0)
THEN
527 ienr(k) = crknodiad(iadc(k)) + knod2elc(nn(k))*(ilay-1)
535 iedge = xedge3n(k,elcrktg)
536 nod1 = nodedge(1,iedge)
537 nod2 = nodedge(2,iedge)
538 ie10 = crkedge(ilay)%EDGEENR(1,iedge)
539 ie20 = crkedge(ilay)%EDGEENR(2,iedge)
540 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
546 ELSE IF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
553 crkedge(ilay)%EDGEENR(1,iedge) =
max(ie1,ie10)
554 crkedge(ilay)%EDGEENR(2,iedge) =
max(ie2,ie20)
555 IF (crkedge(ilay)%EDGEICRK(iedge) == 0)
556 . crkedge(ilay)%EDGEICRK(iedge) = icrk
560 crkedge(ilay)%LAYCUT(elcrk) = 1
565 iedge = xedge3n(k,elcrktg)
567 crkedge(ilay)%EDGETIP(1,iedge) = tip(i)
568 crkedge(ilay)%EDGETIP(2,iedge) =
569 . crkedge(ilay)%EDGETIP(2,iedge) + 1
580 crklvset(pp1)%ENR0(1,iadc(1)) = -ienr(1)
581 crklvset(pp1)%ENR0(1,iadc(2)) = -ienr(2)
582 crklvset(pp1)%ENR0(1,iadc(3)) = -ienr(3)
584 IF (isign(1) > 0)
crklvset(pp1)%ENR0(1,iadc(1)) = 0
585 IF (isign(2) > 0)
crklvset(pp1)%ENR0(1,iadc(2)) = 0
586 IF (isign(3) > 0)
crklvset(pp1)%ENR0(1,iadc(3)) = 0
590 crklvset(pp2)%ENR0(1,iadc(1)) = -ienr(1)
591 crklvset(pp2)%ENR0(1,iadc(2)) = -ienr(2)
592 crklvset(pp2)%ENR0(1,iadc(3)) = -ienr(3)
594 IF (isign(1) < 0)
crklvset(pp2)%ENR0(1,iadc(1)) = 0
595 IF (isign(2) < 0)
crklvset(pp2)%ENR0(1,iadc(2)) = 0
596 IF (isign(3) < 0)
crklvset(pp2)%ENR0(1,iadc(3)) = 0
601 ie2 = xedge3n(nx3,elcrktg)
602 IF (crkedge(ilay)%ICUTEDGE(ie2) > 1)
THEN
612 crklvset(pp2)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
617 ied = crkedge(ilay)%IEDGETG(nx1,elcrktg)
620 ied = crkedge(ilay)%IEDGETG(nx3,elcrktg)
623 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
624 area1 = area1 / area(i)
629 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
630 area2 = area2 / area(i)
631 area3 = one - area1 - area2
637 ELSEIF (itri > 0)
THEN
639 ie1 = xedge3n(nx1,elcrktg)
640 IF (crkedge(ilay)%ICUTEDGE(ie1) > 1)
THEN
647 crklvset(pp1)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
650 ied1= crkedge(ilay)%IEDGETG(nx1,elcrktg)
651 ied2= crkedge(ilay)%IEDGETG(nx3,elcrktg)
658 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
659 area1 = area1 / area(i)
666 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
667 area2 = area2 / area(i)
668 area3 = one - area1 - area2
678 IF (area3 < zero .or. area1 > one .or. area2 > one .or. area3 > one )
THEN
679 print*,
'ERROR : XFEM PHANTOM ELEMENT AREA: ELCRK=',elcrk