37 . XFEM_STR ,NEL ,NFT ,IXC ,ELCUTC ,
38 . ILAY ,NLAY ,IEL_CRK ,INOD_CRK ,
39 . IADC_CRK ,NODENR ,ELCRKINI ,DIR1 ,DIR2 ,
40 . NODEDGE ,CRKNODIAD ,KNOD2ELC ,CRKEDGE ,A_I ,
41 . XL2 ,XL3 ,XL4 ,YL2 ,YL3 ,
50 use element_mod ,
only : nixc
54#include "implicit_f.inc"
59#include "com_xfem1.inc"
63 INTEGER NEL,NFT,IXC(NIXC,*),ILAY,NLAY,NGL(NEL),IEL_CRK(*),
64 . INOD_CRK(*),NODENR(*),IADC_CRK(4,*),ELCRKINI(NLAY,NEL),
65 . ELCUTC(2,*),NODEDGE(2,*),CRKNODIAD(*),KNOD2ELC(*),XEDGE4N(4,*)
66 my_real DIR1(NLAY,NEL),DIR2(NLAY,NEL),A_I(NEL),
67 . XL2(NEL),YL2(NEL),XL3(NEL),YL3(NEL),XL4(NEL),YL4(NEL)
69 TYPE (ELBUF_STRUCT_),
DIMENSION(NXEL) :: XFEM_STR
70 TYPE (XFEM_EDGE_) ,
DIMENSION(*) :: CRKEDGE
74 INTEGER I, K, II, R, IR, P1, P2, PP1, PP2, PP3, NEWCRK, IED, OK,
75 . icrk,elcrk,nx1,nx2,nx3,nx4,nm,np,fac,ifi1,ifi2,iedge,
76 . icut,sigbeta,nod1,nod2,ie1,ie2,ie10,ie20,itri,iad1,iad2,iad3,iad4
78 INTEGER ECUT(2,NEL),EDGEL(4,NEL),(4,NEL),dd(4),d(8),KPERM(8),
79 . N(4),NN(4),IADC(4),IENR(4),ISIGN(4)
80 INTEGER ,
DIMENSION(NEL) :: JCT,ELFISS,TIP
82 my_real,
DIMENSION(2) :: XMI,YMI
83 my_real,
DIMENSION(2,NEL) :: XIN,YIN
84 my_real,
DIMENSION(4,NEL) :: len,xxl,yyl,fit,beta0
86 . xint,yint,fi,cross,acd,bcd,dlx,dly,m12,mm,xint0,yint0,beta,
87 . bmin,bmax,dir11,dir22,x1,y1,x2,y2,x3,y3,x4,y4,area1,area2,area3
89 DATA d/1,2,2,3,4,3,1,4/
91 DATA kperm/1,2,3,4,1,2,3,4/
92 parameter(bmin = 0.01, bmax = 0.99)
97 IF (elcrkini(ilay,i) == 1)
THEN
102 IF (newcrk == 0)
RETURN
131 len(1,i) = xl2(i)*xl2(i) + yl2(i)*yl2(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) = (xl4(i)-xl3(i))*(xl4(i)-xl3(i))+
135 . (yl4(i)-yl3(i))*(yl4(i)-yl3(i))
136 len(4,i) = xl4(i)*xl4(i) + yl4(i)*yl4(i)
143 elcrk = iel_crk(i+nft)
148 iedge = xedge4n(k,elcrk)
150 icut = crkedge(ilay)%ICUTEDGE(iedge)
152 nod1 = nodedge(1,iedge)
153 nod2 = nodedge(2,iedge)
154 IF (nod1 == ixc(k+1,i) .and. nod2 == ixc(dd(k)+1,i))
THEN
157 ELSE IF (nod2 == ixc(k+1,i) .and. nod1 == ixc(dd(k)+1,i))
THEN
170 beta = crkedge(ilay)%RATIO(iedge)
171 xin(1,i) = xxl(p1,i) + beta*(xxl(p2,i) - xxl(p1,i))
172 yin(1,i) = yyl(p1,i) + beta*(yyl(p2,i) - yyl(p1,i))
174 elfiss(i) = crkedge(ilay)%EDGEICRK(iedge)
175 ienr0(p1,i) = crkedge(ilay)%EDGEENR(1,iedge)
176 ienr0(p2,i) = crkedge(ilay)%EDGEENR(2,iedge)
178 iedge = xedge4n(ied,elcrk)
179 tip(i) = crkedge(ilay)%EDGETIP(1,iedge)
181 WRITE(iout,*)
'ERROR IN ADVANCING CRACK --- CHECK CRACK TIP'
191 elcrk = iel_crk(i+nft)
198 IF (dir11 == zero)
THEN
200 r = kperm(ecut(1,i) + k)
201 iedge = xedge4n(r,elcrk)
202 nod1 = nodedge(1,iedge)
203 nod2 = nodedge(2,iedge)
204 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))
THEN
207 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
211 dlx = xxl(p2,i) - xxl(p1,i)
212 IF (dlx /= zero)
THEN
213 dly = yyl(p2,i) - yyl(p1,i)
216 yint = yyl(p1,i) + m12*(xint-xxl(p1,i))
218 . (yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
219 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
220 beta = sqrt(cross / len(r,i))
221 IF (beta > bmax .OR. beta < bmin)
THEN
222 beta =
max(beta, bmin)
223 beta =
min(beta, bmax)
224 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
237 ELSEIF (dir22 == zero)
THEN
239 r = kperm(ecut(1,i) + k)
240 iedge = xedge4n(r,elcrk)
241 nod1 = nodedge(1,iedge)
242 nod2 = nodedge(2,iedge)
243 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))
THEN
246 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
250 dly = yyl(p2,i) - yyl(p1,i)
251 IF (dly /= zero)
THEN
252 dlx = xxl(p2,i) - xxl(p1,i)
255 xint = xxl(p1,i) + m12*(yint-yyl(p1,i))
256 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero .and.
258 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
259 beta = sqrt(cross / len(r,i))
260 IF (beta > bmax .OR. beta < bmin)
THEN
261 beta =
max(beta, bmin)
262 beta =
min(beta, bmax)
263 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
276 ELSEIF (dir11 /= zero .and. dir22 /= zero)
THEN
278 r = kperm(ecut(1,i) + k)
279 iedge = xedge4n(r,elcrk)
280 nod1 = nodedge(1,iedge)
281 nod2 = nodedge(2,iedge)
282 IF (nod1 == ixc(r+1,i) .and. nod2 == ixc(dd(r)+1,i))
THEN
285 ELSE IF (nod2 == ixc(r+1,i).and.nod1 == ixc(dd(r)+1,i))
THEN
290 dlx = xxl(p2,i) - xxl(p1,i)
291 dly = yyl(p2,i) - yyl(p1,i)
293 IF (dlx == zero)
THEN
295 yint = yint0 + mm*(xint-xint0)
296 IF ((yint-yyl(p1,i))*(yint-yyl(p2,i)) <= zero)
THEN
297 cross = (yyl(p1,i) - yint)**2
298 beta = sqrt(cross / len(r,i))
299 IF (beta > bmax .OR. beta < bmin)
THEN
300 beta =
max(beta, bmin)
301 beta =
min(beta, bmax)
302 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
311 ELSEIF (dly == zero)
THEN
313 xint = xint0 + (yint0-yyl(p1,i)) / mm
314 IF ((xint-xxl(p1,i))*(xint-xxl(p2,i)) <= zero)
THEN
315 cross = (xxl(p1,i) - xint)**2
316 beta = sqrt(cross / len(r,i))
317 IF (beta > bmax .OR. beta < bmin)
THEN
318 beta =
max(beta, bmin)
319 beta =
min(beta, bmax)
320 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1
332 xint = (yint0-yyl(p1,i) + m12*xxl(p1,i) - mm*xint0)/(m12-mm)
333 yint = yint0 + mm*(xint-xint0)
334 acd = (yint-yyl(p1,i))*(xint0 - xxl(p1,i))
335 . - (xint-xxl(p1,i))*(yint0 - yyl(p1,i))
336 bcd = (yint-yyl(p2,i))*(xint0 - xxl(p2,i))
337 . - (xint-xxl(p2,i))*(yint0 - yyl(p2,i))
338 IF (acd*bcd <= zero)
THEN
339 cross = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
340 beta = sqrt(cross / len(r,i))
341 IF (beta > bmax .OR. beta < bmin)
THEN
342 beta =
max(beta, bmin)
343 beta =
min(beta, bmax)
344 xint = xxl(p1,i) + beta*(xxl(p2,i)-xxl(p1,i))
345 yint = yyl(p1,i) + beta*(yyl(p2,i)-yyl(p1,i))
366 IF (edgel(r,i)==1 .or. edgel(r,i)==2) fac=fac+1
369 WRITE(iout,*)
'ERROR IN ADVANCING CRACK. NO CUT EDGES'
376 elcrk = iel_crk(i+nft)
379 crkedge(ilay)%IEDGEC(k,elcrk) = ied
397 xmi(ied) = half*(xxl(p1,i)+xxl(p2,i))
398 ymi(ied) = half*(yyl(p1,i)+yyl(p2,i))
403 CALL lsint4(xmi(1),ymi(1),xmi(2),ymi(2),xxl(k,i),yyl(k,i),fi)
404 IF (fit(k,i) == zero) fit(k,i)=fi
412 elcrk = iel_crk(i+nft)
415 iedge = xedge4n(k,elcrk)
416 icut = crkedge(ilay)%ICUTEDGE(iedge)
418 crkedge(ilay)%ICUTEDGE(iedge) = 3
420 crkedge(ilay)%ICUTEDGE(iedge) = 2
421 crkedge(ilay)%RATIO(iedge) = beta0(k,i)
429 elcrk = iel_crk(i+nft)
431 numelcrk = numelcrk + 1
433 iadc(1) = iadc_crk(1,elcrk)
434 iadc(2) = iadc_crk(2,elcrk)
435 iadc(3) = iadc_crk(3,elcrk)
436 iadc(4) = iadc_crk(4,elcrk)
450 nn(1) = inod_crk(n(1))
451 nn(2) = inod_crk(n(2))
452 nn(3) = inod_crk(n(3))
453 nn(4) = inod_crk(n(4))
457 isign(1) = int(sign(one,fit(1,i)))
458 isign(2) = int(sign(one,fit(2,i)))
459 isign(3) = int(sign(one,fit(3,i)))
460 isign(4) = int(sign(one,fit(4,i)))
462 IF (fit(1,i) == zero) isign(1) = 0
463 IF (fit(2,i) == zero) isign(2) = 0
464 IF (fit(3,i) == zero) isign(3) = 0
465 IF (fit(4,i) == zero) isign(4) = 0
470 IF (ienr0(k,i) == 0)
THEN
471 ienr(k) = crknodiad(iadc(k)) + knod2elc(nn(k))*(ilay-1)
479 iedge = xedge4n(k,elcrk)
480 nod1 = nodedge(1,iedge)
481 nod2 = nodedge(2,iedge)
482 ie10 = crkedge(ilay)%EDGEENR(1,iedge)
483 ie20 = crkedge(ilay)%EDGEENR(2,iedge)
484 IF (nod1 == ixc(k+1,i) .and. nod2 == ixc(dd(k)+1,i))
THEN
490 ELSE IF (nod2 == ixc(k+1,i) .and. nod1 == ixc(dd(k)+1,i))
THEN
497 crkedge(ilay)%EDGEENR(1,iedge) =
max(ie1,ie10)
498 crkedge(ilay)%EDGEENR(2,iedge) =
max(ie2,ie20)
499 IF (crkedge(ilay)%EDGEICRK(iedge) == 0)
500 . crkedge(ilay)%EDGEICRK(iedge) = icrk
508 iedge = xedge4n(k,elcrk)
509 crkedge(ilay)%EDGETIP(1,iedge) = tip(i)
510 crkedge(ilay)%EDGETIP(2,iedge) =
511 . crkedge(ilay)%EDGETIP(2,iedge) + 1
513 IF (isign(k) > 0)
THEN
516 ELSEIF (isign(k) < 0)
THEN
524 ELSEIF (itri == 3)
THEN
527 ELSEIF (itri == 2)
THEN
529 IF (np > 1 .and. isign(np-1) > 0)
THEN
544 crkedge(ilay)%LAYCUT(elcrk) = 1
555 crklvset(pp1)%ENR0(1,iadc(1)) = -ienr(1)
556 crklvset(pp1)%ENR0(1,iadc(2)) = -ienr(2)
557 crklvset(pp1)%ENR0(1,iadc(3)) = -ienr(3)
558 crklvset(pp1)%ENR0(1,iadc(4)) = -ienr(4)
560 IF (isign(1) > 0)
crklvset(pp1)%ENR0(1,iadc(1)) = 0
561 IF (isign(2) > 0)
crklvset(pp1)%ENR0(1,iadc(2)) = 0
562 IF (isign(3) > 0)
crklvset(pp1)%ENR0(1,iadc(3)) = 0
563 IF (isign(4) > 0)
crklvset(pp1)%ENR0(1,iadc(4)) = 0
567 crklvset(pp2)%ENR0(1,iadc(1)) = -ienr(1)
568 crklvset(pp2)%ENR0(1,iadc(2)) = -ienr(2)
569 crklvset(pp2)%ENR0(1,iadc(3)) = -ienr(3)
570 crklvset(pp2)%ENR0(1,iadc(4)) = -ienr(4)
572 IF (isign(1) < 0)
crklvset(pp2)%ENR0(1,iadc(1)) = 0
573 IF (isign(2) < 0)
crklvset(pp2)%ENR0(1,iadc(2)) = 0
574 IF (isign(3) < 0)
crklvset(pp2)%ENR0(1,iadc(3)) = 0
575 IF (isign(4) < 0)
crklvset(pp2)%ENR0(1,iadc(4)) = 0
596 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
598 area1 = area1 * a_i(i)
602 xfem_str(3)%GBUF%OFF(i) = zero
604 xfem_str(3)%BUFLY(ilay)%LBUF(1,1,1)%OFF(i) = zero
606 ELSEIF (itri < 0)
THEN
607 ie1 = xedge4n(nx2,elcrk)
608 ie2 = xedge4n(nx4,elcrk)
610 IF (crkedge(ilay)%ICUTEDGE(ie2) > 1)
THEN
622 crklvset(pp2)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
625 ied = crkedge(ilay)%IEDGEC(nx4,elcrk)
632 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
634 ied = crkedge(ilay)%IEDGEC(nx1,elcrk)
639 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
641 area1 = area1 * a_i(i)
642 area2 = area2 * a_i(i)
643 area3 = one - area1 - area2
644 ELSEIF (crkedge(ilay)%ICUTEDGE(ie1) > 1)
THEN
645 print*,
' IMPOSSIBLE CASE'
648 ELSEIF (itri > 0)
THEN
649 ie1 = xedge4n(nx1,elcrk)
650 ie2 = xedge4n(nx4,elcrk)
652 IF (crkedge(ilay)%ICUTEDGE(ie1) > 1)
THEN
663 crklvset(pp1)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
665 ied = crkedge(ilay)%IEDGEC(nx1,elcrk)
672 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
674 ied = crkedge(ilay)%IEDGEC(nx4,elcrk)
679 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
681 area1 = area1 * a_i(i)
682 area2 = area2 * a_i(i)
683 area3 = one - area1 - area2
684 ELSEIF (crkedge(ilay)%ICUTEDGE(ie2) > 1)
THEN
685 print*,
' IMPOSSIBLE CASE'
693 IF (area3 < zero .or. area1 > one .or. area2 > one .or. area3 > one )
THEN
694 print*,
'ERROR : XFEM PHANTOM ELEMENT AREA: ELCRK=',elcrk
subroutine czforc3(timers, elbuf_str, jft, jlt, nft, npt, itab, mtn, ipri, ithk, neltst, istrain, ipla, dt1, dt2t, pm, geo, partsav, ixc, ityptst, bufmat, tf, npf, iadc, failwave, x, dr, v, vr, f, m, stifn, stifr, fsky, tani, indxof, ismstr, group_param, ipartc, thke, nvc, iofc, ihbe, f11, f12, f13, f14, f21, f22, f23, f24, f31, f32, f33, f34, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, kfts, fzero, igeo, ipm, ifailure, itask, jthe, temp, fthe, fthesky, iexpan, gresav, grth, igrth, xedge4n, msc, dmelc, jsms, table, iparg, mat_elem, ixfem, knod2elc, sensors, elcutc, inod_crk, iel_crk, nodenr, iadc_crk, nodedge, crknodiad, condn, condnsky, stack, isubstack, xfem_str, crkedge, drape_sh4n, nel, nloc_dmg, indx_drape, igre, jtur, dt, ncycle, snpc, stf, glob_therm, idel7nok, userl_avail, maxfunc, sbufmat, ipart, lipart1)