39
40
41
42
43
45
46
47
48#include "implicit_f.inc"
49
50
51
52#include "com04_c.inc"
53#include "com_xfem1.inc"
54#include "comlock.inc"
55#include "units_c.inc"
56
57
58
59 INTEGER NEL,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(
63DIMENSION(NEL) ::
area,xl2,yl2,xl3,yl3
64 my_real,
DIMENSION(NLAY,NEL) :: dir1,dir2
65 TYPE (XFEM_EDGE_) , DIMENSION(*) :: CRKEDGE
66
67
68
69 INTEGER I,J,K,ILEV,IR,P1,P2,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)
74
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
81
82 DATA d/1,2,2,3,1,3/
83 DATA dd/2,3,1/
84 DATA dx/1,2,3,1,2,3/
85 parameter(bmin = 0.01, bmax = 0.99)
86
87 newcrk = 0
88 DO i=1,nel
89 jct(i) = 0
90 IF (elcrkini(ilay,i) == -1) THEN
91 newcrk = newcrk + 1
92 jct(newcrk) = i
93 ENDIF
94 ENDDO
95 IF (newcrk == 0) RETURN
96
97 pp1 = nxel*(ilay-1) + 1
98 pp2 = pp1 + 1
99 pp3 = pp1 + 2
100
101 DO i=1,nel
102 beta0(1:3,i) = zero
103
104 edgel(1,i)=0
105 edgel(2,i)=0
106 edgel(3,i)=0
107
108 xin(1,i) = zero
109 yin(1,i) = zero
110 xin(2,i) = zero
111 yin(2,i) = zero
112 ENDDO
113
114
115
116 DO i=1,nel
117 xl1(i) = zero
118 yl1(i) = zero
119 xxl(1,i) = xl1(i)
120 yyl(1,i) = yl1(i)
121 xxl(2,i) = xl2(i)
122 yyl(2,i) = yl2(i)
123 xxl(3,i) = xl3(i)
124 yyl(3,i) = yl3(i)
125 ENDDO
126
127 DO i=1,nel
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
133 . + (yl1(i)-yl3(i))*(yl1(i)-yl3(i))
134 ENDDO
135
136
137
138 DO ir=1,newcrk
139 i=jct(ir)
140 fac = 0
141
142 dir11 = -dir2(ilay,i)
143 dir22 = dir1(ilay,i)
144
145 IF (dir11 == zero) THEN
146 DO 140 k=1,3
147 xint = zero
148 yint = zero
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
155 p1 = k
156 p2 = dd(k)
157 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))THEN
158 p1 = dd(k)
159 p2 = k
160 ENDIF
161
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
165 xint = zero
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))
169
170 IF(cross12 > zero)GOTO 140
171 fac = fac + 1
172 cross1 = (xxl(p1,i) - xint)**2 + (yyl(p1,i) - yint)**2
173 beta = sqrt(cross1 / len(k,i))
174 beta =
max(beta, bmin)
175 beta =
min(beta, bmax)
176 beta0(k,i) = beta
177
178 xin(fac,i) = xint
179 yin(fac,i) = yint
180 edgel(k,i) = fac
181 IF(fac == 2)EXIT
182
183 140 CONTINUE
184
185 ELSEIF(dir22 == zero)THEN
186 DO 150 k=1,3
187 xint = zero
188 yint = zero
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
195 p1 = k
196 p2 = dd(k)
197 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))THEN
198 p1 = dd(k)
199 p2 = k
200 ENDIF
201
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
205 yint = zero
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))
209
210 IF (cross12 > zero) GOTO 150
211 fac = fac + 1
212
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)
217 beta0(k,i) = beta
218
219 xin(fac,i) = xint
220 yin(fac,i) = yint
221 edgel(k,i) = fac
222 IF(fac == 2)EXIT
223
224 150 CONTINUE
225
226 ELSEIF (dir11 /= zero .AND. dir22 /= zero)THEN
227 DO 160 k=1,3
228 xint = zero
229 yint = zero
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(ddTHEN
236 p1 = k
237 p2 = dd(k)
238 ELSEIF (nod2 == ixtg(k+1,i).and.nod1 == ixtg(dd(k)+1,i))THEN
239 p1 = dd(k)
240 p2 = k
241 ENDIF
242
243 IF (xxl(p1,i) == xxl(p2,i)) THEN
244 mm = dir22/dir11
245 xint = xxl(p1,i)
246 yint = mm*xint
247 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
248 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
249
250 IF (cross12 > zero) GOTO 160
251 fac = fac + 1
252
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)
257 beta0(k,i) = beta
258
259 xin(fac,i) = xint
260 yin(fac,i) = yint
261 edgel(k,i) = fac
262 IF(fac == 2)EXIT
263 ELSE
264 mm = dir22/dir11
265 m12 = xxl(p2,i)-xxl(p1,i)
266 m12 = (yyl(p2,i)-yyl(p1,i))/m12
267 IF (mm == m12) GOTO 160
268 xint = (yyl(p1,i) - m12*xxl(p1,i))/(mm - m12)
269 yint = mm*xint
270 cross12 = (xint-xxl(p1,i))*(xint-xxl(p2,i))+
271 . (yint-yyl(p1,i))*(yint-yyl(p2,i))
272
273 IF (cross12 > zero) GOTO 160
274 fac = fac + 1
275
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)
280 beta0(k,i) = beta
281
282 xin(fac,i) = xint
283 yin(fac,i) = yint
284 edgel(k,i) = fac
285 IF(fac == 2)EXIT
286 ENDIF
287
288 160 CONTINUE
289
290 ENDIF
291 ENDDO
292
293
294
295 DO ir=1,newcrk
296 i=jct(ir)
297 fac = 0
298 DO k=1,3
299 IF(edgel(k,i)==1.or.edgel(k,i)==2) fac=fac+1
300 ENDDO
301 IF(fac /= 2)THEN
302 WRITE(iout,*) 'ERROR IN INITIATION CRACK.NO CUT EDGES'
304 ENDIF
305 ENDDO
306
307 DO ir=1,newcrk
308 i=jct(ir)
309 elcrktg = iel_crktg(i+nft)
310 elcrk = elcrktg + ecrkxfec
311
312
313
314 DO k=1,3
315 ied = edgel(k,i)
316 IF (ied == 1 .or. ied == 2) THEN
317 crkedge(ilay)%IEDGETG(k,elcrktg) = ied
318 ENDIF
319 ENDDO
320 ENDDO
321
322
323
324 DO ir=1,newcrk
325 i=jct(ir)
326 fit(1,i)= zero
327 fit(2,i)= zero
328 fit(3,i)= zero
329 xn(1) = xl1(i)
330 yn(1) = yl1(i)
331 xn(2) = xl2(i)
332 yn(2) = yl2(i)
333 xn(3) = xl3(i)
334 yn(3) = yl3(i)
335 DO k=1,3
336 p1 = k
337 p2 = dd(k)
338 ied = edgel(k,i)
339 IF (ied > 0) THEN
340 xmi(ied) = half*(xn(p1)+xn(p2))
341 ymi(ied) = half*(yn(p1)+yn(p2))
342 ENDIF
343 ENDDO
344
345 DO k=1,3
346 fi=zero
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
349 ENDDO
350 ENDDO
351
352 DO ir=1,newcrk
353 i=jct(ir)
354 elcrktg = iel_crktg(i+nft)
355 elcrk = elcrktg + ecrkxfec
356
357 DO k=1,3
358 ied = edgel(k,i)
359 IF (ied == 1 .or. ied == 2) THEN
360 iedge = xedge3n(k,elcrktg)
361
362 icut = crkedge(ilay)%ICUTEDGE(iedge)
363 IF (icut > 0) THEN
364 crkedge(ilay)%ICUTEDGE(iedge) = 3
365 ELSE
366 crkedge(ilay)%ICUTEDGE(iedge) = 2
367 crkedge(ilay)%RATIO(iedge) = beta0(k,i)
368 ENDIF
369 ENDIF
370 ENDDO
371 ENDDO
372
373
374
375 DO ir=1,newcrk
376 i = jct(ir)
377 elcrktg = iel_crktg(i+nft)
378 elcrk = elcrktg + ecrkxfec
379
380 iadc(1) = iad_crktg(1,elcrktg)
381 iadc(2) = iad_crktg(2,elcrktg)
382 iadc(3) = iad_crktg(3,elcrktg)
383
384 n(1) = ixtg(2,i)
385 n(2) = ixtg(3,i)
386 n(3) = ixtg(4,i)
387
388 nn(1) = inod_crk(n(1))
389 nn(2) = inod_crk(n(2))
390 nn(3) = inod_crk(n(3))
391
392 elcutc(1,i) = 2
393 numelcrk = numelcrk + 1
394
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)))
398
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
402
403
404 icrk =
crkshell(pp1)%CRKSHELLID(elcrk)
405 itri = 0
406 nm = 0
407 np = 0
408 DO k=1,3
409 IF (isign(k) > 0) THEN
410 itri = itri + 1
411 np = k
412 ELSEIF (isign(k) < 0) THEN
413 nm = k
414 ENDIF
415 ENDDO
416 IF (itri == 1) THEN
417 itri = -1
418 nx1 = np
419 ELSEIF (itri == 2) THEN
420 itri = 1
421 nx1 = nm
422 ENDIF
423 nx2 = dx(nx1+1)
424 nx3 = dx(nx2+1)
427
428
429
430
431 ienr0(1) = crknodiad(iadc(1))
432 ienr0(2) = crknodiad(iadc(2))
433 ienr0(3) = crknodiad(iadc(3))
434
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)
438
439 sigbeta = 0
440 DO k=1,3
441 ied = edgel(k,i)
442 IF (ied > 0) THEN
443 iedge = xedge3n(k,elcrktg)
444 nod1 = nodedge(1,iedge)
445 nod2 = nodedge(2,iedge)
446 ie10 = 0
447 ie20 = 0
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
451 ie1 = ienr(k)
452 ie2 = ienr(dd(k))
453 ifi1 = isign(k)
454 ifi2 = isign(dd(k))
455 sigbeta = iedge
456 ELSE IF (nod2 == n(k) .and. nod1 == n(dd(k))) THEN
457 ie1 = ienr(dd(k))
458 ie2 = ienr(k)
459 ifi1 = isign(dd(k))
460 ifi2 = isign(k)
461 sigbeta = -iedge
462 END IF
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
467 ENDIF
468 ENDDO
469
470 crkedge(ilay)%LAYCUT(elcrk) = -1
472
473 DO k=1,3
474 ied = edgel(k,i)
475 iedge = xedge3n(k,elcrktg)
476 IF (ied > 0) THEN
477 crkedge(ilay)%EDGETIP(1,iedge) = ied
478 crkedge(ilay)%EDGETIP(2,iedge) =
479 . crkedge(ilay)%EDGETIP(2,iedge) + 1
480 ENDIF
481 ENDDO
482
486
487
488
489 ilev = pp1
490
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)
494
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
498
499
500
501 ilev = pp2
502
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)
506
507 IF (isign(1) < 0)
crklvset(ilev)%ENR0(1,iadc(1)) = 0
508 IF (isign(2) < 0)
crklvset(ilev)%ENR0(1,iadc(2)) = 0
509 IF (isign(3) < 0)
crklvset(ilev)%ENR0(1,iadc(3)) = 0
510
511
512
513 IF (itri < 0) THEN
514 ie2 = xedge3n(nx3,elcrktg) ! tip edge
515 IF (crkedge(ilay)%ICUTEDGE(ie2) > 1) THEN
516 sigbeta = -sigbeta
517 iad1 = iadc(nx1)
518 iad2 = iadc(nx2)
519 iad3 = iadc(nx3)
523 crklvset(pp2)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
524
525
526 x1 = xxl(nx1,i)
527 y1 = yyl(nx1,i)
528 ied = crkedge(ilay)%IEDGETG(nx1,elcrktg)
529 x2 = xin(ied,i)
530 y2 = yin(ied,i)
531 ied = crkedge(ilay)%IEDGETG(nx3,elcrktg)
532 x3 = xin(ied,i)
533 y3 = yin(ied,i)
534 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
535 area1 = area1 /
area(i)
536 x1 = xxl(nx2,i)
537 y1 = yyl(nx2,i)
538 x2 = xxl(nx3,i)
539 y2 = yyl(nx3,i)
540 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
541 area2 = area2 /
area(i)
542 area3 = one - area1 - area2
543
544 ELSE
545
546 ENDIF
547
548 ELSEIF (itri > 0) THEN
549
550 ie1 = xedge3n(nx1,elcrktg)
551 IF (crkedge(ilay)%ICUTEDGE(ie1) > 1) THEN
552 iad1 = iadc(nx1)
553 iad2 = iadc(nx2)
554 iad3 = iadc(nx3)
558 crklvset(pp1)%ENR0(1,iad1) = -crknodiad(iad1) - knod2elc(nn(nx1))*(ilay-1)
559
560
561 ied1= crkedge(ilay)%IEDGETG(nx1,elcrktg)
562 ied2= crkedge(ilay)%IEDGETG(nx3,elcrktg)
563 x1 = xin(ied1,i)
564 y1 = yin(ied1,i)
565 x2 = xxl(nx2,i)
566 y2 = yyl(nx2,i)
567 x3 = xxl(nx3,i)
568 y3 = yyl(nx3,i)
569 area1 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
570 area1 = area1 /
area(i)
571 x1 = xxl(nx1,i)
572 y1 = yyl(nx1,i)
573 x2 = xin(ied1,i)
574 y2 = yin(ied1,i)
575 x3 = xin(ied2,i)
576 y3 = yin(ied2,i)
577 area2 = half*abs((x1-x3)*(y2-y1) - (x1-x2)*(y3-y1))
578 area2 = area2 /
area(i)
579 area3 = one - area1 - area2
580 ELSE
581
582 ENDIF
583 ENDIF
584
588
589 ENDDO
590
591 nlevset = nlevset + 1
592
593 RETURN
subroutine lsint4(y1, z1, y2, z2, y, z, fi)
subroutine area(d1, x, x2, y, y2, eint, stif0)
type(xfem_phantom_), dimension(:), allocatable xfem_phantom
type(xfem_shell_), dimension(:), allocatable crkshell
type(xfem_lvset_), dimension(:), allocatable crklvset