34 . NEL ,NFT ,ILAY ,NLAY ,IXTG ,
35 . ELCUTC ,ELCRKINI ,IEL_CRKTG ,INOD_CRK ,IAD_CRKTG ,
36 . NODENR ,DIR1 ,DIR2 ,NODEDGE ,CRKNODIAD ,
37 . KNOD2ELC ,CRKEDGE ,XEDGE3N ,NGL ,AREA ,
38 . XL2 ,XL3 ,YL2 ,YL3 )
48#include "implicit_f.inc"
53#include "com_xfem1.inc"
59 INTEGER ,NFT,ILAY,NLAY
60 INTEGER IXTG(NIXTG,*),IEL_CRKTG(*),NGL(NEL),
61 . INOD_CRK(*),NODENR(*),IAD_CRKTG(3,*),ELCRKINI(NLAY,*),
62 . ELCUTC(2,*),NODEDGE(2,*),CRKNODIAD(*),KNOD2ELC(*),XEDGE3N(3,*)
63 my_real,
DIMENSION(NEL) :: AREA,XL2,YL2,XL3,YL3
64 my_real,
DIMENSION(NLAY,NEL) :: dir1,dir2
65 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
69 INTEGER ,J,K,ILEV,IR,P1,,IED,IED1,IED2,PP1,PP2,PP3,FAC,
70 . icrk,laycut,newcrk,elcrk,elcrktg,iedge,icut,sigbeta,itri,nm,np,
71 . nx1,nx2,nx3,nod1,nod2,ie1,ie2,ifi1,ifi2,ie10,ie20,iad1,iad2,iad3
72 INTEGER JCT(NEL),EDGEL(3,NEL),IADC(3),ISIGN(3),
73 . DD(3),D(6),DX(6),INV(2),N(3),NN(3),IENR0(3),IENR(3),IFI(2)
75 my_real,
DIMENSION(NEL) :: xl1,yl1
76 my_real,
DIMENSION(2,NEL) :: xin,yin
77 my_real,
DIMENSION(3,NEL) :: xxl,yyl,len,fit
78 my_real beta0(3,nel),xn(3),yn(3),zn(3),xmi(2),ymi(2)
79 my_real beta,xint,yint,fi,bmin,bmax,m12,mm,cross1,cross12,
80 . dir11,dir22,x1,y1,x2,y2,x3,y3,area1,area2,area3
85 parameter(bmin = 0.01, bmax = 0.99)
90 IF (elcrkini(ilay,i) == -1)
THEN
95 IF (newcrk == 0)
RETURN
108 xin(1,i) = zero ! first inters point in local skew
128 len(1,i) = (xl2(i)-xl1(i))*(xl2(i)-xl1(i))
129 . + (yl2(i)-yl1(i))*(yl2(i)-yl1(i))
130 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))
131 . + (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
132 len(3,i) = (xl1(i)-xl3(i))*(xl1(i)-xl3(i))
133 . + (yl1(i)-yl3(i))*(yl1(i)-yl3(i))
142 dir11 = -dir2(ilay,i)
145 IF (dir11 == zero)
THEN
149 elcrktg = iel_crktg(i+nft)
150 elcrk = elcrktg + ecrkxfec
151 iedge = xedge3n(k,elcrktg)
152 nod1 = nodedge(1,iedge)
153 nod2 = nodedge(2,iedge)
154 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
157 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
162 IF (xxl(p1,i) == xxl(p2,i))
GOTO 140
163 m12 = xxl(p2,i)-xxl(p1,i)
164 m12 = (yyl(p2,i)-yyl(p1,i))/m12
166 yint = yyl(p1,i) - m12*xxl(p1,i)
167 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
168 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
170 IF(cross12 > zero)
GOTO 140
172 cross1 = (xxl(p1,i) - xint)**2
173 beta = sqrt(cross1 / len(k,i))
175 beta =
min(beta, bmax)
185 ELSEIF(dir22 == zero)
THEN
189 elcrktg = iel_crktg(i+nft)
190 elcrk = elcrktg + ecrkxfec
191 iedge = xedge3n(k,elcrktg)
192 nod1 = nodedge(1,iedge)
193 nod2 = nodedge(2,iedge)
194 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
197 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
202 IF (yyl(p1,i) == yyl(p2,i))
GOTO 150
203 m12 = yyl(p2,i)-yyl(p1,i)
204 m12 = (xxl(p2,i)-xxl(p1,i))/m12
206 xint = xxl(p1,i) - m12*yyl(p1,i)
207 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
208 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
210 IF (cross12 > zero)
GOTO 150
213 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
214 beta = sqrt(cross1 / len(k,i))
215 beta =
max(beta, bmin)
216 beta =
min(beta, bmax)
226 ELSEIF (dir11 /= zero .AND. dir22 /= zero)
THEN
230 elcrktg = iel_crktg(i+nft)
231 elcrk = elcrktg + ecrkxfec
232 iedge = xedge3n(k,elcrktg)
233 nod1 = nodedge(1,iedge)
234 nod2 = nodedge(2,iedge)
235 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
238 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
243 IF (xxl(p1,i) == xxl(p2,i))
THEN
247 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
248 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
250 IF (cross12 > zero)
GOTO 160
253 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
254 beta = sqrt(cross1 / len(k,i))
255 beta =
max(beta, bmin)
256 beta =
min(beta, bmax)
265 m12 = xxl(p2,i)-xxl(p1,i)
266 m12 = (yyl(p2,i)-yyl(p1,i))/m12
267 IF (mm == m12)
GOTO 160 ! no inters(parallel to dir 2)
268 xint = (yyl(p1,i) - m12*xxl(p1,i))/(mm - m12)
270 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
271 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
273 IF (cross12 > zero)
GOTO 160
276 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
277 beta = sqrt(cross1 / len(k,i))
278 beta =
max(beta, bmin)
279 beta =
min(beta, bmax)
299 IF(edgel(k,i)==1.or.edgel(k,i)==2) fac=fac+1
302 WRITE(iout,*)
'ERROR IN INITIATION CRACK.NO CUT EDGES'
309 elcrktg = iel_crktg(i+nft)
310 elcrk = elcrktg + ecrkxfec
316 IF (ied == 1 .or. ied == 2)
THEN
317 crkedge(ilay)%IEDGETG(k,elcrktg) = ied
340 xmi(ied) = half*(xn(p1)+xn(p2))
341 ymi(ied) = half*(yn(p1)+yn(p2))
347 CALL lsint4(xmi(1),ymi(1),xmi(2),ymi(2),xn(k),yn(k),fi)
348 IF (fit(k,i)==zero) fit(k,i) = fi
354 elcrktg = iel_crktg(i+nft)
355 elcrk = elcrktg + ecrkxfec
359 IF (ied == 1 .or. ied == 2)
THEN
360 iedge = xedge3n(k,elcrktg)
362 icut = crkedge(ilay)%ICUTEDGE(iedge)
366 crkedge(ilay)%ICUTEDGE(iedge) = 2
367 crkedge(ilay)%RATIO(iedge) = beta0(k,i)
377 elcrktg = iel_crktg(i+nft)
378 elcrk = elcrktg + ecrkxfec
380 iadc(1) = iad_crktg(1,elcrktg)
381 iadc(2) = iad_crktg(2,elcrktg)
382 iadc(3) = iad_crktg(3,elcrktg)
388 nn(1) = inod_crk(n(1))
389 nn(2) = inod_crk(n(2))
390 nn(3) = inod_crk(n(3))
393 numelcrk = numelcrk + 1
395 isign(1) = int(sign(one,fit(1,i)))
396 isign(2) = int(sign(one,fit(2,i)))
397 isign(3) = int(sign(one,fit(3,i)))
399 IF (fit(1,i) == zero) isign(1) = 0
400 IF (fit(2,i) == zero) isign(2) = 0
401 IF (fit(3,i) == zero) isign(3) = 0
404 icrk =
crkshell(pp1)%CRKSHELLID(elcrk)
409 IF (isign(k) > 0)
THEN
412 ELSEIF (isign(k) < 0)
THEN
419 ELSEIF (itri == 2)
THEN
431 ienr0(1) = crknodiad(iadc(1))
432 ienr0(2) = crknodiad(iadc(2))
433 ienr0(3) = crknodiad(iadc(3))
435 ienr(1) = ienr0(1) + knod2elc(nn(1))*(ilay-1)
436 ienr(2) = ienr0(2) + knod2elc(nn(2))*(ilay-1)
437 ienr(3) = ienr0(3) + knod2elc(nn(3))*(ilay-1)
443 iedge = xedge3n(k,elcrktg)
444 nod1 = nodedge(1,iedge)
445 nod2 = nodedge(2,iedge)
448 ie10 = crkedge(ilay)%EDGEENR(1,iedge)
449 ie20 = crkedge(ilay)%EDGEENR(2,iedge)
450 IF (nod1 == n(k) .and. nod2 == n(dd(k)))
THEN
456 ELSE IF (nod2 == n(k) .and. nod1 == n(dd(k)))
THEN
463 crkedge(ilay)%EDGEENR(1,iedge) =
max(ie1,ie10)
464 crkedge(ilay)%EDGEENR(2,iedge) =
max(ie2,ie20)
465 IF (crkedge(ilay)%EDGEICRK(iedge) == 0)
466 . crkedge(ilay)%EDGEICRK(iedge) = icrk
470 crkedge(ilay)%LAYCUT(elcrk) = -1
475 iedge = xedge3n(k,elcrktg)
477 crkedge(ilay)%EDGETIP(1,iedge) = ied
478 crkedge(ilay)%EDGETIP(2,iedge) =
479 . crkedge(ilay)%EDGETIP(2,iedge) + 1
491 crklvset(ilev)%ENR0(1,iadc(1)) = -ienr(1)
492 crklvset(ilev)%ENR0(1,iadc(2)) = -ienr(2)
493 crklvset(ilev)%ENR0(1,iadc(3)) = -ienr(3)
495 IF (isign(1) > 0)
crklvset(ilev)%ENR0(1,iadc(1)) = 0
496 IF (isign(2) > 0)
crklvset(ilev)%ENR0(1,iadc(2)) = 0
497 IF (isign(3) > 0)
crklvset(ilev)%ENR0(1,iadc(3)) = 0
503 crklvset(ilev)%ENR0(1,iadc(1)) = -ienr(1)
504 crklvset(ilev)%ENR0(1,iadc(2)) = -ienr(2)
505 crklvset(ilev)%ENR0(1,iadc(3)) = -ienr(3)
507 IF (isign(1) < 0)
crklvset(ilev)%ENR0(1,iadc(1)) = 0
508 IF (isign(2) < 0)
crklvset(ilev)%ENR0
509 IF (isign(3) < 0)
crklvset(ilev)%ENR0(1,iadc(3)) = 0
514 ie2 = xedge3n(nx3,elcrktg)
515 IF (crkedge(ilay)%ICUTEDGE(ie2) > 1)
THEN
523 crklvset(pp2)%ENR0(1,iad1) = -crknodiad(iad1
528 ied = crkedge(ilay)%IEDGETG(nx1,elcrktg)
531 ied = crkedge(ilay)%IEDGETG(nx3,elcrktg)
534 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
535 area1 = area1 / area(i)
540 area2 = half*abs((x1-x3
541 area2 = area2 / area(i)
542 area3 = one - area1 - area2
548 ELSEIF (itri > 0)
THEN
550 ie1 = xedge3n(nx1,elcrktg)
551 IF (crkedge(ilay)%ICUTEDGE(ie1) > 1)
THEN
558 crklvset(pp1)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
561 ied1= crkedge(ilay)%IEDGETG(nx1,elcrktg)
562 ied2= crkedge(ilay)%IEDGETG(nx3,elcrktg)
569 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
570 area1 = area1 / area(i)
577 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
578 area2 = area2 / area(i)
579 area3 = one - area1 - area2
591 nlevset = nlevset + 1