Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
4.8 KiB

2 years ago
C Copyright(C) 1999-2020 National Technology & Engineering Solutions
C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
C NTESS, the U.S. Government retains certain rights in this software.
C
C See packages/seacas/LICENSE for details
C=======================================================================
SUBROUTINE wrtray (LENF, NLNKF, LINKF, NXFAC, IXFAC,
& XN, YN, ZN, IELBST, BLKCOL, IDELB, *)
C=======================================================================
C --*** WRTRAY *** (DETOUR) Write polygons to rayshade input file
C --
C --WRTRAY writes the polygons to a rayshade input file format.
C --
C --Parameters:
C -- LENF - IN - the cumulative face counts by element block
C -- NLNKF - IN - the number of nodes per face
C -- LINKF - IN - the connectivity for all faces
C -- NXFAC - IN - the number of ordered faces (if DOIXF)
C -- IXFAC - IN - the indices of the ordered faces (if DOIXF)
C -- XN, YN, ZN - IN - the nodal coordinates
C -- IELBST - IN - the element block status (>0 if selected)
C -- BLKCOL - IN/OUT - the user selected colors of the element blocks.
C -- BLKCOL(0) = 1 if the user defined material
C -- colors should be used in mesh plots.
C -- = -1 if program selected colors should
C -- be used.
C -- BLKCOL(i) = the user selected color of element
C -- block i:
C -- -2 - no color selected by user.
C -- -1 - black
C -- 0 - white
C -- 1 - red
C -- 2 - green
C -- 3 - yellow
C -- 4 - blue
C -- 5 - cyan
C -- 6 - magenta
C -- * - return statement if the cancel function is active
C --
C --Common Variables:
C -- Uses NUMEL, NELBLK of /DBNUMS/
C -- Uses IS3DIM of /D3NUMS/
include 'dbname.blk'
include 'dbnums.blk'
include 'd3nums.blk'
INTEGER LENF(0:NELBLK)
INTEGER NLNKF(NELBLK)
INTEGER LINKF(*)
INTEGER IXFAC(*)
REAL XN(*), YN(*), ZN(*)
INTEGER IELBST(NELBLK)
INTEGER BLKCOL(0:NELBLK)
INTEGER IDELB(*)
REAL XPTS(0:20), YPTS(0:20), ZPTS(0:20)
CHARACTER*20 STRING
CHARACTER*2048 FILNAM
SAVE NFIL
DATA NFIL /0/
C ... Open the output file.
filnam = basenam(:lenstr(basenam)) // '.ray'
lnam = lenstr(filnam)
NFIL = NFIL + 1
IF (NFIL .GT. 1) then
call intstr (1, -1, NFIL, STRING, LSTR)
FILNAM(LNAM+1:LNAM+LSTR) = STRING(:LSTR)
LNAM = LNAM + LSTR
END IF
open (unit=95, file=filnam(:lnam), form='formatted',
* status='unknown')
PI = ATAN2(0.0, -1.0)
xmin = 1.0e38
ymin = 1.0e38
zmin = 1.0e38
xmax =-1.0e38
ymax =-1.0e38
zmax =-1.0e38
LSTBLK = -999
DO 100 IX = 1, NXFAC
IFAC = IXFAC(IX)
IELB = 0
IXL = IDBLNK (IELB, IFAC, LENF, NLNKF)
if (lstblk .ne. ielb) then
write (string, 900) idelb(ielb)
call pckstr (1, string)
lstr = lenstr(string)
lstblk = ielb
end if
NNPF = NLNKF(IELB)
do 90 ilink = 0, nnpf-1
XPTS(ILINK) = XN(LINKF(IXL+ILINK))
YPTS(ILINK) = YN(LINKF(IXL+ILINK))
ZPTS(ILINK) = ZN(LINKF(IXL+ILINK))
xmin = min(xmin, xpts(ilink))
ymin = min(ymin, ypts(ilink))
zmin = min(zmin, zpts(ilink))
xmax = max(xmax, xpts(ilink))
ymax = max(ymax, ypts(ilink))
zmax = max(zmax, zpts(ilink))
90 continue
write (95, 910) string(:lstr),
* (xpts(i), ypts(i), zpts(i),i=0, nnpf-1)
100 CONTINUE
write (*,*) 'RAYSHADE polygon file written to ',filnam(:lnam)
write (*,*)
write (*,920) 'X', xmin, xmax, xmax-xmin, (xmin+xmax)/2
write (*,920) 'Y', ymin, ymax, ymax-ymin, (ymin+ymax)/2
write (*,920) 'Z', zmin, zmax, zmax-zmin, (zmin+zmax)/2
write (*,*)
dmax = max(xmax-xmin, ymax-ymin) / 2.0
do 110 i=1, 9
fov = i * 5.0
angle = FOV/2.0 * PI/180.
zdist = dmax / tan(angle)
eyep = zmax + zdist
write (*,930) eyep, FOV
110 continue
write (*,*)
close (95)
RETURN
900 FORMAT ('id',i10)
910 format ('poly ',A, 20(1pe13.5))
920 format (A1,': Min =',1pe11.3,' Max =',1pe11.3,' Range =',
* 1pe11.3,' Center =',1pe11.3)
930 FORMAT ('Z-coordinate of eye point =',1pe11.3,' for a ',
* 0pf4.1,' degree field of view')
END