31 SUBROUTINE polyhedr1(IPOLY, RPOLY , POLB , NPOLB, POLH,
32 . NPOLH, NRPMAX , NPHMAX, IBRIC, LMIN,
33 . INFO , NPOLHMAX, NPPMAX, NEL, INZ ,
38#include "implicit_f.inc"
46 INTEGER NPPMAX, IPOLY(6+NPPMAX,*), POLB(*), NPOLB, NPHMAX,
47 . POLH(NPHMAX+2,*),NPOLH, NRPMAX, IBRIC, INFO, NPOLHMAX
51 . rpoly(nrpmax,*), lmin
55 INTEGER I, ICMAX, II, J, JJ, K, KK, IEL
56 INTEGER L, LL, ITY, JMIN, PMIN, POLD, NEDGE, NVERTEX
57 INTEGER IMIN, IMAX, I1, I2, I3, I4, N1, N2, K1, K2
58 INTEGER M1, M2, L1, L2
59 INTEGER ITAG(2,NPOLB), POLEDG(,NPPMAX+1), ITYP(NPOLB)
60 INTEGER NTYP(3), REDIR(4), (4), TEMP2(4)
61 INTEGER NNP, NHOL, NSEG, NELP, JTAG(3), NTRI3(NPOLB,NPPMAX)
62 INTEGER,
ALLOCATABLE :: EDGPOL(:,:)
63 INTEGER,
ALLOCATABLE :: EDGVER(:,:)
64 INTEGER,
ALLOCATABLE :: (:,:)
65 INTEGER,
ALLOCATABLE :: PSEG(:,:),PTRI(:,:)
67 . x1, y1, z1, x2, y2, z2, xx1, yy1, zz1, xx2, yy2, zz2,
68 . dd11, dd12, dd21, dd22, tole
70 . tst12, tst13, tst21, tst32, tst14,
71 . nx, ny, nz, nx1, ny1, nz1
73 . x0, y0, z0, nrm1, vx1, vy1, vz1, vx2, vy2, vz2,
77 my_real,
ALLOCATABLE :: xx(:), yy(:), zz(:)
78 my_real,
ALLOCATABLE :: pnodes(:,:), pholes(:,:)
80 tole=epsilon(zero)*0.5*lmin*lmin
88 ALLOCATE(pnodes(2,nnp), pseg(2,nnp),ptri(3,2*nnp),pholes(2,1))
102 nrm1=sqrt((x1-x0)**2+(y1-y0)**2+(z1-z0)**2)
113 x1=rpoly(4+3*(j-1)+1,i)
114 y1=rpoly(4+3*(j-1)+2,i)
115 z1=rpoly(4+3*(j-1)+3,i)
119 pnodes(1,j)=vx*vx1+vy*vy1+vz*vz1
120 pnodes(2,j)=vx*vx2+vy*vy2+vz*vz2
129 CALL c_tricall(pnodes, pseg, pholes, ptri, nnp,
148 IF(ptri(l,k) == n1) jtag(k)=jtag(k)+1
149 IF(ptri(l,k) == n2) jtag(k)=jtag(k)+1
153 IF(jtag(k) /= 2) cycle
155 IF(ptri(l,k) == n1 .OR. ptri(l,k) == n2) cycle
156 ntri3(ii,j) = ptri(l,k)
161 DEALLOCATE(pnodes, pseg, ptri, pholes)
170 ALLOCATE (xx(npolb*nppmax*2))
171 ALLOCATE (yy(npolb*nppmax*2))
172 ALLOCATE (zz(npolb*nppmax*2))
173 ALLOCATE (edgver(npolb*nppmax,2))
183 poledg(i,1)=ipoly(2,ii)
186 IF(poledg(i,jj) > 0) cycle
189 x1=rpoly(4+3*(j-1)+1,ii)
190 y1=rpoly(4+3*(j-1)+2,ii)
191 z1=rpoly(4+3*(j-1)+3,ii)
193 edgver(nedge,1)=nvertex
197 IF (j==ipoly(2,ii)) jj=1
198 x2=rpoly(4+3*(jj-1)+1,ii)
199 y2=rpoly(4+3*(jj-1)+2,ii)
200 z2=rpoly(4+3*(jj-1)+3,ii)
202 edgver(nedge,2)=nvertex
211 IF (l==ipoly(2,kk)) ll=1
212 xx1=rpoly(4+3*(l-1)+1,kk)
213 yy1=rpoly(4+3*(l-1)+2,kk)
214 zz1=rpoly(4+3*(l-1)+3,kk)
215 xx2=rpoly(4+3*(ll-1)+1,kk)
216 yy2=rpoly(4+3*(ll-1)+2,kk)
217 zz2=rpoly(4+3*(ll-1)+3,kk)
218 dd11=(xx1-x1)**2+(yy1-y1)**2+(zz1-z1)**2
219 dd21=(xx2-x1)**2+(yy2-y1)**2+(zz2-z1)**2
220 dd12=(xx1-x2)**2+(yy1-y2)**2+(zz1-z2)**2
221 dd22=(xx2-x2)**2+(yy2-y2)**2+(zz2-z2)**2
222 IF ((dd11<=tole.AND.dd22<=tole).OR.
223 . (dd21<=tole.AND.dd12<=tole))
THEN
236 ALLOCATE(edgpol(nedge,5))
237 ALLOCATE(edgloc(nedge,4))
254 WRITE(iout,
'(A,I5,A /A,1P3G20.13,A/A,1P3G20.13,A)')
255 . ' fvmbag mesh error : edge n1n2 is connected to
',KK,
256 . ' polygons but
the limit is 4
',
257 . ' n1 = (
',XX(N1),YY(N1),ZZ(N1),')
',
258 . ' n2 = (
',XX(N2),YY(N2),ZZ(N2),')
'
273.AND.
IF(ITY == 1 TAGELA(IEL) > NEL) ITY=3
288 IF(ITYP(II) == 1) NTYP(1)=NTYP(1)+1
289 IF(ITYP(II) == 2) NTYP(2)=NTYP(2)+1
290 IF(ITYP(II) == 3) NTYP(3)=NTYP(3)+1
293 WRITE(IOUT,'(/2(a,i5),a,2(/a,1p3g20.13,a))
')
294 . ' fvmbag mesh error : brick
',IBRIC,' layer
',INZ,
295 . ' edge n1n2 is connected to only 1 polygon
',
296 . ' n1 = (
',XX(N1),YY(N1),ZZ(N1),')
',
297 . ' n2 = (
',XX(N2),YY(N2),ZZ(N2),')
'
299.AND.
ELSEIF(L == 2 NTYP(3) == 1) THEN
300 WRITE(IOUT,'(/2(a,i5),2a,2(/a,1p3g20.13,a))
')
301 . ' fvmbag mesh error : brick
',IBRIC,' layer
',INZ,
302 . ' edge n1n2 is connected to 2 polygons but only 1
',
303 . ' internal polygon
',
304 . ' n1 = (
',XX(N1),YY(N1),ZZ(N1),')
',
305 . ' n2 = (
',XX(N2),YY(N2),ZZ(N2),')
'
307.AND.
ELSEIF(L == 3 NTYP(3) == 2) THEN
308 WRITE(IOUT,'(/2(a,i5),2a,2(/a,1p3g20.13,a))
')
309 . ' fvmbag mesh error : brick
',IBRIC,' layer
',INZ,
310 . ' edge n1n2 is connected to 3 polygons 2 being
',
311 . ' internal polygons
',
312 . ' n1 = (
',XX(N1),YY(N1),ZZ(N1),')
',
313 . ' n2 = (
',XX(N2),YY(N2),ZZ(N2),')'
316 IF(ntyp(3) == 1)
THEN
317 WRITE(iout,
'(/2(A,I5),2A,2(/A,1P3G20.13,A))')
318 .
' FVMBAG MESH ERROR : BRICK ',ibric,
' LAYER ',inz,
319 .
' EDGE N1N2 IS CONNECTED TO 4 POLYGONS ONLY 1 BEING',
320 .
' INTERNAL POLYGON',
321 .
' N1 = (',xx(n1),yy(n1),zz(n1),
')',
322 .
' N2 = (',xx(n2),yy(n2),zz(n2),
')'
324 ELSEIF( ntyp(3) >= 3)
THEN
325 WRITE(iout,
'(/2(A,I5),2A,2(/A,1P3G20.13,A))')
326 .
' FVMBAG MESH ERROR : BRICK ',ibric,
' LAYER ',inz,
327 .
' EDGE N1N2 IS CONNECTED TO 4 POLYGONS 3 BEING',
328 .
' INTERNAL POLYGONS',
329 .
' N1 = (',xx(n1),yy(n1),zz(n1),
')',
330 .
' N2 = (',xx(n2),yy(n2),zz(n2),
')'
334 WRITE(iout,
'(/2(A,I5),A,2(/A,1P3G20.13,A))')
335 . ' fvmbag mesh error : brick
',IBRIC,' layer
',INZ,
336 . ' edge n1n2 is connected to more than 4 polygons
',
337 . ' n1 = (
',XX(N1),YY(N1),ZZ(N1),')
',
338 . ' n2 = (
',XX(N2),YY(N2),ZZ(N2),')
'
346 IF(EDGPOL(J,1) == 2 ) CYCLE
348 TEMP1(K)=EDGPOL(J,K+1)
354 IF(ITYP(L) == 3) THEN
361 IF(ITYP(L) /= 3) THEN
367 EDGPOL(J,K+1)=TEMP1(REDIR(K))
368 EDGLOC(J,K) =TEMP2(REDIR(K))
381 IF(EDGPOL(J,1) < 4) CYCLE
397 X2=RPOLY(4+3*(JJ-1)+1,II)
398 Y2=RPOLY(4+3*(JJ-1)+2,II)
399 Z2=RPOLY(4+3*(JJ-1)+3,II)
400 TST12=NX*(X2-X1)+NY*(Y2-Y1)+NZ*(Z2-Z1)
408 X2=RPOLY(4+3*(JJ-1)+1,II)
409 Y2=RPOLY(4+3*(JJ-1)+2,II)
410 Z2=RPOLY(4+3*(JJ-1)+3,II)
414 TST13=NX*VX+NY*VY+NZ*VZ
415 ALPHA13=ACOS(NX*NX1+NY*NY1+NZ*NZ1)
423 X2=RPOLY(4+3*(JJ-1)+1,II)
424 Y2=RPOLY(4+3*(JJ-1)+2,II)
425 Z2=RPOLY(4+3*(JJ-1)+3,II)
429 TST14=NX*VX+NY*VY+NZ*VZ
430 ALPHA14=ACOS(NX*NX1+NY*NY1+NZ*NZ1)
439 X2=RPOLY(4+3*(JJ-1)+1,II)
440 Y2=RPOLY(4+3*(JJ-1)+2,II)
441 Z2=RPOLY(4+3*(JJ-1)+3,II)
442 TST21=NX*(X2-X1)+NY*(Y2-Y1)+NZ*(Z2-Z1)
444 IF(TST12*TST21 < ZERO) THEN
446 WRITE(IOUT,'(/2(a,i5),2a,2(/a,1p3g20.13,a))
')
447 . ' fvmbag mesh error : brick
',IBRIC,' layer
',INZ,
448 . ' wrong normal orientation of internal surface elements
',
449 . ' connected to edge n1n2
',
450 . ' n1 = (
',XX(N1),YY(N1),ZZ(N1),')
',
451 . ' n2 = (
',XX(N2),YY(N2),ZZ(N2),')
'
459.AND.
IF(TST13 > ZERO TST14 > ZERO) THEN
460 IF(ALPHA13 < ALPHA14) THEN
475.AND.
ELSEIF(TST13 < ZERO TST14 < ZERO) THEN
476 IF(ALPHA13 < ALPHA14) THEN
491.AND.
ELSEIF(TST13 > ZERO TST14 < ZERO) THEN
498.AND.
ELSEIF(TST13 < ZERO TST14 > ZERO) THEN
511 IF(EDGPOL(J,1) /= 3) CYCLE
514 IF(ITYP(I2) /= 3) CYCLE
528 X2=RPOLY(4+3*(JJ-1)+1,II)
529 Y2=RPOLY(4+3*(JJ-1)+2,II)
530 Z2=RPOLY(4+3*(JJ-1)+3,II)
531 TST12=NX*(X2-X1)+NY*(Y2-Y1)+NZ*(Z2-Z1)
532 IF(TST12 < ZERO) THEN
547 X2=RPOLY(4+3*(JJ-1)+1,II)
548 Y2=RPOLY(4+3*(JJ-1)+2,II)
549 Z2=RPOLY(4+3*(JJ-1)+3,II)
550 TST21=NX*(X2-X1)+NY*(Y2-Y1)+NZ*(Z2-Z1)
551 IF(TST21 < ZERO) THEN
566 X2=RPOLY(4+3*(JJ-1)+1,II)
567 Y2=RPOLY(4+3*(JJ-1)+2,II)
568 Z2=RPOLY(4+3*(JJ-1)+3,II)
569 TST32=NX*(X2-X1)+NY*(Y2-Y1)+NZ*(Z2-Z1)
570 IF(TST32 < ZERO) THEN
578.AND.
IF (ITAG(K1,I1) == 0 ITAG(L1,I2) == 0) THEN
582.AND.
ELSEIF(ITAG(K1,I1) == 0 ITAG(L1,I2) /= 0) THEN
583 ITAG(K1,I1)=ITAG(L1,I2)
584 ELSEIF(ITAG(K1,I1) /= 0. AND. ITAG(L1,I2) == 0) THEN
585 ITAG(L1,I2)=ITAG(K1,I1)
586.AND.
ELSEIF(ITAG(K1,I1) /= 0 ITAG(L1,I2) /= 0) THEN
587 IF(ITAG(K1,I1) /= ITAG(L1,I2)) THEN
588 IMIN=MIN(ITAG(L1,I2),ITAG(K1,I1))
589 IMAX=MAX(ITAG(L1,I2),ITAG(K1,I1))
591 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
592 IF(ITYP(I) /= 3) CYCLE
593 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
598.AND.
IF(ITAG(M1,I3) == 0 ITAG(L2,I2) == 0) THEN
602.AND.
ELSEIF(ITAG(M1,I3) /= 0 ITAG(L2,I2) == 0) THEN
603 ITAG(L2,I2)=ITAG(M1,I3)
604.AND.
ELSEIF(ITAG(M1,I3) == 0 ITAG(L2,I2) /= 0) THEN
605 ITAG(M1,I3)=ITAG(L2,I2)
606.AND.
ELSEIF(ITAG(M1,I3) /= 0 ITAG(L2,I2) /= 0) THEN
607 IF(ITAG(M1,I3) /= ITAG(L2,I2)) THEN
608 IMIN=MIN(ITAG(M1,I3),ITAG(L2,I2))
609 IMAX=MAX(ITAG(M1,I3),ITAG(L2,I2))
611 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
612 IF(ITYP(I) /= 3) CYCLE
613 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
618.AND.
IF(ITAG(M2,I3) == 0 ITAG(K2,I1) == 0) THEN
622.AND.
ELSEIF(ITAG(M2,I3) /= 0 ITAG(K2,I1) == 0) THEN
623 ITAG(K2,I1)=ITAG(M2,I3)
624.AND.
ELSEIF(ITAG(M2,I3) == 0 ITAG(K2,I1) /= 0) THEN
625 ITAG(M2,I3)=ITAG(K2,I1)
626.AND.
ELSEIF(ITAG(M2,I3) /= 0 ITAG(K2,I1) /= 0) THEN
627 IF(ITAG(M2,I3) /= ITAG(K2,I1)) THEN
628 IMIN=MIN(ITAG(M2,I3),ITAG(K2,I1))
629 IMAX=MAX(ITAG(M2,I3),ITAG(K2,I1))
631 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
632 IF(ITYP(I) /= 3) CYCLE
633 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
642 IF(EDGPOL(J,1) /= 3) CYCLE
645 IF(ITYP(I2) == 3) CYCLE
658 X2=RPOLY(4+3*(JJ-1)+1,II)
659 Y2=RPOLY(4+3*(JJ-1)+2,II)
660 Z2=RPOLY(4+3*(JJ-1)+3,II)
661 TST12=NX*(X2-X1)+NY*(Y2-Y1)+NZ*(Z2-Z1)
662 IF(TST12 < ZERO) THEN
669.AND.
IF (ITAG(K1,I1) == 0 ITAG(1,I2) == 0) THEN
673 IF(ITAG(1,I3) == 0) THEN
678 ITAG(K2,I1)=ITAG(1,I3)
680.AND.
ELSEIF(ITAG(K1,I1) == 0 ITAG(1,I2) /= 0) THEN
681 ITAG(K1,I1)=ITAG(1,I2)
682 IF(ITAG(1,I3) == 0) THEN
687 ITAG(K2,I1)=ITAG(1,I3)
689 ELSEIF(ITAG(K1,I1) /= 0. AND. ITAG(1,I2) == 0) THEN
690 ITAG(1,I2)=ITAG(K1,I1)
691 IF(ITAG(1,I3) == 0) THEN
692 ITAG(1,I3)=ITAG(K2,I1)
693 ELSEIF(ITAG(1,I3) /= ITAG(K2,I1)) THEN
694 IMIN=MIN(ITAG(1,I3),ITAG(K2,I1))
695 IMAX=MAX(ITAG(1,I3),ITAG(K2,I1))
697 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
698 IF(ITYP(I) /= 3) CYCLE
699 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
702.AND.
ELSEIF(ITAG(K1,I1) /= 0 ITAG(1,I2) /= 0) THEN
703 IF(ITAG(K1,I1) /= ITAG(1,I2)) THEN
704 IMIN=MIN(ITAG(1,I2),ITAG(K1,I1))
705 IMAX=MAX(ITAG(1,I2),ITAG(K1,I1))
707 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
708 IF(ITYP(I) /= 3) CYCLE
709 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
712 IF(ITAG(1,I3) == 0) THEN
713 ITAG(1,I3)=ITAG(K2,I1)
714 ELSEIF(ITAG(1,I3) /= ITAG(K2,I1)) THEN
715 IMIN=MIN(ITAG(1,I3),ITAG(K2,I1))
716 IMAX=MAX(ITAG(1,I3),ITAG(K2,I1))
718 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
719 IF(ITYP(I) /= 3) CYCLE
720 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
730 IF(EDGPOL(J,1) > 2) CYCLE
733.AND..OR.
IF((ITYP(I1) /= 3 ITYP(I2) /= 3)
734.AND.
. (ITYP(I1) == 3 ITYP(I2) == 3) ) THEN
735.AND.
IF (ITAG(1,I1) == 0 ITAG(1,I2) == 0) THEN
739.AND.
ELSEIF(ITAG(1,I1) == 0 ITAG(1,I2) /= 0) THEN
740 ITAG(1,I1)=ITAG(1,I2)
741 ELSEIF(ITAG(1,I1) /= 0. AND. ITAG(1,I2) == 0) THEN
742 ITAG(1,I2)=ITAG(1,I1)
743 ELSEIF(ITAG(1,I1) /= ITAG(1,I2)) THEN
744 IMIN=MIN(ITAG(1,I1),ITAG(1,I2))
745 IMAX=MAX(ITAG(1,I1),ITAG(1,I2))
747 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
748 IF(ITYP(I) /= 3) CYCLE
749 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
754.AND.
IF(ITYP(I1) == 3 ITYP(I2) == 3) THEN
755.AND.
IF (ITAG(2,I1) == 0 ITAG(2,I2) == 0) THEN
759.AND.
ELSEIF(ITAG(2,I1) == 0 ITAG(2,I2) /= 0) THEN
760 ITAG(2,I1)=ITAG(2,I2)
761 ELSEIF(ITAG(2,I1) /= 0. AND. ITAG(2,I2) == 0) THEN
762 ITAG(2,I2)=ITAG(2,I1)
763 ELSEIF(ITAG(2,I1) /= ITAG(2,I2)) THEN
764 IMIN=MIN(ITAG(2,I1),ITAG(2,I2))
765 IMAX=MAX(ITAG(2,I1),ITAG(2,I2))
767 IF(ITAG(1,I) == IMAX) ITAG(1,I)=IMIN
768 IF(ITYP(I) /= 3) CYCLE
769 IF(ITAG(2,I) == IMAX) ITAG(2,I)=IMIN
778 DEALLOCATE (XX,YY,ZZ)
784.OR.
IF (ITAG(1,J) == I ITAG(2,J) == I) II=II+1
786 IF (II/=0) NPOLH=NPOLH+1
788 IF (NPOLH>NPOLHMAX) THEN
798.OR.
IF (ITAG(1,J) == I ITAG(2,J) == I) II=II+1
806.OR.
IF (ITAG(1,J) == I ITAG(2,J) == I) THEN
813 ELSEIF(ITY == 2) THEN
814 IF (IPOLY(5,JJ)==0) THEN
819 ELSEIF(ITY == 3) THEN
820 IF(ITAG(1,J) == I) THEN
822 ELSEIF(ITAG(2,J) == I) THEN
834 DO K=J+1,POLH(1,NPOLH)
835 IF (POLH(2+K,NPOLH)<PMIN) THEN
842 POLH(2+JMIN,NPOLH)=POLD