33 . NEL ,NFT ,ILAY ,NLAY ,IXTG ,
34 . CRKLEN ,ELCRKINI ,IEL_CRKTG,DIR1 ,DIR2 ,
35 . NODEDGE ,CRKEDGE ,XEDGE3N ,NGL ,XL2 ,
36 . XL3 ,YL2 ,YL3 ,ALDT )
46#include "implicit_f.inc"
51#include "com_xfem1.inc"
55 INTEGER NEL,NFT,ILAY,NLAY
56 INTEGER IXTG(NIXTG,*),NGL(NEL),IEL_CRKTG(*),ELCRKINI(NLAY,*),
57 . NODEDGE(2,*),XEDGE3N(3,*)
58 my_real DIR1(NLAY,NEL),DIR2(NLAY,NEL),CRKLEN(NEL),ALDT(NEL)
59 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
60 my_real,
DIMENSION(NEL) :: xl2,yl2,xl3,yl3
64 INTEGER I,J,K,IR,p1,p2,NEWCRK,IED,IED1,IED2,FAC,OK,ICRK,
65 . NOD1,NOD2,ELCRK,ELCRKTG,IEDGE,ICUT
66 INTEGER JCT(NEL),EDGEL(3,NEL),ELTIP(),TIP(NEL)
67 INTEGER DD(3),D(6),ISIGN(3),N(3),IENR(3),NN(3),INV(2)
69 my_real,
DIMENSION(NEL) :: xl1,yl1
70 my_real,
DIMENSION(2,NEL) :: xin,yin
71 my_real,
DIMENSION(3,NEL) :: xxl,yyl,len
72 my_real beta0(3,nel),xn(3),yn(3),zn(3),xmi(2),ymi(2)
73 my_real beta,xint,yint,bmin,bmax,x10,y10,z10,x20,y20,z20,
74 . m12,mm,cross1,cross12,xint0,yint0,dir11,dir22
78 parameter(bmin = 0.01, bmax = 0.99)
83 IF (elcrkini(ilay,i) == 5)
THEN
87 ELSEIF (elcrkini(ilay,i) == -5)
THEN
92 IF (newcrk == 0)
RETURN
114 elcrktg = iel_crktg(i+nft)
119 iedge = xedge3n(k,elcrktg)
120 icut = crkedge(ilay)%ICUTEDGE(iedge)
121 nod1 = nodedge(1,iedge)
122 nod2 = nodedge(2,iedge)
123 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
126 ELSE IF (nod2 == ixtg(k+1,i) .and. nod1 == ixtg(dd(k)+1,i))
THEN
134 icrk = crkedge(ilay)%EDGEICRK(iedge)
140 WRITE(iout,*)
'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
145 iedge = xedge3n(ied,elcrktg)
146 tip(i) = crkedge(ilay)%EDGETIP(1,iedge)
164 len(1,i) = (xl2(i)-xl1(i))*(xl2(i)-xl1(i))
165 . + (yl2(i)-yl1(i))*(yl2(i)-yl1(i))
166 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))
167 . + (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
168 len(3,i) = (xl1(i)-xl3(i))*(xl1(i)-xl3(i))
169 . + (yl1(i)-yl3(i))*(yl1(i)-yl3
176 elcrktg = iel_crktg(i+nft)
177 elcrk = elcrktg + ecrkxfec
181 IF(edgel(k,i) > 0)
THEN
188 iedge = xedge3n(k,elcrktg)
189 IF (iedge > 0 .and. edgel(k,i) == 1)
THEN
190 icut = crkedge(ilay)%ICUTEDGE(iedge
192 beta = crkedge(ilay)%RATIO(iedge)
194 IF (beta > one .or. beta == zero)
THEN
195 WRITE(*,*)
'ERROR NEGATIV BETA, NO INTERSECTION!'
199 nod1 = nodedge(1,iedge)
200 nod2 = nodedge(2,iedge)
201 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
204 ELSEIF (nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
213 xint = x10+beta*(x20-x10)
214 yint = y10+beta*(y20-y10)
221 IF (ied1 == 0 .or. ied2 == 0)
GOTO
225 dir11 = -dir2(ilay,i)
228 IF (dir11 == zero)
THEN
232 elcrktg = iel_crktg(i+nft)
233 elcrk = elcrktg + ecrkxfec
234 iedge = xedge3n(k,elcrktg)
235 nod1 = nodedge(1,iedge
236 nod2 = nodedge(2,iedge)
237 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
240 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
245 IF (edgel(k,i) == ied1)
GOTO 140
246 IF (xxl(p1,i) == xxl(p2,i))
GOTO 140
247 m12 = xxl(p2,i)-xxl(p1,i)
248 m12 = (yyl(p2,i)-yyl(p1,i))/m12
250 yint = yyl(p1,i)+m12*(xint-xxl(p1,i))
251 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
252 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
253 IF (cross12 > zero)
GOTO 140
255 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
256 beta = sqrt(cross1 / len(k,i))
257 beta =
max(beta, bmin)
258 beta =
min(beta, bmax)
266 ELSEIF(dir22 == zero)
THEN
270 elcrktg = iel_crktg(i+nft)
271 elcrk = elcrktg + ecrkxfec
272 iedge = xedge3n(k,elcrktg)
273 nod1 = nodedge(1,iedge)
274 nod2 = nodedge(2,iedge)
275 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
278 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
283 IF (edgel(k,i) == ied1)
GOTO 150
284 IF (yyl(p1,i) == yyl(p2,i))
GOTO 150
285 m12 = yyl(p2,i)-yyl(p1,i)
286 m12 = (xxl(p2,i)-xxl(p1,i))/m12
288 xint = xxl(p1,i)+m12*(yint-yyl(p1,i))
289 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
290 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
291 IF (cross12 > zero)
GOTO 150
293 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
294 beta = sqrt(cross1 / len(k,i))
295 beta =
max(beta, bmin)
296 beta =
min(beta, bmax)
304 ELSEIF(dir11 /= zero .AND. dir22 /= zero)
THEN
308 elcrktg = iel_crktg(i+nft)
309 elcrk = elcrktg + ecrkxfec
310 iedge = xedge3n(k,elcrktg)
311 nod1 = nodedge(1,iedge)
312 nod2 = nodedge(2,iedge)
313 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
316 ELSE IF (nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
321 IF (edgel(k,i) == ied1)
GOTO 160
322 IF (xxl(p1,i) == xxl(p2,i))
THEN
325 yint = yint0+mm*(xint-xint0)
326 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
327 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
328 IF (cross12 > zero)
GOTO 160
330 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
331 beta = sqrt(cross1 / len(k,i))
332 beta =
max(beta, bmin)
333 beta =
min(beta, bmax)
342 m12 = xxl(p2,i)-xxl(p1,i)
343 m12 = (yyl(p2,i)-yyl(p1,i))/m12
344 IF (mm == m12)
GOTO 160
345 xint = (yint0-yyl(p1,i)+m12*xxl(p1,i)-mm*xint0)/(m12-mm)
346 yint = yint0+mm*(xint-xint0)
347 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
348 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
349 IF (cross12 > zero)
GOTO 160
351 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
352 beta = sqrt(cross1 / len(k,i))
353 beta =
max(beta, bmin)
354 beta =
min(beta, bmax)
373 IF (edgel(k,i)==1 .or. edgel(k,i)==2) fac=fac+1
376 WRITE(iout,*)
'ERROR IN ADVANCING CRACK.NO CUT EDGES'
379 crklen(i) = sqrt((xin(2,i) - xin(1,i))**2 + (yin(2,i) - yin(1,i))**2)