36 . XFEM_STR ,NEL ,NFT ,IXC ,ELCUTC ,
37 . ILAY ,NLAY ,IEL_CRK ,INOD_CRK ,
38 . IADC_CRK ,NODENR ,ELCRKINI ,DIR1 ,DIR2 ,
39 . NODEDGE ,CRKNODIAD,KNOD2ELC ,CRKEDGE ,A_I ,
40 . XL2 ,XL3 ,XL4 ,YL2 ,YL3 ,
52#include "implicit_f.inc"
58#include "com_xfem1.inc"
63 INTEGER NEL,NFT,ILAY,IXC(NIXC,*),NLAY,NGL(NEL),IEL_CRK(*),
64 . INOD_CRK(*),NODENR(*),IADC_CRK(4,*),ELCRKINI(NLAY,NEL),
65 . ELCUTC(2,*),NODEDGE(2,*),CRKNODIAD(*),KNOD2ELC(*),XEDGE4N(4,*)
67 my_real,
DIMENSION(NLAY,NEL) :: DIR1,DIR2
68 my_real,
DIMENSION(NEL) :: A_I
69 TYPE (ELBUF_STRUCT_),
DIMENSION(NXEL),
TARGET :: XFEM_STR
70 TYPE (XFEM_EDGE_) ,
DIMENSION(NXLAYMAX) :: CRKEDGE
74 INTEGER I,J,K,R,II,IR,P1,P2,,PP2,PP3,NEWCRK,LAYCUT,FAC,
75 . iedge,icut,ied,ied1,ied2,icrk,elcrk,nod1,nod2,ie1,ie2,itri,
76 . ifi1,ifi2,ie10,ie20,np,nx1,nx2,nx3,nx4
77 INTEGER N(4),NN(4),dd(4),d(8),DX(8),
78 . ISIGN(4),IENR0(4),IENR(4),INV(2),ECUT(2,NEL),
79 . IADC(4),JCT(NEL),EDGEL(4,NEL),KPERM(8)
82 . xm(nel),ym(nel),xl2(nel),yl2(nel),xl3(nel),yl3(nel),
83 . xl4(nel),yl4(nel),xin(2,nel),yin(2,nel),xmi(2),ymi(2),
84 . fit(4,nel),xxl(4,nel),yyl(4,nel),len(4,nel),beta0(4,nel)
87 . xint,yint,fi,xxx,yyy,zzz,d12,m12,mm,cross,acd,bcd,dlx,dly,
88 . xint0,yint0,dir11,dir22,beta,bmin,bmax,
89 . x1,y1,x2,y2,x3,y3,x4,y4,area1,area2
91 DATA d/1,2,2,3,4,3,1,4/
93 DATA dx/1,2,3,4,1,2,3,4/
94 DATA kperm/1,2,3,4,1,2,3,4/
95 parameter(bmin = 0.01, bmax = 0.99)
100 IF (elcrkini(ilay,i) == -1)
THEN
105 IF (newcrk == 0)
RETURN
130 xm(i) = fourth*(xl2(i)+xl3(i)+xl4(i))
131 ym(i) = fourth*(yl2(i)+yl3(i)+yl4(i))
133 len(1,i) = xl2(i)*xl2(i) + yl2(i)*yl2(i)
134 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))+
135 . (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
136 len(3,i) = (xl4(i)-xl3(i))*(xl4(i)-xl3(i))+
137 . (yl4(i)-yl3(i))*(yl4(i)-yl3(i))
138 len(4,i) = xl4(i)*xl4(i) + yl4(i)*yl4(i)
145 elcrk = iel_crk(i+nft)
147 dir11 = -dir2(ilay,i)
152 iedge = xedge4n(k,elcrk)
153 nod1 = nodedge(1,iedge)
154 nod2 = nodedge(2,iedge)
155 IF (nod1 == ixc(k+1,i) .and. nod2 == ixc(dd(k)+1,i))
THEN
158 ELSEIF (nod2 == ixc(k+1,i).and.nod1 == ixc(dd(k)+1,i))
THEN
163 IF (dir11 == zero)
THEN
164 dlx = xxl(p2,i) - xxl(p1,i)
165 IF (dlx /= zero)
THEN
166 dly = yyl(p2,i) - yyl(p1,i)
169 yint = yyl(p1,i) + m12*(xint-xxl(p1,i))
170 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
171 . (yint-yyl(p1,i))*(yint
THEN
177 ELSEIF (dir22 == zero)
THEN
178 dly = yyl(p2,i) - yyl(p1,i)
179 IF (dly /= zero)
THEN
180 dlx = xxl(p2,i) - xxl(p1,i)
183 xint = xxl(p1,i) + m12*(yint-yyl(p1,i))
184 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
185 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
191 ELSEIF (dir11 /= zero .AND. dir22 /= zero)
THEN
192 dlx = xxl(p2,i) - xxl(p1,i)
193 dly = yyl(p2,i) - yyl(p1,i)
195 IF (dlx == zero)
THEN
197 yint = ym(i) + mm*(xint-xm(i))
198 IF ((yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
201 ELSEIF (dly == zero)
THEN
203 xint = xm(i) + (ym(i)-yyl(p1,i)) / mm
204 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero)
THEN
211 xint = (ym(i)-yyl(p1,i) + m12*xxl(p1,i) - mm*xm(i))/(m12-mm)
212 yint = ym(i) + mm*(xint-xm(i))
213 acd = (yint-yyl(p1,i))*(xm(i) - xxl(p1,i))
214 . - (xint-xxl(p1,i))*(ym(i) - yyl(p1,i))
215 bcd = (yint-yyl(p2,i))*(xm(i) - xxl(p2,i))
216 . - (xint-xxl(p2,i))*(ym(i) - yyl(p2,i))
217 IF (acd*bcd <= em3)
THEN
228 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
229 beta = sqrt(cross / len(k,i))
230 IF (beta > bmax .OR. beta < bmin)
THEN
231 beta =
max(beta, bmin)
232 beta =
min(beta, bmax)
233 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
234 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
243 WRITE(iout,*)
'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
253 elcrk = iel_crk(i+nft)
261 iedge = xedge4n(r,elcrk)
262 nod1 = nodedge(1,iedge)
263 nod2 = nodedge(2,iedge)
264 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i)
THEN
267 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
272 IF (dir11 == zero)
THEN
273 dlx = xxl(p2,i) - xxl(p1,i)
274 IF (dlx /= zero)
THEN
275 dly = yyl(p2,i) - yyl(p1,i)
278 yint = yyl(p1,i) + m12*(xint-xxl(p1,i))
279 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
280 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
285 ELSEIF (dir22 == zero)
THEN
286 dly = yyl(p2,i) - yyl(p1,i)
287 IF (dly /= zero)
THEN
288 dlx = xxl(p2,i) - xxl(p1,i)
291 xint = xxl(p1,i) + m12*(yint-yyl(p1,i))
292 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
293 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
298 ELSEIF (dir11 /= zero .AND. dir22 /= zero)
THEN
299 dlx = xxl(p2,i) - xxl(p1,i)
300 dly = yyl(p2,i) - yyl(p1,i)
302 IF (dlx == zero)
THEN
304 yint = ym(i) + mm*(xint-xm(i))
305 IF ((yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
308 ELSEIF (dly == zero)
THEN
310 xint = xm(i) + (ym(i)-yyl(p1,i)) / mm
311 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero)
THEN
317 xint = (ym(i)-yyl(p1,i) + m12*xxl(p1,i) - mm*xm(i))/(m12-mm)
318 yint = ym(i) + mm*(xint-xm(i))
319 acd = (yint-yyl(p1,i))*(xm(i) - xxl(p1,i))
320 . - (xint-xxl(p1,i))*(ym(i) - yyl(p1,i))
321 bcd = (yint-yyl(p2,i))*(xm(i) - xxl(p2,i))
322 . - (xint-xxl(p2,i))*(ym(i) - yyl(p2,i))
331 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
332 beta = sqrt(cross / len(r,i))
333 IF (beta > bmax .OR. beta < bmin)
THEN
334 beta =
max(beta, bmin)
335 beta =
min(beta, bmax)
336 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
337 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
355 IF (edgel(k,i)==1 .or. edgel(k,i)==2) fac=fac+1
358 WRITE(iout,*)
'ERROR IN INITIATION CRACK.NO CUT EDGES'
367 elcrk = iel_crk(i+nft)
370 crkedge(ilay)%IEDGEC(k,elcrk) = edgel(k,i)
387 xmi(ied) = half*(xxl(p1,i)+xxl(p2,i))
388 ymi(ied) = half*(yyl(p1,i)+yyl(p2,i))
394 CALL lsint4(xmi(1),ymi(1),xmi(2),ymi(2),xxl(k,i),yyl(k,i),fi )
395 IF (fit(k,i)==zero) fit(k,i) = fi
401 elcrk = iel_crk(i+nft)
404 iedge = xedge4n(k,elcrk)
405 icut = crkedge(ilay)%ICUTEDGE(iedge)
407 crkedge(ilay)%ICUTEDGE(iedge) = 3
409 crkedge(ilay)%ICUTEDGE(iedge) = 2
410 crkedge(ilay)%RATIO(iedge) = beta0(k,i)
419 elcrk = iel_crk(i+nft)
421 numelcrk = numelcrk + 1
423 iadc(1) = iadc_crk(1,elcrk)
424 iadc(2) = iadc_crk(2,elcrk)
425 iadc(3) = iadc_crk(3,elcrk)
426 iadc(4) = iadc_crk(4,elcrk)
433 nn(2) = inod_crk(n(2))
434 nn(3) = inod_crk(n(3))
435 nn(4) = inod_crk(n(4))
437 isign(1) = int(sign(one,fit(1,i)))
438 isign(2) = int(sign(one,fit(2,i)))
439 isign(3) = int(sign(one,fit(3,i)))
440 isign(4) = int(sign(one,fit(4,i)))
442 IF (fit(1,i) == zero) isign(1) = 0
443 IF (fit(2,i) == zero) isign(2) = 0
444 IF (fit(3,i) == zero) isign(3) = 0
445 IF (fit(4,i) == zero) isign(4) = 0
447 icrk =
crkshell(pp1)%CRKSHELLID(elcrk)
449 ienr0(1) = crknodiad(iadc(1))
450 ienr0(2) = crknodiad(iadc(2))
451 ienr0(3) = crknodiad(iadc(3))
452 ienr0(4) = crknodiad(iadc(4))
454 ienr(1) = ienr0(1) + knod2elc(nn(1))*(ilay-1)
455 ienr(2) = ienr0(2) + knod2elc(nn(2))*(ilay-1)
456 ienr(3) = ienr0(3) + knod2elc(nn(3))*(ilay-1)
457 ienr(4) = ienr0(4) + knod2elc(nn(4))*(ilay-1)
461 iedge = xedge4n(k,elcrk)
462 nod1 = nodedge(1,iedge)
463 nod2 = nodedge(2,iedge)
464 ie10 = crkedge(ilay)%EDGEENR(1,iedge)
465 ie20 = crkedge(ilay)%EDGEENR(2,iedge)
466 IF (nod1 == n(k) .and. nod2 == n(dd(k)))
THEN
471 ELSE IF (nod2 == n(k) .and. nod1 == n(dd(k)))
THEN
477 crkedge(ilay)%EDGEENR(1,iedge) =
max(ie1,ie10)
478 crkedge(ilay)%EDGEENR(2,iedge) =
max(ie2,ie20)
479 IF (crkedge(ilay)%EDGEICRK(iedge) == 0)
480 . crkedge(ilay)%EDGEICRK(iedge) = icrk
483 crkedge(ilay)%LAYCUT(elcrk) = -1
489 iedge = xedge4n(k,elcrk)
491 crkedge(ilay)%EDGETIP(1,iedge) = ied
492 crkedge(ilay)%EDGETIP(2,iedge) =
493 . crkedge(ilay)%EDGETIP(2,iedge) + 1
495 IF (isign(k) > 0) np = k
500 IF (np > 0 .and. isign(np-1) > 0)
THEN
520 print*,
' ERROR: K,IED=',k,ied
527 print*,
' ERROR: K,IED=',k,ied
529 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
530 area1 = area1 * a_i(i)
543 crklvset(pp1)%ENR0(1,iadc(1)) = -ienr(1)
544 crklvset(pp1)%ENR0(1,iadc(2)) = -ienr(2)
545 crklvset(pp1)%ENR0(1,iadc(3)) = -ienr(3)
546 crklvset(pp1)%ENR0(1,iadc(4)) = -ienr(4)
548 IF (isign(1) > 0)
crklvset(pp1)%ENR0(1,iadc(1)) = 0
549 IF (isign(2) > 0)
crklvset(pp1)%ENR0(1,iadc(2)) = 0
550 IF (isign(3) > 0)
crklvset(pp1)%ENR0(1,iadc(3)) = 0
551 IF (isign(4) > 0)
crklvset(pp1)%ENR0(1,iadc(4)) = 0
555 crklvset(pp2)%ENR0(1,iadc(1)) = -ienr(1)
556 crklvset(pp2)%ENR0(1,iadc(2)) = -ienr(2)
557 crklvset(pp2)%ENR0(1,iadc(3)) = -ienr(3)
558 crklvset(pp2)%ENR0(1,iadc(4)) = -ienr(4)
560 IF (isign(1) < 0)
crklvset(pp2)%ENR0(1,iadc(1)) = 0
561 IF (isign(2) < 0)
crklvset(pp2)%ENR0(1,iadc(2)) = 0
562 IF (isign(3) < 0)
crklvset(pp2)%ENR0(1,iadc(3)) = 0
563 IF (isign(4) < 0)
crklvset(pp2)%ENR0(1,iadc(4)) = 0
567 xfem_str(nxel)%GBUF%OFF(i) = zero
568 xfem_str(nxel)%BUFLY(ilay)%LBUF(1,1,1)%OFF(i) = zero
572 nlevset = nlevset + 1