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.
161 lines
5.2 KiB
161 lines
5.2 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 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-----------------------------------------------------------------------
|