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.
 
 
 
 
 
 

160 lines
5.2 KiB

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 setcol(nelblk, shdcol, ishdcl, ielbst, blkcol, idelb)
C-----------------------------------------------------------------------
external blkdat
C ... SHDCOL(1, *) = Red Component
C SHDCOL(2, *) = Green Component
C SHDCOL(3, *) = Blue Component
C SHDCOL(4-7,*) - Future Use
REAL SHDCOL(7,NELBLK)
C ... ISHDCL(1, *) = -1 if color not set, >0 if color set
C ISHDCL(2, *) = Number of colors to use for this block (SET if 0)
C ISHDCL(3, *) = Starting location in color map (SET)
INTEGER ISHDCL(3,NELBLK)
INTEGER IELBST(NELBLK)
INTEGER BLKCOL(0:NELBLK)
INTEGER IDELB(*)
LOGICAL BLKCLR
integer IPARMS(3)
character*80 string
include 'icrnbw.blk'
include 'light.blk'
logical first
save first
data first /.TRUE./
if (FIRST) THEN
FIRST = .FALSE.
call grcolu('ALTERNATE')
call grspar('SPECTRUM', -1, 256, STRING)
end if
blkclr = .FALSE.
do 10 i = 1, NELBLK
if (ielbst(i) .gt. 0 .and. ishdcl(1,i) .gt. 0) then
blkclr =.TRUE.
ishdcl(1,i) = i
end if
10 continue
if (blkclr) then
C ... Determine whether any of the block colors match.
do 18 iblk = 1, nelblk
if (ishdcl(1,iblk) .eq. iblk .and. ielbst(iblk) .gt. 0) then
ired = int(10000 * shdcol(1,iblk))
igrn = int(10000 * shdcol(2,iblk))
iblu = int(10000 * shdcol(3,iblk))
do 16 i = iblk+1, nelblk
if (ielbst(i) .gt. 0) then
if (ired .eq. int(10000 * shdcol(1,i)) .and.
* igrn .eq. int(10000 * shdcol(2,i)) .and.
* iblu .eq. int(10000 * shdcol(3,i))) then
ishdcl(1,i) = iblk
ishdcl(2,iblk) = max(ishdcl(2,iblk), ishdcl(2,i))
ishdcl(2,i) = ishdcl(2,iblk)
end if
end if
16 continue
end if
18 continue
ncol = 0
icol = 0
do 20 iblk = 1, NELBLK
if (ielbst(iblk) .gt. 0 .and. ishdcl(1,iblk) .eq. iblk) then
if (ishdcl(2, iblk) .eq. 0) then
icol = icol + 1
else
ncol = ncol + ishdcl(2, iblk)
end if
end if
20 continue
C ... If number of colors not set for at least one block,
C determine number of colors specified vs. spectrum colors,
C divide remainder of colors to unspecified blocks
call grgpar('SPECTRUM', 0, IPARMS, STRING)
NUMCOL = IPARMS(2)
IF (NCOL .GT. NUMCOL) then
call prterr ('FATAL','Maximum number of colors exceeded')
end if
if (icol .gt. 0) then
icol = (numcol - ncol) / icol
ncol = numcol
else
C ... If number of colors set for all blocks, allocate that many colors.
call grspar('SPECTRUM', -1, min(NCOL,NUMCOL), STRING)
end if
mincol = 0
do 30 iblk = 1, NELBLK
if (ielbst(iblk) .gt. 0) then
if (ishdcl(2, iblk) .eq. 0) ishdcl(2,iblk) = icol
if (ishdcl(1, iblk) .eq. iblk) then
ishdcl(3,iblk) = mincol
mincol = mincol + ishdcl(2, iblk)
else
ishdcl(3,iblk) = ishdcl(3,ishdcl(1,iblk))
end if
end if
30 continue
C ... Set the spectrum
do 50 iblk = 1, nelblk
if (ielbst(iblk) .gt. 0 .and. ishdcl(1,iblk) .eq. iblk) then
ncol = ishdcl(2, iblk)
mincol = ishdcl(3, iblk)
if (ncol .gt. 1) then
R = (1.0 / ambient) ** (1.0 / (ncol-1))
else
R = 1.0
end if
do 40 i = 0, ncol-1
if (ncol .eq. 1) then
hue = 1.0
else
hue = ambient * R**i
end if
red = min(1.0, hue * shdcol(1, iblk) )
green = min(1.0, hue * shdcol(2, iblk) )
blue = min(1.0, hue * shdcol(3, iblk) )
CALL PLTCOL (i+mincol+8, red, green, blue)
40 continue
end if
50 continue
call prnshd (nelblk, idelb, ishdcl, shdcol, ielbst)
else
C ... Single color for entire model
mincol = 0
call grgpar('SPECTRUM', 0, IPARMS, STRING)
NCOL = IPARMS(1)
do 80 iblk = 1, nelblk
ishdcl(2,iblk) = ncol
ishdcl(3,iblk) = mincol
80 continue
if (ncol .gt. 1) then
R = (1.0 / ambient) ** (1.0 / (ncol-1))
else
R = 1.0
end if
do 90 i=0, NCOL-1
hue = ambient * R**i
red = min(1.0, (hue * RMULT))
green = min(1.0, (hue * GMULT))
blue = min(1.0, (hue * BMULT))
CALL PLTCOL (i+8, red, green, blue)
90 continue
end if
call grcolu('ALTERNATE')
return
end
C-----------------------------------------------------------------------