30 SUBROUTINE facepoly(QUAD , TRI , NTRI , IPOLY, RPOLY ,
31 . N , NORMF, NORMT , NSMAX, NNP ,
32 . NRPMAX, NB , NV , LMIN , NPOLMAX,
33 . NPPMAX, INFO , IELNOD, X , IFAC ,
39#include "implicit_f.inc"
47 INTEGER TRI(NSMAX,*), NTRI, NPPMAX, IPOLY(6+NPPMAX+1+NPOLMAX,*),
48 . NSMAX, NRPMAX, NNP, NB, NV, NPOLMAX, INFO,
49 . IELNOD(NPPMAX,*), IFAC, ILVOUT, MVID
51 . quad(3,*), rpoly(nrpmax+3*npolmax,*), n(*), normf(3,*),
52 . normt(3,*), lmin, x(3,*)
56 INTEGER I, NINTER(4), NP, J, JJ, IDBL, NPI, NSEG, REDIR(5*NTRI),
57 . K, KK, JJ1, NNO, ID1, ID2, ISEG(5,5*NTRI), NSEGF, ISTOP,
58 . ISSEG, IPSEG, ITAGSEG(5*NTRI), ITAG(5*NTRI*2), ICLOSE,
59 . INEXT, NN, NPOLY, IADPOLY(NTRI), LENPOLY(NTRI), IAD, II,
60 . poly(2,5*ntri+1), i0, jjj, redir_tmp(5*ntri), npi_tmp,
61 . elseg(5*ntri,2), elinter(4,ntri), elnode(5*ntri*2),
62 . nns, lenmax, nedge, j1, j2, iedge, k1, k2,
63 . tedge(3*ntri,3), edge(3*ntri,3), n1, n2, ipout, m, mm,
64 . nhol, iadhol(npolmax), iseg3_old(5*ntri), idiff, nsec,
66 INTEGER JSEG(4), IP0SEG
67 INTEGER IADR(4), I1, I2, I3, I4, L, ICMAX, IMIN, IMAX, ALGO
68 INTEGER TEMP(5*NTRI),JTAG(2,5*NTRI)
70 . tole, tole2, a(3), x1, y1, z1, x2, y2, z2, ss1, ss2,
71 . x12, y12, z12, xa1, ya1, za1,
alpha, xm, ym, zm,
72 . stmp(4,3), seg(5*ntri,3,2), nx, ny, nz, xa2, ya2, za2,
73 . xa12, ya12, za12, xa1p1, ya1p1, za1p1, beta,
74 . pinter(4,ntri,4), xl(ntri), xlref, xp1, yp1, zp1, xp2,
75 . yp2, zp2, node(3,5*ntri*2), xx1, yy1, zz1, dd1, dd2,
76 . xlc, ll, tolei, t1, t2, dd, xa1p2, ya1p2, za1p2,
77 . xedge(3*ntri,4), xx2, yy2, zz2, nr1, nr2, vx1, vy1, vz1,
78 . vx2, vy2, vz2, ss, vvx, vvy, vvz, xx, yy, zz,
79 . phol(3,npolmax), xloc(2,nppmax), xsec(nppmax), ylmin,
80 . ylmax, ylsec, xsmin1, xsmin2, xs, ys
82 . xp12, yp12, zp12, xa2p1, ya2p1, za2p1
87 INTEGER,
ALLOCATABLE :: NODSEG(:,:)
89 TOLE2=epsilon(zero)*0.5
95 IF(ntri>0) iseg(1:5,1:5*ntri) = 0
112 IF ((k1==j1.AND.k2==j2).OR.
113 . (k2==j1.AND.k1==j2)) iedge=k
135 ss1=(x1-a(1))*n(1)+(y1-a(2))*n(2)+(z1-a(3))*n(3)
136 ss2=(x2-a(1))*n(1)+(y2-a(2))*n(2)+(z2-a(3))*n(3)
138 IF (abs(ss1)<=tole.OR.abs(ss2)<=tole)
THEN
139 IF (abs(ss1)<=tole.AND.abs(ss2)<=tole) cycle
140 ELSEIF (ss1<zero.AND.ss2<zero)
THEN
142 ELSEIF (ss1>=zero.AND.ss2>=zero)
THEN
151 alpha=-(xa1*n(1)+ya1*n(2)+za1*n(3))
152 . /(x12*n(1)+y12*n(2)+z12*n(3))
173 IF (edge(iedge,3)==0) cycle
175 stmp(1,np)=xedge(iedge,1)
176 stmp(2,np)=xedge(iedge,2)
177 stmp(3,np)=xedge(iedge,3)
178 stmp(4,np)=xedge(iedge,4)
192 IF (stmp(4,j)<zero)
THEN
194 seg(i,1,np)=stmp(1,j)
195 seg(i,2,np)=stmp(2,j)
196 seg(i,3,np)=stmp(3,j)
197 ELSEIF (stmp(4,j)==zero)
THEN
200 seg(i,1,np)=stmp(1,j)
201 seg(i,2,np)=stmp(2,j)
202 seg(i,3,np)=stmp(3,j)
251 ss1=xa1p1*nx+ya1p1*ny+za1p1*nz
252 ss2=xa1p2*nx+ya1p2*ny+za1p2*nz
253 IF (ss1>zero.AND.ss2>zero)
THEN
263 ss2=x12*nx+y12*ny+z12*nz
270 beta=((xm-xa1)*xa12+(ym-ya1)*ya12+(zm-za1)*za12)
271 . /(xa12**2+ya12**2+za12**2)
272 IF (beta<-tolei.OR.beta>one+tolei) cycle
273 ss1=(x1-xa1)*nx+(y1-ya1)*ny+(z1-za1)*nz
274 ss2=(x2-xa1)*nx+(y2-ya1)*ny+(z2-za1)*nz
276 IF (ss1*ss2>zero)
THEN
277 IF (abs(ss1)<=abs(ss2))
THEN
286 ELSEIF (ss1*ss2<zero)
THEN
291 ELSEIF (ss2<zero)
THEN
302 ELSEIF (ss2>=zero)
THEN
307 ELSEIF (ss2==zero)
THEN
312 ELSEIF (ss1>=zero)
THEN
326 IF(tri(i,5) == 3)
THEN
332 ss1=xa12*nx+ya12*ny+za12*nz
335 ELSEIF (ss1>=zero)
THEN
346 IF(tri(i,5)/=3) cycle
357 IF(tri(j,5) == 3) cycle
371 x12=ya12*za1p1-za12*ya1p1
372 y12=za12*xa1p1-xa12*za1p1
373 z12=xa12*ya1p1-ya12*xa1p1
374 ss1=x12*n(1)+y12*n(2)+z12*n(3)
379 x12=ya12*za1p2-za12*ya1p2
380 y12=za12*xa1p2-xa12*za1p2
381 z12=xa12*ya1p2-ya12*xa1p2
382 ss2=x12*n(1)+y12*n(2)+z12*n(3)
384 IF(ss1*ss2 > zero) cycle
385 x12=yp12*za1p1-zp12*ya1p1
386 y12=zp12*xa1p1-xp12*za1p1
387 z12=xp12*ya1p1-yp12*xa1p1
388 ss1=x12*n(1)+y12*n(2)+z12*n(3)
393 x12=yp12*za2p1-zp12*ya2p1
394 y12=zp12*xa2p1-xp12*za2p1
395 z12=xp12*ya2p1-yp12*xa2p1
396 ss2=x12*n(1)+y12*n(2)+z12*n(3)
397 IF(ss1*ss2 > zero) cycle
398 IF(ss1 == zero .AND. ss2 /= zero)
THEN
402 ELSEIF(ss2 == zero .AND. ss1 /= zero)
THEN
441 IF (ninter(i)==0) cycle
448 xl(j)=((xm-xa1)*xa12+(ym-ya1)*ya12+(zm-za1)*za12)
449 . /(xa12**2+ya12**2+za12**2)
481 dd=(x2-x1)**2+(y2-y1)**2+(z2-z1)**2+(t2-t1)**2
482 IF (dd<=tole) redir(k)=0
500 dd=(x2-x1)**2+(y2-y1)**2+(z2-z1)**2
515 redir_tmp(j)=redir(j)
520 IF (redir_tmp(j)>0)
THEN
522 redir(npi)=redir_tmp(j)
527 IF (pinter(i,redir(1),4)==-one)
THEN
533 seg(nseg,1,2)=pinter(i,redir(1),1)
534 seg(nseg,2,2)=pinter(i,redir(1),2)
535 seg(nseg,3,2)=pinter(i,redir(1),3)
536 elseg(nseg,2)=elinter(i,redir(1))
541 IF (pinter(i,jj,4)==-one) cycle
552 elseg(nseg,1)=elinter(i,jj)
556 elseg(nseg,2)=elinter(i,jj1)
558 IF (pinter(i,redir(npi),4)==one)
THEN
560 seg(nseg,1,1)=pinter(i,redir(npi),1)
561 seg(nseg,2,1)=pinter(i,redir(npi),2)
562 seg(nseg,3,1)=pinter(i,redir(npi),3)
563 elseg(nseg,1)=elinter(i,redir(npi))
580 IF (x1==zero.AND.y1==zero.AND.z1==zero.AND.
581 . x2==zero.AND.y2==zero.AND.z2==zero)
THEN
595 dd1=(xx1-x1)**2+(yy1-y1)**2+(zz1-z1)**2
596 dd2=(xx1-x2)**2+(yy1-y2)**2+(zz1-z2)**2
600 ll=(x2-x1)**2+(y2-y1)**2+(z2-z1)**2
606 elnode(nno)=elseg(i,1)
609 IF (ll<=tole) id2=id1
615 elnode(nno)=elseg(i,2)
621 IF (id1==id2) iseg(3,i)=1
622 IF(elseg(i,1) == elseg(i,2))
THEN
623 IF(tri(elseg(i,1),5) == 3)
THEN
642 IF (iseg(3,i)==1) cycle
646 IF ((iseg(1,j)==id1.AND.iseg(2,j)==id2).OR.
647 . (iseg(1,j)==id2.AND.iseg(2,j)==id1)) iseg(3,j)=1
653 IF (iseg(3,i)==0) nsegf=nsegf+1
668 iseg3_old(i)=iseg(3,i)
674 DO WHILE (iseg(3,i)==1.AND.i<=nseg)
691 itag(iseg(1,isseg))=i0
695 DO WHILE (iclose==0.AND.i<nseg)
699 IF (j==isseg.OR.iseg(3,j)==1.OR.inext/=0) cycle
702 IF (id1==iseg(ipseg,isseg))
THEN
707 itag(iseg(1,isseg))=i0
709 ELSEIF (id2==iseg(ipseg,isseg))
THEN
714 itag(iseg(2,isseg))=i0
723 nn=itag(iseg(ipseg,isseg))
733 IF (abs(jj)>=iclose)
THEN
735 poly(1,iad+abs(jj)-iclose+1)=j
737 poly(2,iad+abs(jj)-iclose+1)=2
739 poly(2,iad+abs(jj)-iclose+1)=1
744 lenpoly(npoly)=np-iadpoly(npoly)
745 ELSEIF(nok==0.AND.issegold==isseg)
THEN
754 idiff=
max(idiff,abs(iseg3_old(j)-iseg(3,j)))
758 WRITE(istdo,
'(A25,I8,A25)')
759 .
' ** MONITORED VOLUME ID: ',mvid,
' - INFINITE LOOP DETECTED'
760 WRITE(iout,
'(A25,I8,A25)')
761 .
' ** MONITORED VOLUME ID: ',mvid,
' - INFINITE LOOP DETECTED'
762 IF (ilvout >=1)
WRITE(iout,
'(A26,I8,A16,I8)')
763 .
' CUTTING BRICK NUMBER: ',nb,
' - FACE NUMBER: ',ifac
769 IF (npoly>npolmax)
THEN
772 IF(ilvout >=1)
WRITE(iout,
'(A,I10,A,I10)')
773 .
' MONITORED VOLUME ID: ',mvid,
' NLAYER IS RESET TO ',npoly
778 lenmax=
max(lenmax,lenpoly(i))
780 IF (lenmax>nppmax)
THEN
782 IF(ilvout >=1)
WRITE(iout,
'(A,I10,A,I10)')
783 .
' MONITORED VOLUME ID: ',mvid,
' NPPMAX IS RESET TO ',lenmax
795 ALLOCATE (nodseg(nno,5))
802 IF(iseg(3,i) == 1) cycle
810 WRITE(iout,
'(A,I10,2A,3E12.4,A1)')
811 .
' ** MONITORED VOLUME ID: ',mvid,
' MORE THAN 4 SEGMENTS',
812 .
' CONNECTED TO NODE [',node(1,k),node(2,k),node(3,k),
']'
825 IF(nodseg(i,1) /= 4) cycle
827 jseg(k)=nodseg(i,k+1)
831 IF(iseg(5,jseg(k)) == 0) cycle
836 WRITE(iout,
'(A,I10,A,3E12.4,2A,I2,A)')
837 .
' ** FVMBAG ID: ',mvid,
' ERROR IN POLYGON BUILDING : NODE [',
838 . node(1,i),node(2,i),node(3,i),
'] IS CONNECTED TO 4',
839 .
' EDGES',l,
' BEING INTERNAL EDGES'
842 IF(iseg(5,jseg(k)) == 1) cycle
847 nodseg(i,k+1)=jseg(iadr(k))
852 IF(nodseg(i,1) <= 1)
THEN
853 WRITE(iout,
'(A,I10,A,3E12.4,A,I2,A)')
854 .
' ** FVMBAG ID ',mvid,
' ERROR IN POLYGON BUILDING : NODE [',
855 . node(1,i),node(2,i),node(3,i),
'] IS CONNECTED TO ',
856 . nodseg(i,1),
' EDGE'
859 IF(nodseg(i,1) /= 2) cycle
861 IF(iseg(5,nodseg(i,2)) == 1) l=l+1
862 IF(iseg(5,nodseg(i,3)) == 1) l=l+1
864 WRITE(iout,
'(A,I10,A,3E12.4,2A)')
865 .
' ** FVMBAG ID ',mvid,
' ERROR IN POLYGON BUILDING : NODE [',
866 . node(1,i),node(2,i),node(3,i),
'] IS CONNECTED TO 2',
867 .
' EDGES : 1 INTERNAL AND 1 EXTERNAL'
873 IF(nodseg(i,1) /= 3) cycle
875 jseg(k)=nodseg(i,k+1)
879 IF(iseg(5,jseg(k)) == 0) cycle
884 WRITE(iout,
'(A,I10,A,3E12.4,2A)')
885 .
' ** FVMBAG ID: ',mvid,
' ERROR IN POLYGON BUILDING : NODE [',
886 . node(1,i),node(2,i),node(3,i),
'] IS CONNECTED TO 3',
887 .
' EDGES 2 BEING INTERNAL EDGES'
891 IF(iseg(5,jseg(k)) == 1) cycle
909 norm=sqrt(xa1a2*xa1a2+ya1a2*ya1a2+za1a2*za1a2)
924 norm=sqrt(xa1p1*xa1p1+ya1p1*ya1p1+za1p1*za1p1)
928 ss=xa1a2*xa1p1+ya1a2*ya1p1+za1a2*za1p1
929 IF(ss < -one) ss=-one
943 norm=sqrt(xa1p1*xa1p1+ya1p1*ya1p1+za1p1*za1p1)
947 ss=xa1a2*xa1p1+ya1a2*ya1p1+za1a2*za1p1
948 IF(ss < -one) ss=-one
952 IF((alpha1 < zero .AND.
alpha2 > zero).OR.
953 . (
alpha2 < zero .AND. alpha1 > zero))
THEN
957 ELSEIF(abs(alpha1) < abs(
alpha2))
THEN
961 ELSEIF(abs(alpha1) > abs(
alpha2))
THEN
969 nodseg(i,k+1)=jseg(iadr(k))
986 IF(nodseg(i,1) /= 4) cycle
992 IF(jtag(1,i1)==0.AND.jtag(1,i2)==0)
THEN
996 ELSEIF(jtag(1,i1)/=0.AND.jtag(1,i2)==0)
THEN
997 jtag(1,i2)=jtag(1,i1)
998 ELSEIF(jtag(1,i1)==0.AND.jtag(1,i2)/=0)
THEN
999 jtag(1,i1)=jtag(1,i2)
1000 ELSEIF(jtag(1,i1) /= jtag(1,i2))
THEN
1001 imin=
min(jtag(1,i1),jtag(1,i2))
1002 imax=
max(jtag(1,i1),jtag(1,i2))
1004 IF(jtag(1,j) == imax) jtag(1,j)=imin
1005 IF(jtag(2,j) == imax) jtag(2,j)=imin
1022 norm=sqrt(xa1a2*xa1a2+ya1a2*ya1a2+za1a2*za1a2)
1037 norm=sqrt(xa1p1*xa1p1+ya1p1*ya1p1+za1p1*za1p1)
1041 ss=xa1a2*xa1p1+ya1a2*ya1p1+za1a2*za1p1
1042 IF(ss < -one) ss=-one
1043 IF(ss > one) ss= one
1056 norm=sqrt(xa1p1*xa1p1+ya1p1*ya1p1+za1p1*za1p1)
1060 ss=xa1a2*xa1p1+ya1a2*ya1p1+za1a2*za1p1
1061 IF(ss < -one) ss=-one
1062 IF(ss > one) ss= one
1078 IF(jtag(1,i1)==0.AND.jtag(2,i2)==0)
THEN
1082 ELSEIF(jtag(1,i1)/=0.AND.jtag(2,i2)==0)
THEN
1083 jtag(2,i2)=jtag(1,i1)
1084 ELSEIF(jtag(1,i1)==0.AND.jtag(2,i2)/=0)
THEN
1085 jtag(1,i1)=jtag(2,i2)
1086 ELSEIF(jtag(1,i1) /= jtag(2,i2))
THEN
1087 imin=
min(jtag(1,i1),jtag(2,i2))
1088 imax=
max(jtag(1,i1),jtag(2,i2))
1090 IF(jtag(1,j) == imax) jtag(1,j)=imin
1091 IF(jtag(2,j) == imax) jtag(2,j)=imin
1100 IF(nodseg(i,1) /= 3) cycle
1103 IF(iseg(5,jseg(2)) == 1) cycle
1105 IF(iseg(5,jseg(3)) == 1) cycle
1139 norm=sqrt(xa1p1*xa1p1+ya1p1*ya1p1+za1p1*za1p1)
1143 ss=nx*xa1p1+ny*ya1p1+nz*za1p1
1144 IF(ss < -one) ss=-one
1145 IF(ss > one) ss= one
1159 norm=sqrt(xa1p1*xa1p1+ya1p1*ya1p1+za1p1*za1p1)
1163 ss=nx*xa1p1+ny*ya1p1+nz*za1p1
1164 IF(ss < -one) ss=-one
1165 IF(ss > one) ss= one
1182 IF(jtag(l,i1)==0.AND.jtag(1,i2)==0)
THEN
1186 ELSEIF(jtag(l,i1)/=0.AND.jtag(1,i2)==0)
THEN
1187 jtag(1,i2)=jtag(l,i1)
1188 ELSEIF(jtag(l,i1)==0.AND.jtag(1,i2)/=0)
THEN
1189 jtag(l,i1)=jtag(1,i2)
1190 ELSEIF(jtag(l,i1) /= jtag(1,i2))
THEN
1191 imin=
min(jtag(l,i1),jtag(1,i2))
1192 imax=
max(jtag(l,i1),jtag(1,i2))
1194 IF(jtag(1,j) == imax) jtag(1,j)=imin
1195 IF(jtag(2,j) == imax) jtag(2,j)=imin
1204 IF(nodseg(i,1) /= 3) cycle
1206 IF(iseg(5,jseg(1)) == 0) cycle
1208 IF(iseg(5,jseg(2)) == 0) cycle
1210 IF(iseg(5,jseg(3)) == 0) cycle
1244 norm=sqrt(xa1p1*xa1p1+ya1p1*ya1p1+za1p1*za1p1)
1248 ss=nx*xa1p1+ny*ya1p1+nz*za1p1
1249 IF(ss < -one) ss=-one
1250 IF(ss > one) ss= one
1252 IF(abs(
alpha) < half*pi)
THEN
1268 IF(jtag(l,i1)==0.AND.jtag(2,i2)==0)
THEN
1272 ELSEIF(jtag(l,i1)/=0.AND.jtag(2,i2)==0)
THEN
1273 jtag(2,i2)=jtag(l,i1)
1274 ELSEIF(jtag(l,i1)==0.AND.jtag(2,i2)/=0)
THEN
1275 jtag(l,i1)=jtag(2,i2)
1276 ELSEIF(jtag(l,i1) /= jtag(2,i2))
THEN
1277 imin=
min(jtag(l,i1),jtag(2,i2))
1278 imax=
max(jtag(l,i1),jtag(2,i2))
1280 IF(jtag(1,j) == imax) jtag(1,j)=imin
1281 IF(jtag(2,j) == imax) jtag(2,j)=imin
1288 IF(jtag(1,i1)==0.AND.jtag(1,i2)==0)
THEN
1292 ELSEIF(jtag(1,i1)/=0.AND.jtag(1,i2)==0)
THEN
1293 jtag(1,i2)=jtag(1,i1)
1294 ELSEIF(jtag(1,i1)==0.AND.jtag(1,i2)/=0)
THEN
1295 jtag(1,i1)=jtag(1,i2)
1296 ELSEIF(jtag(1,i1) /= jtag(1,i2))
THEN
1297 imin=
min(jtag(1,i1),jtag(1,i2))
1298 imax=
max(jtag(1,i1),jtag(1,i2))
1300 IF(jtag(1,j) == imax) jtag(1,j)=imin
1301 IF(jtag(2,j) == imax) jtag(2,j)=imin
1310 IF(nodseg(i,1) /= 2) cycle
1313 IF(iseg(5,i1) == 0) cycle
1315 IF(jtag(2,i1)==0.AND.jtag(2,i2)==0)
THEN
1319 ELSEIF(jtag(2,i1)/=0.AND.jtag(2,i2)==0)
THEN
1320 jtag(2,i2)=jtag(2,i1)
1321 ELSEIF(jtag(2,i1)==0.AND.jtag(2,i2)/=0)
THEN
1322 jtag(2,i1)=jtag(2,i2)
1323 ELSEIF(jtag(2,i1) /= jtag(2,i2))
THEN
1324 imin=
min(jtag(2,i1),jtag(2,i2))
1325 imax=
max(jtag(2,i1),jtag(2,i2))
1327 IF(jtag(1,j) == imax) jtag(1,j)=imin
1328 IF(jtag(2,j) == imax) jtag(2,j)=imin
1332 IF(jtag(1,i1)==0.AND.jtag(1,i2)==0)
THEN
1336 ELSEIF(jtag(1,i1)/=0.AND.jtag(1,i2)==0)
THEN
1337 jtag(1,i2)=jtag(1,i1)
1338 ELSEIF(jtag(1,i1)==0.AND.jtag(1,i2)/=0)
THEN
1339 jtag(1,i1)=jtag(1,i2)
1340 ELSEIF(jtag(1,i1) /= jtag(1,i2))
THEN
1341 imin=
min(jtag(1,i1),jtag(1,i2))
1342 imax=
max(jtag(1,i1),jtag(1,i2))
1344 IF(jtag(1,j) == imax) jtag(1,j)=imin
1345 IF(jtag(2,j) == imax) jtag(2,j)=imin
1353 IF(nodseg(i,1) /= 2) cycle
1356 IF(iseg(5,i1) == 1) cycle
1358 IF(jtag(1,i1)==0.AND.jtag(1,i2)==0)
THEN
1362 ELSEIF(jtag(1,i1)/=0.AND.jtag(1,i2)==0)
THEN
1363 jtag(1,i2)=jtag(1,i1)
1364 ELSEIF(jtag(1,i1)==0.AND.jtag(1,i2)/=0)
THEN
1365 jtag(1,i1)=jtag(1,i2)
1366 ELSEIF(jtag(1,i1) /= jtag(1,i2))
THEN
1367 imin=
min(jtag(1,i1),jtag(1,i2))
1368 imax=
max(jtag(1,i1),jtag(1,i2))
1370 IF(jtag(1,j) == imax) jtag(1,j)=imin
1382 IF (jtag(1,j) == i .OR. jtag(2,j) == i) ii=ii+1
1389 IF (npoly>npolmax)
THEN
1391 IF(ilvout >=1)
WRITE(iout,
'(A,I10,A,I10)')
1392 .
' MONITORED VOLUME ID: ',mvid,
' NLAYER IS RESET TO ',npoly
1397 lenmax=
max(lenmax,lenpoly(i))
1399 IF (lenmax>nppmax)
THEN
1401 IF(ilvout >=1)
WRITE(iout,
'(A,I10,A,I10)')
1402 .
' MONITORED VOLUME ID: ',mvid,
' NPPMAX IS RESET TO ',lenmax
1413 IF (jtag(1,j) == i .OR. jtag(2,j) == i) ii=ii+1
1419 IF (jtag(1,j) == i .OR. jtag(2,j) == i)
THEN
1431 IF(lenpoly(i) < 3)
THEN
1432 WRITE(iout,
'(A,I8,3(A,I5),A)')
1433 .
' CUTTING BRICK NUMBER: ',nb,
' FACE NUMBER: ',ifac,
1434 .
' POLYGONE',i,
' HAS ONLY',lenpoly(i),
' EDGES'
1437 temp(j)=poly(1,iad+j)
1449 i1=iseg(ip0seg,isseg)
1452 DO WHILE (istop == 0)
1455 WRITE(iout,
'(A,I8,2(A,I5),A)')
1456 .
' CUTTING BRICK NUMBER: ',nb,
' FACE NUMBER: ',ifac,
1457 .
' POLYGONE',i,
' IS NOT CLOSED'
1461 IF(temp(k) == isseg .OR. itagseg(k) == 1) cycle
1467 poly(1,iad+j+1)=isseg
1471 ELSEIF(k2 == i1)
THEN
1474 poly(1,iad+j+1)=isseg
1481 IF(iseg(ip0seg,isseg) /= i0)
THEN
1482 WRITE(iout,
'(A,I8,2(A,I5),A)')
1483 .
' CUTTING BRICK NUMBER: ',nb,
' FACE NUMBER: ',ifac,
1484 .
' POLYGONE',i,
' IS NOT CLOSED'
1495 ipoly(2,i)=lenpoly(i)
1510 ielnod(j,i)=elnode(id1)
1511 rpoly(4+3*(j-1)+1,i)=node(1,id1)
1512 rpoly(4+3*(j-1)+2,i)=node(2,id1)
1513 rpoly(4+3*(j-1)+3,i)=node(3,id1)
1535 IF (k==lenpoly(i)) kk=1
1536 xx1=rpoly(4+3*(k-1)+1,i)
1537 yy1=rpoly(4+3*(k-1)+2,i)
1538 zz1=rpoly(4+3*(k-1)+3,i)
1539 xx2=rpoly(4+3*(kk-1)+1,i)
1540 yy2=rpoly(4+3*(kk-1)+2,i)
1541 zz2=rpoly(4+3*(kk-1)+3,i)
1548 nr1=sqrt(vx1**2+vy1**2+vz1**2)
1549 nr2=sqrt(vx2**2+vy2**2+vz2**2)
1560 ss=vx1*vx2+vy1*vy2+vz1*vz2
1561 IF(ss < -one) ss=-one
1562 IF(ss > one) ss= one
1566 ss1=n(1)*vvx+n(2)*vvy+n(3)*vvz
1569 ELSEIF(ss1<zero)
THEN
1574 IF (abs(
alpha)<two*pi) cycle
1581 x1=rpoly(4+3*(k-1)+1,j)
1582 y1=rpoly(4+3*(k-1)+2,j)
1583 z1=rpoly(4+3*(k-1)+3,j)
1587 IF (m==lenpoly(i)) mm=1
1588 xx1=rpoly(4+3*(m-1)+1,i)
1589 yy1=rpoly(4+3*(m-1)+2,i)
1590 zz1=rpoly(4+3*(m-1)+3,i)
1591 xx2=rpoly(4+3*(mm-1)+1,i)
1592 yy2=rpoly(4+3*(mm-1)+2,i)
1593 zz2=rpoly(4+3*(mm-1)+3,i)
1600 nr1=sqrt(vx1**2+vy1**2+vz1**2)
1601 nr2=sqrt(vx2**2+vy2**2+vz2**2)
1612 ss=vx1*vx2+vy1*vy2+vz1*vz2
1613 IF(ss < -one) ss=-one
1614 IF(ss > one) ss= one
1618 ss1=n(1)*vvx+n(2)*vvy+n(3)*vvz
1621 ELSEIF(ss1<zero)
THEN
1626 IF (abs(
alpha)<two*pi) ipout=1
1633 iadhol(nhol)=lenpoly(i)
1634 IF (lenpoly(i)+lenpoly(j)>nppmax)
THEN
1635 nppmax=lenpoly(i)+lenpoly(j)
1636 IF(ilvout >=1)
WRITE(iout,
'(A,I10,A,I10)')
1637 .
' MONITORED VOLUME ID: ',mvid,
1638 .
' NPPMAX IS RESET TO ',nppmax
1642 IF (ilvout >=1)
THEN
1643 WRITE(iout,
'(/A25,I10,A25)')
1644 .
' ** MONITORED VOLUME ID: ',mvid,
' - HOLE DETECTED'
1645 WRITE(iout,
'(A26,I8,A16,I8)')
1646 .
' CUTTING BRICK NUMBER: ',nb,
' FACE NUMBER: ',ifac
1649 ipoly(6+iadhol(nhol)+k,i)=ipoly(6+k,j)
1650 ielnod(iadhol(nhol)+k,i)=ielnod(k,j)
1651 rpoly(4+3*iadhol(nhol)+3*(k-1)+1,i)=
1652 . rpoly(4+3*(k-1)+1,j)
1653 rpoly(4+3*iadhol(nhol)+3*(k-1)+2,i)=
1654 . rpoly(4+3*(k-1)+2,j)
1655 rpoly(4+3*iadhol(nhol)+3*(k-1)+3,i)=
1656 . rpoly(4+3*(k-1)+3,j)
1659 lenpoly(i)=lenpoly(i)+lenpoly(j)
1661 vx1=quad(1,2)-quad(1,1)
1662 vy1=quad(2,2)-quad(2,1)
1663 vz1=quad(3,2)-quad(3,1)
1664 ss=sqrt(vx1**2+vy1**2+vz1**2)
1668 vx2=n(2)*vz1-n(3)*vy1
1669 vy2=n(3)*vx1-n(1)*vz1
1670 vz2=n(1)*vy1-n(2)*vx1
1679 xx=rpoly(4+3*(k-1)+1,j)
1680 yy=rpoly(4+3*(k-1)+2,j)
1685 xloc(1,k)=vvx*vx1+vvy*vy1+vvz*vz1
1686 xloc(2,k)=vvx*vx2+vvy*vy2+vvz*vz2
1687 IF (xloc(2,k)<ylmin) ylmin=xloc(2,k)
1688 IF (xloc(2,k)>ylmax) ylmax=xloc(2,k)
1690 ylsec=half*(ylmin+ylmax)
1695 IF (k==lenpoly(j)) kk=1
1700 IF (y1-y2/=zero)
THEN
1701 alpha=(ylsec-y2)/(y1-y2)
1719 IF (xsec(k)<xsmin1)
THEN
1727 IF (xsec(k)<xsmin2) xsmin2=xsec(k)
1730 xs=half*(xsmin1+xsmin2)
1732 phol(1,nhol)=rpoly(5,j)+xs*vx1+ys*vx2
1733 phol(2,nhol)=rpoly(6,j)+xs*vy1+ys*vy2
1734 phol(3,nhol)=rpoly(7,j)+xs*vz1+ys*vz2
1739 ipoly(2,i)=lenpoly(i)
1740 ipoly(6+lenpoly(i)+1,i)=nhol
1742 ipoly(6+lenpoly(i)+1+j,i)=iadhol(j)
1743 rpoly(4+3*lenpoly(i)+3*(j-1)+1,i)=phol(1,j)
1744 rpoly(4+3*lenpoly(i)+3*(j-1)+2,i)=phol(2,j)
1745 rpoly(4+3*lenpoly(i)+3*(j-1)+3,i)=phol(3,j)