39
40
41
42
43
45
46
47
48#include "implicit_f.inc"
49
50
51
52#include "units_c.inc"
53
54
55
56 INTEGER NEL,NFT,ILAY,NLAY
57 INTEGER IXC(NIXC,*),NGL(NEL),IEL_CRK(*),ELCRKINI(NLAY,NEL),
58 . NODEDGE(2,*),XEDGE4N(4,*)
59 my_real dir1(nlay,nel),dir2(nlay,nel),crklen(nel),aldt(nel),
60 . xl2(nel),yl2(nel),xl3(nel),yl3(nel),xl4(nel),yl4(nel)
61 TYPE (XFEM_EDGE_) , DIMENSION(*) :: CRKEDGE
62
63
64
65 INTEGER I,J,K,R,IR,P1,P2,NEWCRK,IED,OK,ELCRK,NX1,NX2,NX3,NX4,NM,NP,
66 . FAC,IFI1,IFI2,IEDGE,ICUT,SIGBETA,ICRK,IELCRK,NOD1,NOD2
67
68 INTEGER JCT(NEL),EDGEL(4,NEL),TIP(NEL),ECUT(2,NEL),dd(4),d(8),KPERM(8)
69
71 . xin(2,nel),yin(2,nel),len(4,nel),xmi(2),ymi(2),
72 . xxl(4,nel),yyl(4,nel),beta0(4,nel)
74 . xint,yint,zint,fi,xxx,yyy,zzz,cross,acd,bcd,dlx,dly,
75 . x10,y10,z10,x20,y20,z20,d12,m12,mm,xint0,yint0,dir11,dir22,
76 . x1,y1,x2,y2,x3,y3,x4,y4,beta,bmin,bmax
77
78 DATA d/1,2,2,3,4,3,1,4/
79 DATA dd/2,3,4,1/
80 DATA kperm/1,2,3,4,1,2,3,4/
81 parameter(bmin = 0.01, bmax = 0.99)
82
83 newcrk = 0
84 DO i=1,nel
85 jct(i) = 0
86 IF (elcrkini(ilay,i) == 5) THEN
87 newcrk = newcrk + 1
88 jct(newcrk) = i
89 elcrkini(ilay,i) = 2
90 ELSEIF (elcrkini(ilay,i) == -5) THEN
91 crklen(i) = aldt(i)
92 elcrkini(ilay,i) = 0
93 ENDIF
94 ENDDO
95 IF (newcrk == 0) RETURN
96
97 DO ir=1,newcrk
98 i = jct(ir)
99 tip(i) = 0
100 ecut(1:2,i) = 0
101 edgel(1:4,i) = 0
102 beta0(1:4,i) = zero
103 xin(1,i) = zero
104 yin(1,i) = zero
105 xin(2,i) = zero
106 yin(2,i) = zero
107
108 xxl(1,i) = zero
109 yyl(1,i) = zero
110 xxl(2,i) = xl2(i)
111 yyl(2,i) = yl2(i)
112 xxl(3,i) = xl3(i)
113 yyl(3,i) = yl3(i)
114 xxl(4,i) = xl4(i)
115 yyl(4,i) = yl4(i)
116
117 len(1,i) = xl2(i)*xl2(i) + yl2(i)*yl2(i)
118 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))+
119 . (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
120 len(3,i) = (xl4(i)-xl3(i))*(xl4(i)-xl3(i))+
121 . (yl4(i)-yl3(i))*(yl4(i)-yl3(i))
122 len(4,i) = xl4(i)*xl4(i) + yl4(i)*yl4(i)
123 ENDDO
124
125
126
127 DO ir=1,newcrk
128 i = jct(ir)
129 elcrk = iel_crk(i+nft)
130 ok = 0
131 icut = 0
132 ied = 0
133 DO k=1,4
134 iedge = xedge4n(k,elcrk)
135 IF (iedge > 0) THEN
136 icut = crkedge(ilay)%ICUTEDGE(iedge)
137 IF (icut == 1) THEN
138 nod1 = nodedge(1,iedge)
139 nod2 = nodedge(2,iedge)
140 IF (nod1 == ixc(k+1,i) .and. nod2 == ixc(dd(k)+1,i)) THEN
141 p1 = k
142 p2 = dd(k)
143 ELSE IF (nod2 == ixc(k+1,i) .and. nod1 == ixc(ddTHEN
144 p1 = dd(k)
145 p2 = k
146 ENDIF
147 ok = 1
148 ied = k
149 ecut(1,i)= k
150 EXIT
151 ENDIF
152 ENDIF
153 ENDDO
154
155 IF (ok == 1) THEN
156 beta = crkedge(ilay)%RATIO(iedge)
157 xin(1,i) = xxl(p1,i) + beta*(xxl(p2,i) - xxl(p1,i))
158 yin(1,i) = yyl(p1,i) + beta*(yyl(p2,i) - yyl(p1,i))
159
160 edgel(ied,i) = 1
161 iedge = xedge4n(ied,elcrk)
162 tip(i) = crkedge(ilay)%EDGETIP(1,iedge)
163 ELSE
164 WRITE(iout,*) 'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
166 ENDIF
167
168 END DO
169
170
171
172 DO ir=1,newcrk
173 i = jct(ir)
174 elcrk = iel_crk(i+nft)
175 r = ecut(1,i)
176 xint0 = xin(1,i)
177 yint0 = yin(1,i)
178 dir11 =-dir2(ilay,i)
179 dir22 = dir1(ilay,i)
180
181 IF (dir11 == zero) THEN
182 DO k=1,3
183 r = kperm(ecut(1,i) + k)
184 iedge = xedge4n(r,elcrk)
185 nod1 = nodedge(1,iedge)
186 nod2 = nodedge(2,iedge)
187 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))THEN
188 p1 = r
189 p2 = dd(r)
190 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(ddTHEN
191 p1 = dd(r)
192 p2 = r
193 ENDIF
194 dlx = xxl(p2,i) - xxl(p1,i)
195 IF (dlx /= zero) THEN
196 dly = yyl(p2,i) - yyl(p1,i)
197 m12 = dly / dlx
198 xint = xint0
199 yint = yyl(p1,i) + m12*(xint-xxl(p1,i))
200 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
201 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero) THEN
202 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
203 beta = sqrt(cross / len(r,i))
204 IF (beta > bmax .OR. beta < bmin) THEN
205 beta =
max(beta, bmin)
206 beta =
min(beta, bmax)
207 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
208 ENDIF
209
210 ecut(2,i) = r
211 xin(2,i) = xint
212 yin(2,i) = yint
213 edgel(r,i) = 2
214 beta0(r,i) = beta
215 EXIT
216 ENDIF
217 ENDIF
218 ENDDO
219
220 ELSEIF (dir22 == zero) THEN
221 DO k=1,3
222 r = kperm(ecut(1,i) + k)
223 iedge = xedge4n(r,elcrk)
224 nod1 = nodedge(1,iedge)
225 nod2 = nodedge(2,iedge)
226 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i)) THEN
227 p1 = r
228 p2 = dd(r)
229 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i)) THEN
230 p1 = dd(r)
231 p2 = r
232 ENDIF
233 dly = yyl(p2,i) - yyl(p1,i)
234 IF (dly /= zero) THEN
235 dlx = xxl(p2,i) - xxl(p1,i)
236 m12 = dlx / dly
237 yint = yint0
238 xint = xxl(p1,i) + m12*(yint-yyl(p1,i))
239 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
240 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero) THEN
241 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
242 beta = sqrt(cross / len(r,i))
243 IF (beta > bmax .OR. beta < bmin) THEN
244 beta =
max(beta, bmin)
245 beta =
min(beta, bmax)
246 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
247 ENDIF
248
249 ecut(2,i) = r
250 xin(2,i) = xint
251 yin(2,i) = yint
252 edgel(r,i) = 2
253 beta0(r,i) = beta
254 EXIT
255 ENDIF
256 ENDIF
257 ENDDO
258
259 ELSEIF (dir11 /= zero .and. dir22 /= zero) THEN
260 DO k=1,3
261 r = kperm(ecut(1,i) + k)
262 iedge = xedge4n(r,elcrk)
263 nod1 = nodedge(1,iedge)
264 nod2 =
265 IF (nod1 == ixcTHEN
266 p1 = r
267 p2 = dd(r)
268 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i)) THEN
269 p1 = dd(r)
270 p2 = r
271 ENDIF
272
273 dlx = xxl(p2,i) - xxl(p1,i)
274 dly = yyl(p2,i) - yyl(p1,i)
275 mm = dir22/dir11
276 IF (dlx == zero) THEN
277 xint = xxl(p1,i)
278 yint = yint0 + mm*(xint-xint0)
279 IF ((yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero) THEN
280 cross = (yyl(p1,i) - yint)**2
281 beta = sqrt(cross / len(r,i))
282 IF (beta > bmax .OR. beta < bmin) THEN
283 beta =
max(beta, bmin)
284 beta =
min(beta, bmax)
285 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
286 ENDIF
287 ecut(2,i) = r
288 xin(2,i) = xint
289 yin(2,i) = yint
290 edgel(r,i) = 2
291 beta0(r,i) = beta
292 EXIT
293 ENDIF
294 ELSEIF (dly == zero) THEN
295 yint = yyl(p1,i)
296 xint = xint0 + (yint0-yyl(p1,i)) / mm
297 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero) THEN
298 cross = (xxl(p1,i) - xint)**2
299 beta = sqrt(cross / len(r,i))
300 IF (beta > bmax .OR. beta < bmin) THEN
301 beta =
max(beta, bmin)
302 beta =
min(beta, bmax)
303 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
304 ENDIF
305 ecut(2,i) = r
306 xin(2,i) = xint
307 yin(2,i) = yint
308 edgel(r,i) = 2
309 beta0(r,i) = beta
310 EXIT
311 ENDIF
312 ELSE
313 m12 = dly / dlx
314 IF (mm /= m12) THEN
315 xint = (yint0-yyl(p1,i) + m12*xxl(p1,i) - mm*xint0)/(m12-mm)
316 yint = yint0 + mm*(xint-xint0)
317 acd = (yint-yyl(p1,i))*(xint0 - xxl(p1,i))
318 . - (xint-xxl(p1,i))*(yint0
319 bcd = (yint-yyl(p2,i))*
320 . - (xint-xxl(p2,i))*(yint0 - yyl(p2,i))
321 IF (acd*bcd <= zero) THEN
322 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
323 beta = sqrt
324 IF (beta > bmax .OR. beta < bmin) THEN
325 beta =
max(beta, bmin)
326 beta =
min(beta, bmax)
327 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
328 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
329 ENDIF
330 ecut(2,i) = r
331 xin(2,i) = xint
332 yin(2,i) = yint
333 edgel(r,i) = 2
334 beta0(r,i) = beta
335 EXIT
336 ENDIF
337 ENDIF
338 ENDIF
339 ENDDO
340 ENDIF
341 ENDDO
342
343
344
345 DO ir=1,newcrk
346 i = jct(ir)
347 fac = 0
348 DO r=1,4
349 IF (edgel(r,i)==1 .or. edgel(r,i)==2) fac
350 ENDDO
351 IF (fac /= 2) THEN
352 WRITE(iout,*) 'ERROR IN ADVANCING CRACK. NO CUT EDGES'
354 ENDIF
355 crklen(i) = sqrt((xin(2,i) - xin(1,i))**2 + (yin(2,i) - yin(1,i))**2)
356 ENDDO
357
358 RETURN