35 . NEL ,NFT ,ILAY ,NLAY ,IXTG ,
36 . ELCUTC ,ELCRKINI ,IEL_CRKTG ,INOD_CRK ,IAD_CRKTG ,
37 . NODENR ,DIR1 ,DIR2 ,NODEDGE ,CRKNODIAD ,
38 . KNOD2ELC ,CRKEDGE ,XEDGE3N ,NGL ,AREA ,
39 . XL2 ,XL3 ,YL2 ,YL3 )
46 use element_mod ,
only : nixtg
50#include "implicit_f.inc"
55#include "com_xfem1.inc"
61 INTEGER NEL,NFT,ILAY,NLAY
62 INTEGER (,*),IEL_CRKTG(*),NGL(),
63 . (*),NODENR(*),IAD_CRKTG(3,*),ELCRKINI(NLAY,*),
64 . ELCUTC(2,*),(2,*),CRKNODIAD(*),KNOD2ELC(
65DIMENSION(NEL) :: AREA,XL2,YL2,XL3,YL3
66 my_real,
DIMENSION(NLAY,NEL) :: dir1,dir2
67 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
71 INTEGER I,K,ILEV,IR,P1,P2,IED,IED1,IED2,PP1,PP2,PP3,FAC,
72 . icrk,newcrk,elcrk,elcrktg,iedge,icut,sigbeta,itri,nm,np,
73 . nx1,nx2,nx3,nod1,nod2,ie1,ie2,ifi1,ifi2,ie10,ie20
74 INTEGER JCT(NEL),EDGEL(3,NEL),IADC(3),ISIGN(3),
75 . DD(3),D(6),DX(6),N(3),NN(3),IENR0(3),IENR(3)
77 my_real,
DIMENSION(NEL) :: xl1,yl1
78 my_real,
DIMENSION(2,NEL) :: xin,yin
79 my_real
DIMENSION(3,NEL) :: xxl,yyl,len,fit
80 my_real beta0(3,nel),xn(3),yn(3),xmi(2),ymi(2)
81 my_real beta,xint,yint,fi,bmin,bmax,m12,mm,cross1,cross12,
87 parameter(bmin = 0.01, bmax = 0.99)
92 IF (elcrkini(ilay,i) == -1)
THEN
97 IF (newcrk == 0)
RETURN
99 pp1 = nxel*(ilay-1) + 1
130 len(1,i) = (xl2(i)-xl1(i))*(xl2(i)-xl1(i))
131 . + (yl2(i)-yl1(i))*(yl2(i)-yl1(i))
132 len(2,i) = (xl3(i)-xl2(i))*(xl3(i)-xl2(i))
133 . + (yl3(i)-yl2(i))*(yl3(i)-yl2(i))
134 len(3,i) = (xl1(i)-xl3(i))*(xl1(i)-xl3(i))
135 . + (yl1(i)-yl3(i))*(yl1(i)-yl3(i))
144 dir11 = -dir2(ilay,i)
147 IF (dir11 == zero)
THEN
151 elcrktg = iel_crktg(i+nft)
152 elcrk = elcrktg + ecrkxfec
153 iedge = xedge3n(k,elcrktg)
154 nod1 = nodedge(1,iedge)
155 nod2 = nodedge(2,iedge)
156 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
159 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
164 IF (xxl(p1,i) == xxl(p2,i))
GOTO 140
165 m12 = xxl(p2,i)-xxl(p1,i)
166 m12 = (yyl(p2,i)-yyl(p1,i))/m12
168 yint = yyl(p1,i) - m12*xxl(p1,i)
169 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
170 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
172 IF(cross12 > zero)
GOTO 140
174 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
175 beta = sqrt(cross1 / len(k,i))
176 beta =
max(beta, bmin)
177 beta =
min(beta, bmax)
187 ELSEIF(dir22 == zero)
THEN
191 elcrktg = iel_crktg(i+nft)
192 elcrk = elcrktg + ecrkxfec
193 iedge = xedge3n(k,elcrktg)
194 nod1 = nodedge(1,iedge)
195 nod2 = nodedge(2,iedge)
196 IF (nod1 == ixtg(k+1,i) .and. nod2 == ixtg(dd(k)+1,i))
THEN
199 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
204 IF (yyl(p1,i) == yyl(p2,i))
GOTO 150
205 m12 = yyl(p2,i)-yyl(p1,i)
206 m12 = (xxl(p2,i)-xxl(p1,i))/m12
208 xint = xxl(p1,i) - m12*yyl(p1,i)
209 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
210 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
212 IF (cross12 > zero)
GOTO 150
215 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
216 beta = sqrt(cross1 / len(k,i))
217 beta =
max(beta, bmin)
218 beta =
min(beta, bmax)
228 ELSEIF (dir11 /= zero .AND. dir22 /= 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 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))
THEN
245 IF (xxl(p1,i) == xxl(p2,i))
THEN
249 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
250 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
252 IF (cross12 > zero)
GOTO 160
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)
267 m12 = xxl(p2,i)-xxl(p1,i)
268 m12 = (yyl(p2,i)-yyl(p1,i))/m12
269 IF (mm == m12)
GOTO 160
270 xint = (yyl(p1,i) - m12*xxl(p1,i))/(mm - m12)
272 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
273 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
275 IF (cross12 > zero)
GOTO 160
278 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
279 beta = sqrt(cross1 / len(k,i))
280 beta =
max(beta, bmin)
281 beta =
min(beta, bmax)
301 IF(edgel(k,i)==1.or.edgel(k,i)==2) fac=fac+1
304 WRITE(iout,*)
'ERROR IN INITIATION CRACK.NO CUT EDGES'
311 elcrktg = iel_crktg(i+nft)
312 elcrk = elcrktg + ecrkxfec
318 IF (ied == 1 .or. ied == 2)
THEN
319 crkedge(ilay)%IEDGETG(k,elcrktg) = ied
342 xmi(ied) = half*(xn(p1)+xn(p2))
343 ymi(ied) = half*(yn(p1)+yn(p2))
349 CALL lsint4(xmi(1),ymi(1),xmi(2),ymi(2),xn(k),yn(k),fi)
350 IF (fit(k,i)==zero) fit(k,i) = fi
356 elcrktg = iel_crktg(i+nft)
357 elcrk = elcrktg + ecrkxfec
361 IF (ied == 1 .or. ied == 2)
THEN
362 iedge = xedge3n(k,elcrktg)
366 crkedge(ilay)%ICUTEDGE(iedge) = 3
368 crkedge(ilay)%ICUTEDGE(iedge) = 2
369 crkedge(ilay)%RATIO(iedge) = beta0(k,i)
379 elcrktg = iel_crktg(i+nft)
380 elcrk = elcrktg + ecrkxfec
382 iadc(1) = iad_crktg(1,elcrktg)
383 iadc(2) = iad_crktg(2,elcrktg)
384 iadc(3) = iad_crktg(3,elcrktg)
390 nn(1) = inod_crk(n(1))
391 nn(2) = inod_crk(n(2))
392 nn(3) = inod_crk(n(3))
395 numelcrk = numelcrk + 1
397 isign(1) = int(sign(one,fit(1,i)))
398 isign(2) = int(sign(one,fit(2,i)))
399 isign(3) = int(sign(one,fit(3,i)))
401 IF (fit(1,i) == zero) isign(1) = 0
402 IF (fit(2,i) == zero) isign(2) = 0
403 IF (fit(3,i) == zero) isign(3) = 0
406 icrk =
crkshell(pp1)%CRKSHELLID(elcrk)
411 IF (isign(k) > 0)
THEN
414 ELSEIF (isign(k) < 0)
THEN
421 ELSEIF (itri == 2)
THEN
433 ienr0(1) = crknodiad(iadc(1))
434 ienr0(2) = crknodiad(iadc(2))
435 ienr0(3) = crknodiad(iadc(3))
437 ienr(1) = ienr0(1) + knod2elc(nn(1))*(ilay-1)
438 ienr(2) = ienr0(2) + knod2elc(nn(2))*(ilay-1)
439 ienr(3) = ienr0(3) + knod2elc(nn(3))*(ilay-1)
445 iedge = xedge3n(k,elcrktg)
446 nod1 = nodedge(1,iedge)
447 nod2 = nodedge(2,iedge)
450 ie10 = crkedge(ilay)%EDGEENR(1,iedge)
451 ie20 = crkedge(ilay)%EDGEENR(2,iedge)
452 IF (nod1 == n(k) .and. nod2 == n(dd(k)))
THEN
458 ELSE IF (nod2 == n(k) .and. nod1 == n(dd(k)))
THEN
465 crkedge(ilay)%EDGEENR(1,iedge) =
max(ie1,ie10)
466 crkedge(ilay)%EDGEENR(2,iedge) =
max(ie2,ie20)
467 IF (crkedge(ilay)%EDGEICRK(iedge) == 0)
468 . crkedge(ilay)%EDGEICRK(iedge) = icrk
472 crkedge(ilay)%LAYCUT(elcrk) = -1
477 iedge = xedge3n(k,elcrktg)
479 crkedge(ilay)%EDGETIP(1,iedge) = ied
480 crkedge(ilay)%EDGETIP(2,iedge) =
481 . crkedge(ilay)%EDGETIP(2,iedge) + 1
493 crklvset(ilev)%ENR0(1,iadc(1)) = -ienr(1)
494 crklvset(ilev)%ENR0(1,iadc(2)) = -ienr(2)
495 crklvset(ilev)%ENR0(1,iadc(3)) = -ienr(3)
497 IF (isign(1) > 0)
crklvset(ilev)%ENR0(1,iadc(1)) = 0
498 IF (isign(2) > 0)
crklvset(ilev)%ENR0(1,iadc(2)) = 0
499 IF (isign(3) > 0)
crklvset(ilev)%ENR0(1,iadc(3)) = 0
505 crklvset(ilev)%ENR0(1,iadc(1)) = -ienr(1)
506 crklvset(ilev)%ENR0(1,iadc(2)) = -ienr(2)
507 crklvset(ilev)%ENR0(1,iadc(3)) = -ienr(3)
509 IF (isign(1) < 0)
crklvset(ilev)%ENR0(1,iadc(1)) = 0
510 IF (isign(2) < 0)
crklvset(ilev)%ENR0(1,iadc(2)) = 0
511 IF (isign(3) < 0)
crklvset(ilev)%ENR0(1,iadc(3)) = 0
516 ie2 = xedge3n(nx3,elcrktg)
517 IF (crkedge(ilay)%ICUTEDGE(ie2) > 1)
THEN
525 crklvset(pp2)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
530 ied = crkedge(ilay)%IEDGETG(nx1,elcrktg)
533 ied = crkedge(ilay)%IEDGETG(nx3,elcrktg)
536 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
537 area1 = area1 / area(i)
542 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
543 area2 = area2 / area(i)
544 area3 = one - area1 - area2
550 ELSEIF (itri > 0)
THEN
552 ie1 = xedge3n(nx1,elcrktg)
553 IF (crkedge(ilay)%ICUTEDGE(ie1) > 1)
THEN
560 crklvset(pp1)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
563 ied1= crkedge(ilay)%IEDGETG(nx1,elcrktg)
564 ied2= crkedge(ilay)%IEDGETG(nx3,elcrktg)
571 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
572 area1 = area1 / area(i)
580 area2 = area2 / area(i)
581 area3 = one - area1 - area2
593 nlevset = nlevset + 1