37 . XFEM_STR ,NEL ,NFT ,IXC ,ELCUTC ,
38 . ILAY ,NLAY ,IEL_CRK ,INOD_CRK ,
39 . IADC_CRK ,NODENR ,ELCRKINI ,DIR1 ,DIR2 ,
40 . NODEDGE ,CRKNODIAD,KNOD2ELC ,CRKEDGE ,A_I ,
41 . XL2 ,XL3 ,XL4 ,YL2 ,YL3 ,
50 use element_mod ,
only : nixc
54#include "implicit_f.inc"
60#include "com_xfem1.inc"
65 INTEGER NEL,NFT,ILAY,IXC(NIXC,*),NLAY,NGL(NEL),IEL_CRK(*),
66 . INOD_CRK(*),NODENR(*),(4,*),ELCRKINI(NLAY,NEL),
67 . ELCUTC(2,*),NODEDGE(2,*),CRKNODIAD(*),KNOD2ELC(*),XEDGE4N(4
69 my_real,
DIMENSION(NLAY,NEL) :: DIR1,DIR2
70 my_real,
DIMENSION(NEL) :: A_I
71 TYPE (ELBUF_STRUCT_),
DIMENSION(NXEL),
TARGET :: XFEM_STR
72 TYPE (XFEM_EDGE_) ,
DIMENSION(NXLAYMAX) :: CRKEDGE
76 INTEGER I,J,K,R,II,IR,P1,P2,PP1,PP2,PP3,NEWCRK,FAC,
77 . iedge,icut,ied,icrk,elcrk,nod1,nod2,ie1,ie2,itri,
78 . ifi1,ifi2,ie10,ie20,np,nx1,nx2,nx3,nx4
79 INTEGER N(4),NN(4),dd(4),d(8),DX(8),
80 . ISIGN(4),IENR0(4),IENR(4),ECUT(2,),
81 . IADC(4),JCT(NEL),EDGEL(4,NEL),KPERM(8)
84 . xm(nel),ym(nel),xl2(nel),yl2(nel),xl3(nel),yl3(nel),
85 . xl4(nel),yl4(nel),xin(2,nel),yin(2,nel),xmi(2),ymi(2),
86 . fit(4,nel),xxl(4,nel),yyl(4,nel),len(4,nel),beta0(4,nel)
89 . xint,yint,fi,m12,mm,cross,acd,bcd,dlx,dly,
90 . xint0,yint0,dir11,dir22,beta,bmin,bmax,
91 . x1,y1,x2,y2,x3,y3,x4,y4,area1,area2
93 DATA d/1,2,2,3,4,3,1,4/
95 DATA dx/1,2,3,4,1,2,3,4/
96 DATA kperm/1,2,3,4,1,2,3,4/
97 parameter(bmin = 0.01, bmax = 0.99)
102 IF (elcrkini(ilay,i) == -1)
THEN
107 IF (newcrk == 0)
RETURN
132 xm(i) = fourth*(xl2(i)+xl3(i)+xl4(i))
133 ym(i) = fourth*(yl2(i)+yl3(i)+yl4(i))
135 len(1,i) = xl2(i)*xl2(i) + yl2(i)*yl2(i)
136 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))+
137 . (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
138 len(3,i) = (xl4(i)-xl3(i))*(xl4(i)-xl3(i))+
139 . (yl4(i)-yl3(i))*(yl4(i)-yl3(i))
140 len(4,i) = xl4(i)*xl4(i) + yl4(i)*yl4(i)
147 elcrk = iel_crk(i+nft)
149 dir11 = -dir2(ilay,i)
154 iedge = xedge4n(k,elcrk)
155 nod1 = nodedge(1,iedge)
156 nod2 = nodedge(2,iedge)
157 IF (nod1 == ixc(k+1,i) .and. nod2 == ixc(dd(k)+1,i))
THEN
160 ELSEIF (nod2 == ixc(k+1,i).and.nod1 == ixc(dd(k)+1,i))
THEN
165 IF (dir11 == zero)
THEN
166 dlx = xxl(p2,i) - xxl(p1,i)
167 IF (dlx /= zero)
THEN
168 dly = yyl(p2,i) - yyl(p1,i)
171 yint = yyl(p1,i) + m12*(xint-xxl(p1,i))
172 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
173 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
179 ELSEIF (dir22 == zero)
THEN
180 dly = yyl(p2,i) - yyl(p1,i)
181 IF (dly /= zero)
THEN
182 dlx = xxl(p2,i) - xxl(p1,i)
185 xint = xxl(p1,i) + m12*(yint-yyl(p1,i))
186 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
187 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
193 ELSEIF (dir11 /= zero .AND. dir22 /= zero)
THEN
194 dlx = xxl(p2,i) - xxl(p1,i)
195 dly = yyl(p2,i) - yyl(p1,i)
197 IF (dlx == zero)
THEN
199 yint = ym(i) + mm*(xint-xm(i))
200 IF ((yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
203 ELSEIF (dly == zero)
THEN
205 xint = xm(i) + (ym(i)-yyl(p1,i)) / mm
206 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero)
THEN
213 xint = (ym(i)-yyl(p1,i) + m12*xxl(p1,i) - mm*xm(i))/(m12-mm)
214 yint = ym(i) + mm*(xint-xm(i))
215 acd = (yint-yyl(p1,i))*(xm(i) - xxl(p1,i))
216 . - (xint-xxl(p1,i))*(ym(i) - yyl(p1,i))
217 bcd = (yint-yyl(p2,i))*(xm(i) - xxl(p2,i))
218 . - (xint-xxl(p2,i))*(ym(i) - yyl(p2,i))
219 IF (acd*bcd <= em3)
THEN
230 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
231 beta = sqrt(cross / len(k,i))
232 IF (beta > bmax .OR. beta < bmin)
THEN
233 beta =
max(beta, bmin)
234 beta =
min(beta, bmax)
235 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
236 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
245 WRITE(iout,*)
'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
255 elcrk = iel_crk(i+nft)
263 iedge = xedge4n(r,elcrk)
264 nod1 = nodedge(1,iedge)
265 nod2 = nodedge(2,iedge)
266 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))
THEN
269 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
274 IF (dir11 == zero)
THEN
275 dlx = xxl(p2,i) - xxl(p1,i)
276 IF (dlx /= zero)
THEN
277 dly = yyl(p2,i) - yyl(p1,i)
280 yint = yyl(p1,i) + m12*(xint-xxl(p1,i))
281 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
282 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
287 ELSEIF (dir22 == zero)
THEN
288 dly = yyl(p2,i) - yyl(p1,i)
289 IF (dly /= zero)
THEN
290 dlx = xxl(p2,i) - xxl(p1,i)
293 xint = xxl(p1,i) + m12*(yint-yyl(p1,i))
294 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
295 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
300 ELSEIF (dir11 /= zero .AND. dir22 /= zero)
THEN
301 dlx = xxl(p2,i) - xxl(p1,i)
302 dly = yyl(p2,i) - yyl(p1,i)
304 IF (dlx == zero)
THEN
306 yint = ym(i) + mm*(xint-xm(i))
307 IF ((yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
310 ELSEIF (dly == zero)
THEN
312 xint = xm(i) + (ym(i)-yyl(p1,i)) / mm
313 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero)
THEN
319 xint = (ym(i)-yyl(p1,i) + m12*xxl(p1,i) - mm*xm(i))/(m12-mm)
320 yint = ym(i) + mm*(xint-xm(i))
321 acd = (yint-yyl(p1,i))*(xm(i) - xxl(p1,i))
322 . - (xint-xxl(p1,i))*(ym(i) - yyl(p1,i))
323 bcd = (yint-yyl(p2,i))*(xm(i) - xxl(p2,i))
324 . - (xint-xxl(p2,i))*(ym(i) - yyl(p2,i))
333 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
334 beta = sqrt(cross / len(r,i))
335 IF (beta > bmax .OR. beta < bmin)
THEN
336 beta =
max(beta, bmin)
337 beta =
min(beta, bmax)
338 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
339 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
357 IF (edgel(k,i)==1 .or. edgel(k,i)==2) fac=fac+1
360 WRITE(iout,*)
'ERROR IN INITIATION CRACK.NO CUT EDGES'
369 elcrk = iel_crk(i+nft)
372 crkedge(ilay)%IEDGEC(k,elcrk) = edgel(k,i)
389 xmi(ied) = half*(xxl(p1,i)+xxl(p2,i))
390 ymi(ied) = half*(yyl(p1,i)+yyl(p2,i))
396 CALL lsint4(xmi(1),ymi(1),xmi(2),ymi(2),xxl(k,i),yyl(k,i),fi )
397 IF (fit(k,i)==zero) fit(k,i) = fi
403 elcrk = iel_crk(i+nft)
406 iedge = xedge4n(k,elcrk)
407 icut = crkedge(ilay)%ICUTEDGE(iedge)
409 crkedge(ilay)%ICUTEDGE(iedge) = 3
411 crkedge(ilay)%ICUTEDGE(iedge) = 2
412 crkedge(ilay)%RATIO(iedge) = beta0(k,i)
421 elcrk = iel_crk(i+nft)
423 numelcrk = numelcrk + 1
425 iadc(1) = iadc_crk(1,elcrk)
426 iadc(2) = iadc_crk(2,elcrk)
427 iadc(3) = iadc_crk(3,elcrk)
428 iadc(4) = iadc_crk(4,elcrk)
434 nn(1) = inod_crk(n(1))
435 nn(2) = inod_crk(n(2))
436 nn(3) = inod_crk(n(3))
437 nn(4) = inod_crk(n(4))
439 isign(1) = int(sign(one,fit(1,i)))
440 isign(2) = int(sign(one,fit(2,i)))
441 isign(3) = int(sign(one,fit(3,i)))
442 isign(4) = int(sign(one,fit(4,i)))
444 IF (fit(1,i) == zero) isign(1) = 0
445 IF (fit(2,i) == zero) isign(2) = 0
446 IF (fit(3,i) == zero) isign(3) = 0
447 IF (fit(4,i) == zero) isign(4) = 0
449 icrk =
crkshell(pp1)%CRKSHELLID(elcrk)
451 ienr0(1) = crknodiad(iadc(1))
452 ienr0(2) = crknodiad(iadc(2))
453 ienr0(3) = crknodiad(iadc(3))
454 ienr0(4) = crknodiad(iadc(4))
456 ienr(1) = ienr0(1) + knod2elc(nn(1))*(ilay-1)
457 ienr(2) = ienr0(2) + knod2elc(nn(2))*(ilay-1)
458 ienr(3) = ienr0(3) + knod2elc(nn(3))*(ilay-1)
459 ienr(4) = ienr0(4) + knod2elc(nn(4))*(ilay-1)
463 iedge = xedge4n(k,elcrk)
464 nod1 = nodedge(1,iedge)
465 nod2 = nodedge(2,iedge)
466 ie10 = crkedge(ilay)%EDGEENR(1,iedge)
467 ie20 = crkedge(ilay)%EDGEENR(2,iedge)
468 IF (nod1 == n(k) .and. nod2 == n(dd(k)))
THEN
473 ELSE IF (nod2 == n(k) .and. nod1 == n(dd(k)))
THEN
479 crkedge(ilay)%EDGEENR(1,iedge) =
max(ie1,ie10)
480 crkedge(ilay)%EDGEENR(2,iedge) =
max(ie2,ie20)
481 IF (crkedge(ilay)%EDGEICRK(iedge) == 0)
482 . crkedge(ilay)%EDGEICRK(iedge) = icrk
485 crkedge(ilay)%LAYCUT(elcrk) = -1
491 iedge = xedge4n(k,elcrk)
493 crkedge(ilay)%EDGETIP(1,iedge) = ied
494 crkedge(ilay)%EDGETIP(2,iedge) =
495 . crkedge(ilay)%EDGETIP(2,iedge) + 1
497 IF (isign(k) > 0) np = k
502 IF (np > 0 .and. isign(np-1) > 0)
THEN
522 print*,
' ERROR: K,IED=',k,ied
529 print*,
' ERROR: K,IED=',k,ied
531 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
532 area1 = area1 * a_i(i)
545 crklvset(pp1)%ENR0(1,iadc(1)) = -ienr(1)
546 crklvset(pp1)%ENR0(1,iadc(2)) = -ienr(2)
547 crklvset(pp1)%ENR0(1,iadc(3)) = -ienr(3)
548 crklvset(pp1)%ENR0(1,iadc(4)) = -ienr(4)
550 IF (isign(1) > 0)
crklvset(pp1)%ENR0(1,iadc(1)) = 0
551 IF (isign(2) > 0)
crklvset(pp1)%ENR0(1,iadc(2)) = 0
552 IF (isign(3) > 0)
crklvset(pp1)%ENR0(1,iadc(3)) = 0
553 IF (isign(4) > 0)
crklvset(pp1)%ENR0(1,iadc(4)) = 0
557 crklvset(pp2)%ENR0(1,iadc(1)) = -ienr(1)
558 crklvset(pp2)%ENR0(1,iadc(2)) = -ienr(2)
559 crklvset(pp2)%ENR0(1,iadc(3)) = -ienr(3)
560 crklvset(pp2)%ENR0(1,iadc(4)) = -ienr(4)
562 IF (isign(1) < 0)
crklvset(pp2)%ENR0(1,iadc(1)) = 0
563 IF (isign(2) < 0)
crklvset(pp2)%ENR0(1,iadc(2)) = 0
564 IF (isign(3) < 0)
crklvset(pp2)%ENR0(1,iadc(3)) = 0
565 IF (isign(4) < 0)
crklvset(pp2)%ENR0(1,iadc(4)) = 0
569 xfem_str(nxel)%GBUF%OFF(i) = zero
570 xfem_str(nxel)%BUFLY(ilay)%LBUF(1,1,1)%OFF(i) = zero
574 nlevset = nlevset + 1