34 . NEL ,NFT ,ILAY ,NLAY ,IXTG ,
35 . CRKLEN ,ELCRKINI ,IEL_CRKTG,DIR1 ,DIR2 ,
36 . NODEDGE ,CRKEDGE ,XEDGE3N ,NGL ,XL2 ,
37 . XL3 ,YL2 ,YL3 ,ALDT )
44 use element_mod ,
only : nixtg
48#include "implicit_f.inc"
53#include "com_xfem1.inc"
57 INTEGER NEL,NFT,ILAY,NLAY
58 INTEGER IXTG(NIXTG,*),NGL(NEL),IEL_CRKTG(*),ELCRKINI(NLAY,*),
59 . NODEDGE(2,*),XEDGE3N(3,*)
60 my_real DIR1(NLAY,NEL),DIR2(NLAY,NEL),CRKLEN(NEL),ALDT(NEL)
61 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
62 my_real,
DIMENSION(NEL) :: xl2,yl2,xl3,yl3
66 INTEGER I,K,IR,p1,p2,NEWCRK,IED,IED1,IED2,FAC,OK,ICRK,
67 . NOD1,NOD2,ELCRK,ELCRKTG,IEDGE,ICUT
68 INTEGER (NEL),EDGEL(3,NEL),TIP(NEL)
69 INTEGER DD(3),D(6),INV(2)
71 my_real,
DIMENSION(NEL) :: xl1,yl1
72 my_real,
DIMENSION(2,NEL) :: xin,yin
73 my_real,
DIMENSION(3,NEL) :: xxl,yyl,len
75 my_real beta,xint,yint,bmin,bmax,x10,y10,x20,y20,
76 . m12,mm,cross1,cross12,xint0,yint0,dir11,dir22
80 parameter(bmin = 0.01, bmax = 0.99)
85 IF (elcrkini(ilay,i) == 5)
THEN
89 ELSEIF (elcrkini(ilay,i) == -5)
THEN
94 IF (newcrk == 0)
RETURN
104 xin(2,i) = zero !
second inters point in local skew
116 elcrktg = iel_crktg(i+nft)
121 iedge = xedge3n(k,elcrktg)
122 icut = crkedge(ilay)%ICUTEDGE(iedge)
123 nod1 = nodedge(1,iedge)
124 nod2 = nodedge(2,iedge)
125 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
128 ELSE IF (nod2 == ixtg(k+1,i) .and. nod1 == ixtg(dd(k)+1,i))
THEN
136 icrk = crkedge(ilay)%EDGEICRK(iedge)
142 WRITE(iout,*)
'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
147 iedge = xedge3n(ied,elcrktg)
148 tip(i) = crkedge(ilay)%EDGETIP(1,iedge)
166 len(1,i) = (xl2(i)-xl1(i))*(xl2(i)-xl1(i))
167 . + (yl2(i)-yl1(i))*(yl2(i)-yl1(i))
168 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))
169 . + (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
170 len(3,i) = (xl1(i)-xl3(i))*(xl1(i)-xl3(i))
171 . + (yl1(i)-yl3(i))*(yl1(i)-yl3(i))
178 elcrktg = iel_crktg(i+nft)
179 elcrk = elcrktg + ecrkxfec
183 IF(edgel(k,i) > 0)
THEN
190 iedge = xedge3n(k,elcrktg)
191 IF (iedge > 0 .and. edgel(k,i) == 1)
THEN
192 icut = crkedge(ilay)%ICUTEDGE(iedge)
194 beta = crkedge(ilay)%RATIO(iedge)
196 IF (beta > one .or. beta == zero)
THEN
197 WRITE(*,*)
'ERROR NEGATIV BETA, NO INTERSECTION!'
201 nod1 = nodedge(1,iedge)
202 nod2 = nodedge(2,iedge)
203 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
206 ELSEIF (nod2 == ixtg(k+1,i).and.nod1
THEN
215 xint = x10+beta*(x20-x10)
216 yint = y10+beta*(y20-y10)
223 IF (ied1 == 0 .or. ied2 == 0)
GOTO 130
227 dir11 = -dir2(ilay,i)
230 IF (dir11 == zero)
THEN
234 elcrktg = iel_crktg(i+nft)
235 elcrk = elcrktg + ecrkxfec
236 iedge = xedge3n(k,elcrktg)
237 nod1 = nodedge(1,iedge)
238 nod2 = nodedge(2,iedge)
239 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
242 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
247 IF (edgel(k,i) == ied1)
GOTO 140
248 IF (xxl(p1,i) == xxl(p2,i))
GOTO 140
249 m12 = xxl(p2,i)-xxl(p1,i)
250 m12 = (yyl(p2,i)-yyl(p1,i))/m12
252 yint = yyl(p1,i)+m12*(xint-xxl(p1,i))
253 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
254 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
255 IF (cross12 > zero)
GOTO 140
257 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
258 beta = sqrt(cross1 / len(k,i))
259 beta =
max(beta, bmin)
260 beta =
min(beta, bmax)
268 ELSEIF(dir22 == zero)
THEN
272 elcrktg = iel_crktg(i+nft)
273 elcrk = elcrktg + ecrkxfec
274 iedge = xedge3n(k,elcrktg)
275 nod1 = nodedge(1,iedge)
276 nod2 = nodedge(2,iedge)
277 IF(nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
280 ELSE IF(nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
285 IF (edgel(k,i) == ied1)
GOTO 150
286 IF (yyl(p1,i) == yyl(p2,i))
GOTO 150
287 m12 = yyl(p2,i)-yyl(p1,i)
288 m12 = (xxl(p2,i)-xxl(p1,i))/m12
290 xint = xxl(p1,i)+m12*(yint-yyl(p1,i))
291 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
292 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
293 IF (cross12 > zero)
GOTO 150
295 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
296 beta = sqrt(cross1 / len(k,i))
297 beta =
max(beta, bmin)
298 beta =
min(beta, bmax)
306 ELSEIF(dir11 /= zero .AND. dir22 /= zero)
THEN
310 elcrktg = iel_crktg(i+nft)
311 elcrk = elcrktg + ecrkxfec
312 iedge = xedge3n(k,elcrktg)
313 nod1 = nodedge(1,iedge)
314 nod2 = nodedge(2,iedge)
315 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
318 ELSE IF (nod2 == ixtg(k+1,i).and.nod1==ixtg(dd(k)+1,i))
THEN
323 IF (edgel(k,i) == ied1)
GOTO 160
324 IF (xxl(p1,i) == xxl(p2,i))
THEN
327 yint = yint0+mm*(xint-xint0)
328 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
329 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
330 IF (cross12 > zero)
GOTO 160
332 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
333 beta = sqrt(cross1 / len(k,i))
334 beta =
max(beta, bmin)
335 beta =
min(beta, bmax)
344 m12 = xxl(p2,i)-xxl(p1,i)
345 m12 = (yyl(p2,i)-yyl(p1,i))/m12
346 IF (mm == m12)
GOTO 160
347 xint = (yint0-yyl(p1,i)+m12*xxl(p1,i)-mm*xint0)/(m12-mm)
348 yint = yint0+mm*(xint-xint0)
349 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
350 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
351 IF (cross12 > zero)
GOTO 160
353 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
354 beta = sqrt(cross1 / len(k,i))
355 beta =
max(beta, bmin)
356 beta =
min(beta, bmax)
375 IF (edgel(k,i)==1 .or. edgel(k,i)==2) fac=fac+1
378 WRITE(iout,*)
'ERROR IN ADVANCING CRACK.NO CUT EDGES'
381 crklen(i) = sqrt((xin(2,i) - xin(1,i))**2 + (yin(2,i) - yin(1,i))**2)