35 . NEL ,NFT ,ILAY ,NLAY ,IXC ,
36 . CRKLEN ,ELCRKINI ,IEL_CRK ,DIR1 ,DIR2 ,
37 . NODEDGE ,CRKEDGE ,XEDGE4N ,NGL ,XL2 ,
38 . XL3 ,XL4 ,YL2 ,YL3 ,YL4 ,
46 use element_mod ,
only : nixc
50#include "implicit_f.inc"
58 INTEGER NEL,NFT,ILAY,NLAY
59 INTEGER IXC(NIXC,*),NGL(NEL),IEL_CRK(*),ELCRKINI(NLAY,NEL),
60 . NODEDGE(2,*),XEDGE4N(4,*)
61 my_real DIR1(NLAY,NEL),DIR2(NLAY,NEL),CRKLEN(NEL),ALDT(NEL),
62 . XL2(NEL),YL2(NEL),XL3(NEL),YL3(NEL),XL4(NEL),YL4(NEL)
63 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
67 INTEGER I,K,R,IR,P1,P2,NEWCRK,IED,OK,ELCRK,
68 . fac,iedge,icut,nod1,nod2
70 INTEGER JCT(NEL),EDGEL(4,NEL),TIP(NEL),ECUT(2,NEL),dd(4),d(8),KPERM(8)
73 . xin(2,nel),yin(2,nel),len(4,nel),
74 . xxl(4,nel),yyl(4,nel),beta0(4,nel)
76 . xint,yint,cross,acd,bcd,dlx,dly,
77 . m12,mm,xint0,yint0,dir11,dir22,
80 DATA d/1,2,2,3,4,3,1,4/
82 DATA kperm/1,2,3,4,1,2,3,4/
83 parameter(bmin = 0.01, bmax = 0.99)
88 IF (elcrkini(ilay,i) == 5)
THEN
92 ELSEIF (elcrkini(ilay,i) == -5)
THEN
97 IF (newcrk == 0)
RETURN
119 len(1,i) = xl2(i)*xl2(i) + yl2(i)*yl2(i)
120 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))+
121 . (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
122 len(3,i) = (xl4(i)-xl3(i))*(xl4(i)-xl3(i))+
123 . (yl4(i)-yl3(i))*(yl4(i)-yl3(i))
124 len(4,i) = xl4(i)*xl4(i) + yl4(i)*yl4(i)
131 elcrk = iel_crk(i+nft)
136 iedge = xedge4n(k,elcrk)
138 icut = crkedge(ilay)%ICUTEDGE(iedge)
140 nod1 = nodedge(1,iedge)
141 nod2 = nodedge(2,iedge)
142 IF (nod1 == ixc(k+1,i) .and. nod2 == ixc(dd(k)+1,i))
THEN
145 ELSE IF (nod2 == ixc(k+1,i) .and. nod1 == ixc(dd(k)+1,i))
THEN
158 beta = crkedge(ilay)%RATIO(iedge
159 xin(1,i) = xxl(p1,i) + beta*(xxl(p2,i) - xxl(p1,i))
160 yin(1,i) = yyl(p1,i) + beta*(yyl(p2,i) - yyl(p1,i))
163 iedge = xedge4n(ied,elcrk)
164 tip(i) = crkedge(ilay)%EDGETIP(1,iedge)
166 WRITE(iout,*)
'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
176 elcrk = iel_crk(i+nft)
183 IF (dir11 == zero)
THEN
185 r = kperm(ecut(1,i) + k)
186 iedge = xedge4n(r,elcrk)
187 nod1 = nodedge(1,iedge)
188 nod2 = nodedge(2,iedge)
189 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))
THEN
192 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
196 dlx = xxl(p2,i) - xxl(p1,i)
197 IF (dlx /= zero)
THEN
198 dly = yyl(p2,i) - yyl(p1,i)
201 yint = yyl(p1,i) + m12*(xint-xxl(p1,i))
202 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
203 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
204 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
205 beta = sqrt(cross / len(r,i))
206 IF (beta > bmax .OR. beta < bmin)
THEN
207 beta =
max(beta, bmin)
208 beta =
min(beta, bmax)
209 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
222 ELSEIF (dir22 == zero)
THEN
224 r = kperm(ecut(1,i) + k)
225 iedge = xedge4n(r,elcrk)
226 nod1 = nodedge(1,iedge)
227 nod2 = nodedge(2,iedge)
228 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))
THEN
231 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
235 dly = yyl(p2,i) - yyl(p1,i)
236 IF (dly /= zero)
THEN
237 dlx = xxl(p2,i) - xxl(p1,i)
240 xint = xxl(p1,i) + m12*(yint-yyl(p1,i))
241 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
242 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
243 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
244 beta = sqrt(cross / len(r,i))
245 IF (beta > bmax .OR. beta < bmin)
THEN
246 beta =
max(beta, bmin)
247 beta =
min(beta, bmax)
248 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
261 ELSEIF (dir11 /= zero .and. dir22 /= zero)
THEN
263 r = kperm(ecut(1,i) + k)
264 iedge = xedge4n(r,elcrk)
265 nod1 = nodedge(1,iedge)
266 nod2 = nodedge(2,iedge)
267 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))
THEN
270 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
275 dlx = xxl(p2,i) - xxl(p1,i)
276 dly = yyl(p2,i) - yyl(p1,i)
278 IF (dlx == zero)
THEN
280 yint = yint0 + mm*(xint-xint0)
281 IF ((yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
282 cross = (yyl(p1,i) - yint)**2
283 beta = sqrt(cross / len(r,i))
284 IF (beta > bmax .OR. beta < bmin)
THEN
285 beta =
max(beta, bmin)
286 beta =
min(beta, bmax)
287 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
296 ELSEIF (dly == zero)
THEN
298 xint = xint0 + (yint0-yyl(p1,i)) / mm
299 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero)
THEN
300 cross = (xxl(p1,i) - xint)**2
301 beta = sqrt(cross / len(r,i))
302 IF (beta > bmax .OR. beta < bmin)
THEN
303 beta =
max(beta, bmin)
304 beta =
min(beta, bmax)
305 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
317 xint = (yint0-yyl(p1,i) + m12*xxl(p1,i) - mm*xint0)/(m12-mm)
318 yint = yint0 + mm*(xint-xint0)
319 acd = (yint-yyl(p1,i))*(xint0 - xxl(p1,i))
320 . - (xint-xxl(p1,i))*(yint0 - yyl(p1,i))
321 bcd = (yint-yyl(p2,i))*(xint0 - xxl(p2,i))
322 . - (xint-xxl(p2,i))*(yint0 - yyl(p2,i))
323 IF (acd*bcd <= zero)
THEN
324 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
325 beta = sqrt(cross / len(r,i))
326 IF (beta > bmax .OR. beta < bmin)
THEN
327 beta =
max(beta, bmin)
328 beta =
min(beta, bmax)
329 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
330 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
351 IF (edgel(r,i)==1 .or. edgel(r,i)==2) fac=fac+1
354 WRITE(iout,*)
'ERROR IN ADVANCING CRACK. NO CUT EDGES'
357 crklen(i) = sqrt((xin(2,i) - xin(1,i))**2 + (yin(2,i) - yin(1,i))**2)