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,
57 INTEGER IMIN, IMAX, I1, I2, I3, I4, N1, N2, K1, K2
58 INTEGER M1, M2, L1, L2
59 INTEGER ITAG(2,NPOLB), POLEDG(NPOLB,NPPMAX+1), ITYP(NPOLB)
60 INTEGER NTYP(3), REDIR(4), TEMP1(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 :: EDGLOC(:,:)
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 IF(ity == 1 .AND. 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 ELSEIF(l == 2 .AND. 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 ELSEIF(l == 3 .AND. 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
')'
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
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 IF(tst13 > zero .AND. tst14 > zero)
THEN
460 IF(alpha13 < alpha14)
THEN
475 ELSEIF(tst13 < zero .AND. tst14 < zero)
THEN
476 IF(alpha13 < alpha14)
THEN
491 ELSEIF(tst13 > zero .AND. tst14 < zero)
THEN
498 ELSEIF(tst13 < zero .AND. 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 IF (itag(k1,i1) == 0 .AND. itag(l1,i2) ==
THEN
582 ELSEIF(itag(k1,i1) == 0 .AND. 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 ELSEIF(itag(k1,i1) /= 0 .AND. 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 IF(itag(m1,i3) == 0 .AND. itag(l2,i2) == 0)
THEN
602 ELSEIF(itag(m1,i3) /= 0 .AND. itag(l2,i2) == 0)
THEN
603 itag(l2,i2)=itag(m1,i3)
604 ELSEIF(itag(m1,i3) == 0 .AND. itag(l2,i2) /= 0)
THEN
605 itag(m1,i3)=itag(l2,i2)
606 ELSEIF(itag(m1,i3) /= 0 .AND. 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 IF(itag(m2,i3) == 0 .AND. itag(k2,i1) == 0)
THEN
622 ELSEIF(itag(m2,i3) /= 0 .AND. itag(k2,i1) == 0)
THEN
623 itag(k2,i1)=itag(m2,i3)
624 ELSEIF(itag(m2,i3) == 0 .AND. itag(k2,i1) /= 0)
THEN
625 itag(m2,i3)=itag(k2,i1)
626 ELSEIF(itag(m2,i3) /= 0 .AND. 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 IF (itag(k1,i1) == 0 .AND. itag(1,i2) == 0)
THEN
673 IF(itag(1,i3) == 0)
THEN
678 itag(k2,i1)=itag(1,i3)
680 ELSEIF(itag(k1,i1) == 0 .AND. 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 ELSEIF(itag(k1,i1) /= 0 .AND. 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 IF((ityp(i1) /= 3 .AND. ityp(i2) /= 3) .OR.
734 . (ityp(i1) == 3 .AND. ityp(i2) == 3) )
THEN
735 IF (itag(1,i1) == 0 .AND. itag(1,i2) == 0)
THEN
739 ELSEIF(itag(1,i1) == 0 .AND. 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 IF(ityp(i1) == 3 .AND. ityp(i2) == 3)
THEN
755 IF (itag(2,i1) == 0 .AND. itag(2,i2) == 0)
THEN
759 ELSEIF(itag(2,i1) == 0 .AND. 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 IF (itag(1,j) == i .OR. itag(2,j) == i) ii=ii+1
786 IF (ii/=0) npolh=npolh+1
788 IF (npolh>npolhmax)
THEN
798 IF (itag(1,j) == i .OR. itag(2,j) == i) ii=ii+1
806 IF (itag(1,j) == i .OR. 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