|
plotclaw.f.html |
|
|
Source file: plotclaw.f
|
|
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib
|
|
Converted: Sun May 15 2011 at 19:16:15
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
program main
c
c This is the graphics driver program for AMR, the Adaptive
c Mesh Refinement code. It reads commands and data from
c the file connected to unit 5, which should have been
c produced by AMR.
c Currently this program produces (1) an NCAR metafile
c which can be viewed on a tex4014 terminal or sent to the
c a high quality film processor, and (2) a log file indicating
c what has been produced on each frame of the graphics file.
c
c This program has the capability to plot:
c (1) The physical orientation of the grids at a given timestep
c (2) "Cluster" plots produced during error estimation
c (3) Contour plots of solution values and derived quantities
c at timesteps in which these values are available.
c A composite contour plot is produced for each selected
c variable using the best data available at each point
c in the physical domain. Other plots are available by
c interactively selecting them from a menu.
c
c At present, only the third capibility (contour plots) is
c on by default. The other two may be selected interactively
c by the "options" menu.
c Note: even when option 1 is turned off, a frame containing
c the physical orientation of the grids within the
c problem domain is produced before each series of
c contour plots.
c
c When the program is run, several menus are presented to the
c user. The first asks which variables and derived values (such
c as Density or Log of Entropy) should be plotted. The second menu
c lists some plotting options. These include the two options
c listed above plus (3) an option to produce a sequence of
c contour plots, one for each indicidual grid, (4) an option
c to show the orientation of the individual grids superimposed
c on the composite plot, (5) an option to produce a composite
c plot for each level, using only the data available on that
c level, and (6) an option to produce a composite plot of
c all levels greater than 1.
c
c Finally, the user is prompted for a threshold time, before
c which no plots are produced.
c
c The menu of variables to plot can be extended and modified
c by changing the the definitions of "numvars", "names",
c and "namelen" defined in the common blocks "userdef" and
c "userdef2" below.
c The new variables can be computed from the given variables
c in subroutine "derive". See also subroutine "getinput"
c for how the menu is produced, although this should not have
c to be changed.
include "call.i"
c
character*30 timestmp
character*10 command
character*50 cline, line, bline
character*3 cmd, cluster, drawtree, plotgrid
character*8 str
integer clen, framecnt, numptc(maxcl)
integer oldmode
logical gprint2, plotclus, plottree, echo
logical allgrids, levplots, fineplot, plotbox
logical nocomp, lineplot
c
c
c :::::::: User defined variable definitions
c :::::::: "numvars" is the number of variables that
c :::::::: can be viewed.
c :::::::: "name" is a character array containing the
c :::::::: names of these variables
c :::::::: "namelen" is an array of the lengths of the above
c :::::::: variable names
c :::::::: "noplot" if a logical array set in "getinput" that
c :::::::: determines whether the corresponding
c :::::::: variable has been selected for plotting
c
integer numvars, namelen(15), blen, blinelen
character name(15)*15, bname*15
logical noplot(15)
common /userdef/ numvars, namelen, noplot
common /userdef2/ name
data numvars/10/
data name/"DENSITY ","X VELOCITY ","Y VELOCITY ",
1 "TOTAL VELOCITY ","TOTAL ENERGY ","PRESSURE ",
1 "ENTROPY ","MACH NUMBER ","ENTHALPY ",
1 "LOG DENSITY "," "," ",
1 " "," "," "/
data namelen/7,10,10,14,12,8,7,11,8,11,0,0,0,0,0/
data bname/"BODYPLOT "/
data blen/8/
data gprint2/.true./
data echo/.false./
c
c *****************************************************************
c graphics driver - reads in file generated by amr output routines:
c and generates the requested graphics output
c the commands are:
c basic time - what follows is lfine,levellist, and grid
c info. from levels lst to lend
c vals mgrid, nvar - soln values follow
c if (mgrid <> 0) only grid mgrid values else entire
c level from lst to lend
c nvar = number of variables to be read for each grid point
c clusters nclust, lpar - cluster info. follows
c nclust = num. of clusters, lpar = level being examined
c in each option, more info. if read in according to that option.
c *****************************************************************
c
c
oldmode = ieee_handler("set","common",SIGFPE_ABORT)
if (oldmode .ne. 0) then
write(6,*) ' did not set floatingpt. traps right '
stop
endif
open(3,file='plotfile',status='old',form='formatted')
open(16,file='ploterr',status='unknown',form='formatted')
open(7,file='plotlog',status='unknown',form='formatted')
call opngks
call ctable
call initspac
c ::::::::: Get variable list and time threshold
call getinput( thresh, allgrids, levplots, fineplot, plotbox,
1 plotclus, plottree, nocomp ,lineplot)
c ::::::::: Initialize command patterns
cluster = "CLU"
drawtree = "DTR"
plotgrid = "VAL"
framecnt = 0
c ::::::::: Read time stamp
10 str = " "
timestmp = "TIME = "
lentime = 7
read(3,101,end=99) str, time
101 format( a8, f10.5 )
if (index(str,'*TIME') .le. 0) then
write(6,*) "Illegal time stamp: ",str
call clsgks
stop
endif
str = " "
write(str,111) time
111 format( f8.3 )
c ::::::: skip leading blanks in time string
do 20 K = 1, len(str)
if (str(K:K) .ne. ' ') then
lentime = lentime + 1
timestmp(lentime:lentime) = str(K:K)
endif
20 continue
c ::::::::: Now read in the graph structure
c ::::::::: NOTE: The graph structure is dumped by AMR
c ::::::::: after every timestamp is produced.
call basic(lst,lend)
c ::::::::: Now read the command
command = " "
cmd = " "
read(3,102,end=99) command, ivar1, ivar2, ivar3
102 format( a10, 3i10 )
if (echo) then
write(16,103) str, command, ivar1, ivar2, ivar3, lst, lend
103 format(' Time Stamp: ',a15,/,' Input Command: ',a10,3i10,
* /,' lst, lend: ',2i10 )
endif
I = index(command,'*')
if (I .le. 0) then
write(6,*) "Illegal Command Line: ",command
call clsgks
stop
endif
cmd = command(I+1:I+3)
c ::::::::: Now process the command
if (cmd .eq. plotgrid) then
c read the grid values and plot contours
nvar = ivar1
call invals(lst,lend,nvar,thresh)
if (time .ge. thresh) then
if (plottree) then
c :::::::: Draw the grid overlap structure
c :::::::: before drawing the variables
c :::::::: since plottree is turned off
call dtree(1,lfine,timestmp,lentime,gprint2)
framecnt = framecnt + 1
write(7,299) framecnt, "DRAWTREE", timestmp
call frame
endif
c :::::::: Produce a series of plots for each
c :::::::: variable selected.
do 50 ivar = 1, numvars
if (noplot(ivar)) goto 50
line = name(ivar)(1:namelen(ivar))// ", " //timestmp
bline = bname(1:blen)// ", " //timestmp
linelen = lentime + namelen(ivar) + 2
blinelen = lentime + blen + 2
c :::::::: cycle through grids computing quantities
c :::::::: to be plotted.
level = lst
150 if (level .le. lend) then
mptr = lstart(level)
160 if (mptr .ne. 0) then
c nrows = node(maxnumrow,mptr) + 1
c ncols = node(maxnumcol,mptr) + 1
nrows = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncols = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
locvar = node(tempptr,mptr)
loc = igetsp(nrows*ncols)
node(store1,mptr) = loc
call derive(alloc(locvar),alloc(loc),
1 nrows,ncols,nvar,ivar)
mptr = node(levelptr,mptr)
goto 160
endif
level = level + 1
goto 150
endif
c ::::::: plot all grids for variable ivar
if (lineplot) then
call lplotx(framecnt,line,linelen)
else
call dvals(lst,lend,line,linelen,nvar,
1 ivar,framecnt,allgrids,levplots,fineplot,
2 plotbox,bline,blinelen,nocomp)
endif
50 continue
endif
c ::::::::: Reclaim space used by each grid
level = lst
60 if (level .le. lend) then
mptr = lstart(level)
70 if (mptr .ne. 0) then
c nrows = node(maxnumrow,mptr) + 1
c ncols = node(maxnumcol,mptr) + 1
nrows = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncols = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
locvar = node(tempptr,mptr)
call reclam( locvar, nrows*ncols*nvar )
node(tempptr,mptr) = 0
mptr = node(levelptr,mptr)
go to 70
endif
level = level + 1
goto 60
endif
c :::::::: read the next command
go to 10
endif
c
if (cmd .eq. cluster) then
c ::::::: plot the clusters
nclust = ivar1
lpar = ivar2
nxypts = ivar3
if (nclust .gt. maxcl) then
write(16,104) maxcl, nclust
104 format(" Cannot read more than ",i3,
1 " clusters: nclust = ",i3)
go to 99
endif
locbad = igetsp( 2*nxypts )
call inclus(nclust,numptc,nxypts,alloc(locbad),mkid,echo)
if ( plotclus .and. ( time .ge. thresh)) then
if (nclust .gt. maxcl) then
write(16,109) nclust
109 format( " Cannot plot so many clusters:",
1 " nclust = ",i4,/,
2 " ... Skipping to next command")
write(7,119) nclust
119 format( " ... Skipping cluster plot: nclust = ",
1 i4," > maxcl")
else
cline = timestmp//" "
clen = lentime + 10
cline(lentime+1:clen) = ", (BEFORE)"
call dclust(nclust,numptc,nxypts,alloc(locbad),
1 lpar,lstart(lpar+1),cline,clen,.false.)
framecnt = framecnt + 1
write(7,199) framecnt, "CLUSTER ", cline
call frame
cline(lentime+1:clen) = ", (AFTER) "
call dclust(nclust,numptc,nxypts,alloc(locbad),
1 lpar,mkid,cline,clen,.true.)
framecnt = framecnt + 1
write(7,199) framecnt, "CLUSTER ", cline
call frame
199 format( "Frame# ",i3,2x,a8,2x,a50)
endif
endif
call reclam( locbad, 2*nxypts )
c read next command
go to 10
endif
c
if (cmd .eq. drawtree) then
c draw the overlaping rectangles to show grid arrangement
if (plottree .and. (time .ge. thresh)) then
call dtree(1,lfine,timestmp,lentime,gprint2)
framecnt = framecnt + 1
write(7,299) framecnt, "DRAWTREE", timestmp
299 format( "Frame# ",i3,2x,a8,2x,a30 )
call frame
endif
go to 10
endif
c
c invalid command read, issue error message and try again
write(16,106) command
106 format( "Unknown Command: ",a10," Try again..." )
go to 10
c
99 call clsgks
stop
end
c
c ------------------------------------------------------------------
c
subroutine getinput(thresh, allgrids, levplots, fineplot,
1 plotbox, plotclus, plottree,
2 nocomp, lineplot )
character varlist*30, temp*20, str*30, str2*10
character ch, lowch, upch, ych
logical allgrids, levplots, fineplot, plotbox
logical plotclus, plottree, nocomp, lineplot
real thresh
integer numvars, namelen(15)
character name(15)*15
logical noplot(15)
common /userdef/ numvars, namelen, noplot
common /userdef2/ name
data ych/'y'/
do 5 I = 1, 15
noplot(I) = .true.
5 continue
varlist = " "
do 10 I = 1, numvars
ch = char( ichar( 'A' ) + I - 1 )
write(6,900) ch, name(I)
10 continue
900 format( "Variable Symbol ",a1," = ",a15 )
write(6,*) "Enter symbols of variables to be plotted"
read(5,910) varlist
910 format( a30 )
c ::::::: now parse varlist to find variable indices
c ::::::: both lower and upper case inputs are accepted
ilen = 0
temp = " "
do 20 I = 1, numvars
lowch = char( ichar( 'a' ) + I - 1 )
upch = char( ichar( 'A' ) + I - 1 )
ixch = index(varlist,lowch) + index(varlist,upch)
if (ixch .gt. 0) then
noplot(I) = .false.
ilen = ilen + 1
temp(ilen:ilen) = upch
endif
20 continue
write(6,950)
950 format(
1 / "A composite contour plot will be generated by default",
2 /,"for each of these variables.",
3 //,"In addition, here is a list of plotting options:",
4 /," S = do not draw a composite contour plot",
6 /," U = draw grid tree on EACH available timestep",
7 /," V = show CLUSTER plots on EACH available timestep",
8 /," W = produce a contour plot of each grid separately",
9 /," X = draw boxes around individual grids in composite",
1 /," Y = produce a contour plot at each level",
2 /," Z = produce a contour plot of (2) finest levels",
3 /," L = produce a line plot through domain in x",
4 /,"Enter symbols of selected options (if any):" )
varlist = " "
read(5,910) varlist
ix = index(varlist,'S') + index(varlist,'s')
nocomp = (ix .gt. 0)
ix = index(varlist,'U') + index(varlist,'u')
plottree = (ix .gt. 0)
ix = index(varlist,'V') + index(varlist,'v')
plotclus = (ix .gt. 0)
ix = index(varlist,'W') + index(varlist,'w')
allgrids = (ix .gt. 0)
ix = index(varlist,'X') + index(varlist,'x')
plotbox = (ix .gt. 0)
ix = index(varlist,'Y') + index(varlist,'y')
levplots = (ix .gt. 0)
ix = index(varlist,'Z') + index(varlist,'z')
fineplot = (ix .gt. 0)
ix = index(varlist,'L') + index(varlist,'l')
lineplot = (ix .gt. 0)
c
30 str = " "
str2 = " "
write(6,920)
920 format(//,' Enter minimum timestep to be plotted')
read(5,110) str(10:30)
110 format( a20 )
ix = index(str,'.')
if (ix .le. 0) then
write(6,*) "ERROR: Real number must have a decimal point"
goto 30
endif
str2(1:10) = str(ix-4:ix+5)
read(str2,120,err=999) thresh
120 format( f10.5 )
c write(6,909) temp(1:ilen), thresh
909 format("Selected Variables = ",a,", Minumum Timestep = ",f10.5)
return
999 write(6,*) "Error in reading TIME threshold"
goto 30
end
c
c ----------------------------------------------------------------
c
c ::::::: This subroutine is used to derive the values
c ::::::: of the variables to be plotted from the values
c ::::::: read in by subroutine "invars"
c
subroutine derive(val,derval,nrows,ncols,nvar,ivar)
dimension val(nrows,ncols,nvar), derval(nrows,ncols)
integer nrows, ncols, nvar, ivar
data gamma/1.4/
data spval2/-1.0e10/, spval/1.0e10/
gamm1 = gamma - 1.0
if (ivar .eq. 1 .or. ivar .eq. 10) then
c ::::::: Return Density (or Log density)
if (ivar .eq. 1) then
do 100 J = 1, ncols
do 110 I = 1, nrows
derval(I,J) = val(I,J,1)
110 continue
100 continue
else
do 101 J = 1, ncols
do 111 I = 1, nrows
if (val(I,J,1) .eq. spval) then
derval(I,J) = spval2
else
derval(I,J) = alog(val(I,J,1))
endif
111 continue
101 continue
endif
elseif (ivar .le. 3) then
c ::::::: return Velocity
do 200 J = 1, ncols
do 210 I = 1, nrows
if (abs(val(I,J,ivar)) .eq. spval) then
derval(I,J) = spval2
else
derval(I,J) = val(I,J,ivar)/val(I,J,1)
endif
210 continue
200 continue
elseif ( ivar .eq. 4) then
c ::::::: Return Total Velocity
do 300 J = 1, ncols
do 310 I = 1, nrows
if (abs(val(I,J,1)) .eq. spval) then
derval(I,J) = spval2
else
derval(I,J) = (val(I,J,2)**2 + val(I,J,3)**2)
1 /(val(I,J,1)**2)
endif
310 continue
300 continue
elseif ( ivar .eq. 5 ) then
c ::::::: Return Energy per unit volume
do 400 J = 1, ncols
do 410 I = 1, nrows
if (abs(val(I,J,1)) .eq. spval) then
derval(I,J) = spval2
else
derval(I,J) = val(I,J,4)/val(I,J,1)
endif
410 continue
400 continue
elseif ( ivar .le. 7 .or. ivar .eq. 9) then
c ::::::: Return Pressure or Entropy or Enthalpy...
c ::::::: First compute Pressure
do 500 J = 1, ncols
do 510 I = 1, nrows
if (abs(val(I,J,1)) .eq. spval) then
derval(I,J) = spval2
else
derval(I,J) = gamm1*(val(I,J,4) - (val(I,J,2)**2 +
1 val(I,J,3)**2)/(2.0*val(I,J,1)))
endif
510 continue
500 continue
if ( ivar .eq. 7 ) then
c ::::::: Compute Entropy using computed pressure
do 600 J = 1, ncols
do 610 I = 1, nrows
if (abs(val(I,J,1)) .ne. spval) then
derval(I,J) = alog(derval(I,J)) -
1 gamma*alog(val(I,J,1))
endif
610 continue
600 continue
endif
if ( ivar .eq. 9 ) then
c ::::::: Compute Enthalpy
do 603 J = 1, ncols
do 613 I = 1, nrows
if (abs(val(I,J,1)) .ne. spval) then
derval(I,J) = (derval(I,J)+val(I,J,4))/(val(I,J,1))
endif
613 continue
603 continue
endif
elseif (ivar .eq. 8) then
c ::::::: Return Mach Number
do 700 J = 1, ncols
do 710 I = 1, nrows
if (abs(val(I,J,1)) .eq. spval) then
derval(I,J) = spval2
else
vel2 = (val(I,J,2)**2 + val(I,J,3)**2)
1 /(val(I,J,1)**2)
p = gamm1*(val(I,J,4)-(val(I,J,2)**2 +
1 val(I,J,3)**2)/(2.0*val(I,J,1)))
c2 = gamma*p / val(I,J,1)
derval(I,J) = sqrt(vel2/c2)
endif
710 continue
700 continue
c
endif
return
end
subroutine initspac
include "call.i"
c
c ::::::::: Initialize the data space "alloc" and its free list "lfree"
c ::::::::: to be one contiguous block from which chunks will be
c ::::::::: allocated on a first fit basis by routine "igetsp".
c
c
c ::::::::: clear data space
do 10 i = 1, memsize
alloc(i) = 0.0
10 continue
c
c ::::::::: initialize the free list so that:
c ::::::::: Location 1 is a dummy header node
c ::::::::: Location 2 starts at position 1 and contains memsize elements
c ::::::::: Location 3 starts at position 645000 and contains 0 elements
c ::::::::: All remaining loctions are marked as empty
lenf = 3
idimf = lfdim
do 20 i = 1, idimf
lfree( i, 1 ) = 0
lfree( i, 2 ) = 0
20 continue
lfree( 2, 1 ) = 1
lfree( 2, 2 ) = memsize
lfree( 3, 1 ) = memsize + 2
c
return
end
c
c ------------------------------------------------------------------
c
function igetsp (nwords)
c
include "call.i"
logical sprint2
data sprint2/.false./
c
c allocate contiguous space of length nword in main storage array
c alloc. user code (or pointer to the owner of this storage)
c is mptr. lenf = current length of lfree list.
c
c
c find first fit from free space list
c
itake = 0
do 20 i = 1, lenf
if (lfree(i,2) .ge. nwords) then
itake = i
goto 25
endif
20 continue
c ::::::::: if we got here, there is not enough memory left :::::
c ::::::::: to satisfy the request. :::::
write(16,901) nwords
901 format(' require ',i10,' words - either none left or not big',
1 ' enough space')
call clsgks
stop
c
c ::::::::: request is satisfied, now allocate memory :::::
25 left = lfree(itake,2) - nwords
igetsp = lfree(itake,1)
c
if (left .gt. 0) then
c ::::::::: retain the unused part of this memory :::::
lfree(itake,2) = left
lfree(itake,1) = lfree(itake,1) + nwords
else
c ::::::::: item is totally removed, move others in the list :::::
c ::::::::: up one space :::::
lenf = lenf - 1
do 40 i = itake, lenf
lfree(i,1) = lfree(i+1,1)
lfree(i,2) = lfree(i+1,2)
40 continue
endif
c
if (sprint2) write(16,100) nwords, igetsp
100 format(' allocating ',i8,' words in location ',i8)
c
return
end
subroutine reclam (index, nwords)
c
c return of space. add to free list.
c iplace points to next item on free list with larger index than
c the item reclaiming, unless said item is greater then
c everything on the list.
c
include "call.i"
logical sprint2
data sprint2/.false./
c
c
c find position in free list
c
do 20 i = 1, lenf
iplace = i
if (lfree(i,1) .gt. index) goto 30
20 continue
c
c no position found, error
c (?? what is the last piece of memory is returned ??)
c
write(16,902)
902 format(' no insertion pointer into freelist. error stop')
call clsgks
stop
c
c try to merge this memory back into the free list
c
30 iprev = iplace - 1
if ((iprev .ne. 0) .and.
1 ((lfree(iprev,1) + lfree(iprev,2)) .eq. index) ) then
c
c merge with previous segment
c
lfree(iprev,2) = lfree(iprev,2) + nwords
c
c try to merge with following segment as well
c
if (lfree(iplace,1) .eq. (index + nwords)) then
lfree(iprev,2) = lfree(iprev,2) + lfree(iplace,2)
ipp1 = iplace + 1
do 60 i = ipp1, lenf
lfree(i-1,1) = lfree(i,1)
lfree(i-1,2) = lfree(i,2)
60 continue
lenf = lenf - 1
endif
c
c no previous merge, try to merge with next segment
c
elseif (lfree(iplace,1) .eq. (index + nwords)) then
lfree(iplace,1) = index
lfree(iplace,2) = lfree(iplace,2) + nwords
c
c no merges at all, try to insert new segment in the
c free list by bumping subsequent segments
c
elseif (lenf .ne. idimf) then
do 80 ii = iplace, lenf
i = lenf + 1 - ii + iplace
lfree(i,1) = lfree(i-1,1)
lfree(i,2) = lfree(i-1,2)
80 continue
lenf = lenf + 1
lfree(iplace,1) = index
lfree(iplace,2) = nwords
c
c no room in free list to add segment. error.
c
else
write(16,901) idimf
901 format(' free list full with ',i5,' items')
call clsgks
stop
endif
if (sprint2) write(16,100) nwords, index
100 format(' reclaiming ',i8,' words at loc. ',i8)
return
end
subroutine basic (lst,lend)
c
include "call.i"
common /userdt/ pinf,rhoinf,vinf,chord,alpha,foil,xprob,yprob
c
c read in basic info. generated for every graphics call
c
read(3,102) lfine, (lstart(i),i=1,lfine), lwidth
102 format(10i6)
read(3,105) xupper,yupper,xlower,ylower
105 format(4e15.8)
read(3,102) lst, lend
read(3,106)(hxposs(i),i=1,lfine)
read(3,106)(hyposs(i),i=1,lfine)
106 format(6e13.8)
c
xprob = xupper
yprob = yupper
level = lst
10 if (level .le. lend) then
mptr = lstart(level)
20 if (mptr .ne. 0) then
read(3,103) mptr,(node(i,mptr),i=1,nsize)
103 format(10i7)
read(3,104) (rnode(i,mptr),i=1,rsize)
104 format(5e14.8)
c # here as a reminder
c node(maxnumrow,mptr) = node(ndihi,mptr)-node(ndilo,mptr)+3
c node(maxnumcol,mptr) = node(ndjhi,mptr)-node(ndjlo,mptr)+3
mptr = node(levelptr,mptr)
go to 20
endif
30 level = level + 1
go to 10
endif
c
return
end
subroutine inclus(nclust,numptc,nxypts,badpts,mkid,echo)
c
include "call.i"
dimension numptc(nclust), badpts(2,nxypts)
logical echo
c
c read in info. to plot grids, flagged pts., clusters, new grids.
c
read(3,105) iregsz,jregsz
105 format(6i10)
read(3,100) (numptc(i),i=1,nclust)
100 format(10i6)
if (echo) then
write(16,102) nclust, (numptc(i),i=1,nclust)
102 format(' no. of clusters ',i5, ' with no. of points ',
1 4(/,10x,15i5))
endif
read(3,101)((badpts(i,j),i=1,2),j=1,nxypts)
101 format(4e12.4)
c
c there is always at least one subgrid, since the output routine
c is only called if there is at least one flagged pt.
mkid = 0
20 continue
read(3,103) minput, (node(i,minput),i = 1,nsize)
103 format(10i6)
if (mkid .eq. 0) mkid = minput
read(3,104) (rnode(i,minput), i = 1,rsize)
104 format(5e12.4)
minput = node(levelptr, minput)
if (minput .ne. 0) go to 20
c
return
end
subroutine dclust(nclust,numptc,nxypts,badpts,lpar,mkid,
1 cline,clen,second)
c
c draw existing grids level lpar, flagged points in their clusters,
c and fine subgrids starting with mkid.
c mkid may be start of old or new (i.e. not yet in place in lstart)
c level of subgrids.
c
include "call.i"
character*1 isign(50), usesign
character*50 cline
integer clen
logical gprint2, second
c
dimension numptc(nclust), badpts(2,nxypts)
data isign/'A','B','C','D','E','F','G','H',
1 'I','J','K','L','M','N','O','P',
2 'Q','R','S','T','U','V','W','X',
3 'Y','Z','1','2','3','4','5','6',
4 '7','8','9','0','+','-','*', '/',
5 '<','>','?','!','"','#','$','%',
6 '&',':'/
data gprint2/.false./
c
call dtree(lpar,lpar,cline,clen,gprint2)
c
ist = 0
do 10 icl = 1, nclust
npts = numptc(icl)
do 20 i = 1, npts
xpt = xlower + badpts(1,ist+i)*hxposs(lpar)
ypt = ylower + badpts(2,ist+i)*hyposs(lpar)
if (second) then
usesign = '+'
else
usesign = isign(icl)
endif
call pwrit(xpt,ypt,usesign,1,0,0,0)
20 continue
ist = ist + numptc(icl)
10 continue
c
c output new fine subgrids
c
mnew = mkid
30 if (mnew .ne. 0) then
call drect(mnew,gprint2)
mnew = node(levelptr,mnew)
go to 30
endif
c
return
end
subroutine invals (lst,lend,nvar,thresh)
c
include "call.i"
integer charst(10)
data lstar/1h*/,lexs/1hS/
c
spval = 1.0e10
c
c read in soln values for val option of graphics package
c
level = lst
10 if (level .le. lend) then
mptr = lstart(level)
20 if (mptr .ne. 0) then
read(3,100) charst,minput
100 format(10a1,i10)
if (charst(1).ne.lstar .or. charst(2).ne.lexs .or.
* minput .ne. mptr) then
write(16,901) charst,mptr,minput,lst,lend
901 format(1h ,10a1,/,1x,4i10)
call clsgks
stop
endif
c ::::::::: Data dumped in an array (2..maxrows,2..maxcols)
c ::::::::: need to allocate an array (1..maxrows+1,1..maxcols+1)
c ::::::::: to add possible boundary values
c nrows = node( maxnumrow,mptr ) + 1
c ncols = node( maxnumcol,mptr ) + 1
nrows = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncols = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
num = nrows*ncols
ist = igetsp(num*nvar)
node(tempptr,mptr) = ist
call readvals(alloc(ist),nrows,ncols,nvar)
mptr = node(levelptr,mptr)
go to 20
endif
level = level + 1
go to 10
endif
c
c add boundary values for each grid, all variables, for smooth
c contour plotting at grid interfaces
c
c don't bother if below threshold time for plotting
c
time = rnode(timemult,lstart(lst))
if (time .lt. thresh) go to 99
c
c find corners
c
xlo = 1.e23
ylo = 1.e23
xhi = -1.e23
yhi = -1.e23
mptr = lstart(1)
40 if (mptr .ne. 0) then
xhi = amax1(xhi,rnode(cornxhi,mptr))
yhi = amax1(yhi,rnode(cornyhi,mptr))
xlo = amin1(xlo,rnode(cornxlo,mptr))
ylo = amin1(ylo,rnode(cornylo,mptr))
mptr = node(levelptr,mptr)
go to 40
endif
c
level = lst
110 if (level .le. lend) then
hx = hxposs(level)
hy = hyposs(level)
mptr = lstart(level)
120 if (mptr .ne. 0) then
c nrow = node(maxnumrow,mptr) + 1
c ncol = node(maxnumcol,mptr) + 1
nrow = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncol = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
call addbndry(level,mptr,alloc(node(tempptr,mptr)),
. nrow,ncol,nvar,xlo,ylo,xhi,yhi,spval,lst,
. hx,hy)
mptr = node(levelptr,mptr)
go to 120
endif
level = level + 1
go to 110
endif
c
c set special value to signal exterior cells within domain
c
99 return
end
c
c -------------------------------------------------------
c
subroutine readvals(a,nrows,ncols,nvar)
dimension a(nrows,ncols,nvar)
do 10 ivar = 1, nvar
read(3,100) ((a(i,j,ivar),i=2,nrows-1),j=2,ncols-1)
10 continue
100 format(5e12.6)
99 return
end
c
c --------------------------------------------------------
c
subroutine dvals(lst,lend,line,linelen,nvar,ivar,
1 framecnt,allgrids,levplots,fineplot,
2 plotbox,bline,blinelen,nocomp)
c
include "call.i"
character line*50, header*50, strtmp*5, bline*50
integer headlen, hlen, framecnt, blinelen
logical nocomp
logical allgrids, levplots, fineplot, plotbox
common /conre4/ sizel, sizem, sizep, nrep, ncrt, ilab,
1 nulbll, ioffd, ext, ioffm, isolid, nla,
1 nlm, xlt, ybt, side
c
c ******************************************************************
c dvals - generate a series of surface, contour, or body plots of every
c grid in a subtree,
c ******************************************************************
c
c
c ::::::::: set NCAR parameter to turn off printing of contour labels :::::
ilab = 0
c
if (.not. allgrids) goto 500
c
c ::::::::: Set up header for contour plots
header = line
header(linelen+1:linelen+7) = ", GRID "
headlen = linelen + 7
c ::::::::: walk through levels from coursest to finest generating a :::::
c ::::::::: separate contour plot for each grid at each level. :::::
level = lst
10 if (level .le. lend) then
mptr = lstart(level)
20 if (mptr .ne. 0) then
c nrow = node(maxnumrow,mptr) + 1
c ncol = node(maxnumcol,mptr) + 1
nrow = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncol = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
loc = node(store1,mptr)
header(headlen:headlen+5) = " "
hlen = headlen
write(strtmp,111) mptr
111 format( i5 )
do 25 K = 1, 5
if (strtmp(K:K) .ne. ' ') then
hlen = hlen + 1
header(hlen:hlen) = strtmp(K:K)
endif
25 continue
c # work with copy of array, don't mess up original.
c # due to setting spval, then too much restored later.
num = nrow*ncol
lcopy = igetsp(num)
do 26 i = 0, num-1
alloc(lcopy+i) = alloc(loc+i)
26 continue
call contor(alloc(lcopy),nrow,ncol,header,hlen,mptr)
call reclam(lcopy,num)
framecnt = framecnt + 1
write(7,199) framecnt, "GRIDPLOT", header
199 format( "Frame# ",i3,2x,a8,2x,a50 )
mptr = node(levelptr,mptr)
goto 20
endif
level = level + 1
go to 10
endif
c
c ::::::::: Produce a composite contour plot in which the grids are :::::
c ::::::::: plotted from finest to coarsest and in such a way that :::::
c ::::::::: coarse grids are "blacked out" in regions where fine :::::
c ::::::::: grids exist. :::::
500 call composit(lst,lend,nvar,ivar,line,linelen,framecnt,
1 levplots, fineplot, plotbox,
2 bline,blinelen,nocomp)
c
return
end
c
c ------------------------------------------------------------
c
subroutine composit(lst, lend, nvar, ivar, line, linelen,
1 framecnt, levplots, fineplot, plotbox,
2 bline, blinelen, nocomp)
c
include "call.i"
character line*50, cline*50, lline*50, fline*50, bline*50
real xmin(maxlv),xmax(maxlv),ymin(maxlv),ymax(maxlv)
integer clen, framecnt, flen, llen, blinelen, blen
logical levplots, fineplot, plotbox, nocomp
common /conre1/ ioffp, spval
common /conre4/ sizel, sizem, sizep, nrep, ncrt, ilab,
1 nulbll, ioffd, ext, ioffm, isolid, nla,
2 nlm, xlt, ybt, side
data ncontor /30/
c ::::::::: set NCAR parameter to turn off printing of contour labels :::::
ilab = 0
nlm = 40
call cpseti('LLP - line label position',0)
call cpsetc('HLT - high/low label text',' ')
call cpsetc('ILT - informational label text',' ')
call cpseti('NCL - number of contour levels',ncontor)
call cpseti('SET - do set call flag',0)
call cpsetr('SPV - set special value ',spval)
c ::::::::: set NCAR parameter to blackout grid points set to spval :::::
ioffp = 1
spval = 1.0e10
spval2 = -1.0e10
c ::::::::: set up header for composite plots
cline(1:50) = line(1:50)
lline(1:50) = line(1:50)
fline(1:50) = line(1:50)
clen = linelen + 11
llen = linelen + 9
flen = linelen + 12
blen = blinelen + 11
cline(linelen+1:clen) = ", COMPOSITE"
lline(linelen+1:llen) = ", LEVEL "
fline(linelen+1:flen) = ", FINE GRIDS"
bline(blinelen+1:blen) = ", COMPOSITE"
c :::::::: compute min and max values, level by level :::::
totmin = 1.0e+10
totmax = -1.0e+10
level = lst
100 if (level .le. lend) then
mptr = lstart(level)
xmin(level) = 1.0e+10
ymin(level) = 1.0e+10
xmax(level) = -1.e+10
ymax(level) = -1.e+10
105 if (mptr .ne. 0) then
c nrows = node(maxnumrow,mptr) + 1
c ncols = node(maxnumcol,mptr) + 1
nrows = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncols = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
loc = node(store1,mptr)
call mnmax(alloc(loc),nrows,ncols,vmin,vmax,spval2)
totmin = amin1( totmin, vmin )
totmax = amax1( totmax, vmax )
xmin(level) = amin1(xmin(level),rnode(cornxlo,mptr))
ymin(level) = amin1(ymin(level),rnode(cornylo,mptr))
xmax(level) = amax1(xmax(level),rnode(cornxhi,mptr))
ymax(level) = amax1(ymax(level),rnode(cornyhi,mptr))
mptr = node(levelptr,mptr)
goto 105
endif
level = level + 1
goto 100
endif
c ::::::: statistics on the lowest level grids
xmin1 = xmin(lst)
ymin1 = ymin(lst)
xmax1 = xmax(lst)
ymax1 = ymax(lst)
lev1 = lstart(lst)
dx = hxposs(lev1)/100.0
dy = hyposs(lev1)/100.0
xlo = xmin1 - dx
ylo = ymin1 - dy
xhi = xmax1 + dx
yhi = ymax1 + dy
c ::::::: set up parameters for contour increments
cinc = (totmax - totmin) / float(ncontor)
cmin = totmin + .5*cinc
cmax = totmax - .5*cinc
c
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c ::::::::::::::: produce composite plots of each level :::::::::::::::
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
if (levplots) then
level = lst
300 if (level .le. lend) then
mptr = lstart(level)
delx = xmax(level) - xmin(level)
dely = ymax(level) - ymin(level)
xlen = .8*amin1( 1.0, delx/dely )
ylen = .8*amin1( 1.0, dely/delx )
x1set = .1
x2set = .1+xlen
y1set = .1
y2set = .1+ylen
call set(.1,.1+xlen,.1,.1+ylen,xmin(level),xmax(level),
1 ymin(level), ymax(level), 1)
dx = hxposs(level)/2.0
dy = hyposs(level)/2.0
320 if (mptr .ne. 0) then
loc = node(store1,mptr)
c nrow = node(maxnumrow,mptr) + 1
c ncol = node(maxnumcol,mptr) + 1
nrow = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncol = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
x1 = rnode(cornxlo,mptr)
y1 = rnode(cornylo,mptr)
x3 = rnode(cornxhi,mptr)
y3 = rnode(cornyhi,mptr)
call drawbox(x1,y1,x3,y3,level)
x1 = x1 - dx
y1 = y1 - dy
x3 = x3 + dx
y3 = y3 + dy
x1ratio = (x1-xmin(level))/(xmax(level)-xmin(level))
x3ratio = (x3-xmin(level))/(xmax(level)-xmin(level))
y1ratio = (y1-ymin(level))/(ymax(level)-ymin(level))
y3ratio = (y3-ymin(level))/(ymax(level)-ymin(level))
call set(x1set+x1ratio*(x2set-x1set),
. x1set+x3ratio*(x2set-x1set),
. y1set+y1ratio*(y2set-y1set),
. y1set+y3ratio*(y2set-y1set),
. 1.5,float(nrow)-.5,1.5,float(ncol)-.5,1)
c ::::::::: plot the contour lines :::::
call setspv(alloc(loc),nrow,ncol,spval)
call conrec( alloc(loc), nrow, nrow, ncol,
1 cmin, cmax, cinc, -1, -1, 0 )
c call cpcnrc( alloc(loc), nrow, nrow, ncol,
c 1 cmin, cmax, cinc, 1, -1, 0 )
c ::::::::: reset the window to that of the coarsest grid :::::
call set(.1,.1+xlen,.1,.1+ylen,xmin(level),xmax(level),
1 ymin(level), ymax(level), 1)
mptr = node(levelptr,mptr)
goto 320
endif
lline(llen:llen) = char( ichar('0') + level )
call set(0.,1.,0.,1.,xmin(level),xmax(level),
1 ymin(level),ymin(level)+1.2*(ymax(level)-ymin(level)),1)
xplace = xmin(level) + (xmax(level)-xmin(level))/4.
yplace = ymin(level)+ (ymax(level)-ymin(level))*1.1
call pwrit(xplace,yplace,lline,llen,2,0,-1)
call gstxci(1)
framecnt = framecnt + 1
write(7,199) framecnt, "GRIDPLOT", lline
call frame
level = level + 1
goto 300
endif
endif
c
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c :::::::::::::::::: BLACKOUT OVERLAP BY FINE GRIDS :::::::::::::::::::
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
level = lst
130 if (level .le. lend) then
mptr = lstart(level)
140 if (mptr .ne. 0) then
c nrow = node(maxnumrow,mptr) + 1
c ncol = node(maxnumcol,mptr) + 1
nrow = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncol = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
num = nrow*ncol
lorg = node(store1,mptr)
lblk = igetsp(num)
do 125 i = 0, num-1
alloc(lblk+i) = alloc(lorg+i)
125 continue
if (level .ne. lend) then
call blackout(mptr,level,alloc(lblk),nrow,ncol,spval)
c write(6,502) mptr, nrow, ncol
502 format("Blackout: mptr, nrow, ncol = ",3(i4,3x) )
endif
c :::::::: create space for the final grid :::::
lrst = igetsp(num)
node(store2,mptr) = lrst
c :::::::: restore boarders of blackened areas :::::
call restore(alloc(lorg),alloc(lblk),alloc(lrst),nrow,
1 ncol,mptr,spval,xlo,ylo,xhi,yhi)
c :::::::: reclaim space used for blackened array :::::
call reclam(lblk,num)
mptr = node(levelptr,mptr)
goto 140
endif
level = level + 1
goto 130
endif
c
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c ::::::::::: PRODUCE A COMPOSITE PLOT OF ALL LEVELS ::::::::::::::::::
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
if (nocomp) go to 95
delx = xmax1 - xmin1
dely = ymax1 - ymin1
xlen = .8*amin1( 1.0, delx/dely )
ylen = .8*amin1( 1.0, dely/delx )
x1set = .1
x2set = .1+xlen
y1set = .1
y2set = .1+ylen
call set( .1,.1+xlen,.1,.1+ylen,xmin1,xmax1,ymin1,ymax1,1)
call drawbox(xmin1,ymin1,xmax1,ymax1,level)
level = lend
80 if (level .ge. lst) then
dx = hxposs(level) / 2.0
dy = hyposs(level) / 2.0
mptr = lstart(level)
90 if (mptr .ne. 0) then
loc = node(store2,mptr)
c nrow = node(maxnumrow,mptr) + 1
c ncol = node(maxnumcol,mptr) + 1
nrow = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncol = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
x1 = rnode(cornxlo,mptr)
y1 = rnode(cornylo,mptr)
x3 = rnode(cornxhi,mptr)
y3 = rnode(cornyhi,mptr)
if (plotbox) call drawbox(x1,y1,x3,y3,level)
xrat1 = (x1-xmin1)/(xmax1-xmin1)
xrat2 = (x3-xmin1)/(xmax1-xmin1)
yrat1 = (y1-ymin1)/(ymax1-ymin1)
yrat2 = (y3-ymin1)/(ymax1-ymin1)
call set(x1set+xrat1*(x2set-x1set),
1 x1set+xrat2*(x2set-x1set),
2 y1set+yrat1*(y2set-y1set),
3 y1set+yrat2*(y2set-y1set),
4 x1,x3,y1,y3,1)
c ::::::::: window into the rectangle defined by this grid :::::
x1 = x1 - dx
y1 = y1 - dy
x3 = x3 + dx
y3 = y3 + dy
x1ratio = (x1-xmin1)/(xmax1-xmin1)
x3ratio = (x3-xmin1)/(xmax1-xmin1)
y1ratio = (y1-ymin1)/(ymax1-ymin1)
y3ratio = (y3-ymin1)/(ymax1-ymin1)
call set(x1set+x1ratio*(x2set-x1set),
. x1set+x3ratio*(x2set-x1set),
. y1set+y1ratio*(y2set-y1set),
. y1set+y3ratio*(y2set-y1set),
. 1.5,float(nrow)-.5,1.5,float(ncol)-.5,1)
c ::::::::: plot the contour lines :::::
call setspv(alloc(loc),nrow,ncol,spval)
c call cpcnrc( alloc(loc), nrow, nrow, ncol,
c 1 cmin, cmax, cinc, 1, -1, 0 )
call conrec( alloc(loc), nrow, nrow, ncol,
1 cmin, cmax, cinc, -1, -1, 0 )
c ::::::::: reset the window to that of the coarsest grid :::::
call set( .1,.1+xlen,.1,.1+ylen,xmin1,xmax1,ymin1,ymax1,1)
mptr = node(levelptr,mptr)
goto 90
endif
level = level - 1
goto 80
endif
call set(0.,1.,0.,1.,xmin1,xmax1,ymin1,ymin1+1.2*(ymax1-ymin1),1)
xplace =xmin1 + (xmax1-xmin1)/4.
yplace = ymin1 + 1.1*(ymax1-ymin1)
call gstxci(1)
call pwrit(xplace,yplace,cline,clen,2,0,-1)
framecnt = framecnt + 1
write(7,199) framecnt, "GRIDPLOT", cline
call frame
c
95 continue
c
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c :::::::::::::: PRODUCE A PLOT OF ONLY THE FINEST LEVELS :::::::::::::
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
if (.not. fineplot .or. lfine .eq. 1) goto 999
xmin2 = 1.0e+10
ymin2 = 1.0e+10
xmax2 = -1.0e+10
ymax2 = -1.0e+10
level = max0(lfine-1,2)
205 if (level .le. lend) then
xmin2 = amin1( xmin2, xmin(level) )
ymin2 = amin1( ymin2, ymin(level) )
xmax2 = amax1( xmax2, xmax(level) )
ymax2 = amax1( ymax2, ymax(level) )
level = level + 1
goto 205
endif
delx = xmax2 - xmin2
dely = ymax2 - ymin2
xlen = .8*amin1( 1.0, delx/dely )
ylen = .8*amin1( 1.0, dely/delx )
x1set = .1
x2set = .1+xlen
y1set = .1
y2set = .1+ylen
call set(.1,.1+xlen,.1,.1+ylen,xmin2,xmax2,ymin2,ymax2,1)
c ::::::::: Now plot the finest grids with boxes :::::
level = max0(lfine-1,2)
225 if (level .le. lend) then
dx = hxposs(level) / 2.0
dy = hyposs(level) / 2.0
mptr = lstart(level)
220 if (mptr .ne. 0) then
loc = node(store2,mptr)
c nrow = node( maxnumrow, mptr ) + 1
c ncol = node( maxnumcol, mptr ) + 1
nrow = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncol = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
x1 = rnode(cornxlo,mptr)
y1 = rnode(cornylo,mptr)
x3 = rnode(cornxhi,mptr)
y3 = rnode(cornyhi,mptr)
call drawbox(x1,y1,x3,y3,level)
c ::::::::: window into the rectangle defined by this grid :::::
x1 = x1 - dx
y1 = y1 - dy
x3 = x3 + dx
y3 = y3 + dy
x1ratio = (x1-xmin2)/(xmax2-xmin2)
x3ratio = (x3-xmin2)/(xmax2-xmin2)
y1ratio = (y1-ymin2)/(ymax2-ymin2)
y3ratio = (y3-ymin2)/(ymax2-ymin2)
call set(x1set+x1ratio*(x2set-x1set),
. x1set+x3ratio*(x2set-x1set),
. y1set+y1ratio*(y2set-y1set),
. y1set+y3ratio*(y2set-y1set),
. 1.5,float(nrow)-.5,1.5,float(ncol)-.5,1)
c ::::::::: plot the contour lines :::::
call setspv(alloc(loc),nrow,ncol,spval)
call conrec( alloc(loc), nrow, nrow, ncol,
1 cmin, cmax, cinc, -1, -1, 0 )
c call cpcnrc( alloc(loc), nrow, nrow, ncol,
c 1 cmin, cmax, cinc, 1, -1, 0 )
c call set(minx,maxx,miny,maxy,xmin2,xmax2,ymin2,ymax2,1)
call set(.1,.1+xlen,.1,.1+ylen,xmin2,xmax2,ymin2,ymax2,1)
mptr = node(levelptr,mptr)
goto 220
endif
level = level + 1
goto 225
endif
call set(0.,1.,0.,1.,xmin2,xmax2,ymin2,ymin2+1.2*(ymax2-ymin2),1)
xplace = xmin2 + (xmax2-xmin2)/4.
yplace = ymin2 + 1.1*(ymax2-ymin2)
call gstxci(1)
call pwrit(xplace,yplace,fline,flen,2,0,-1)
framecnt = framecnt + 1
write(7,199) framecnt, "GRIDPLOT", fline
call frame
c ::::::::: reclaim the space used by temporary grids (store1&2) :::::
999 level = lst
230 if (level .le. lend) then
mptr = lstart(level)
240 if ( mptr .ne. 0 ) then
c nrow = node(maxnumrow,mptr) + 1
c ncol = node(maxnumcol,mptr) + 1
nrow = node(ndihi,mptr) - node(ndilo,mptr) + 3
ncol = node(ndjhi,mptr) - node(ndjlo,mptr) + 3
num = nrow*ncol
loc = node(store2,mptr)
call reclam(loc,num)
node(store2,mptr) = 0
loc = node(store1,mptr)
call reclam(loc,num)
node(store1,mptr) = 0
mptr = node(levelptr,mptr)
goto 240
endif
level = level + 1
goto 230
endif
c
199 format( "Frame# ",i3,2x,a8,2x,a50 )
return
end
c
c ---------------------------------------------------------c
c
subroutine setspv(a,m,n,spval)
dimension a(m,n)
data spval2/-1.e10/
c
c exterior points inside the rectangle have been marked by spval2.
c reset to spval.
c
do 25 i = 1,m
do 25 j = 1,n
if (a(i,j) .eq. spval2) a(i,j) = spval
20 continue
25 continue
return
end
c
c ------------------------------------------------------------
c
subroutine mnmax(a,nrow,ncol,vmin,vmax,spval2)
dimension a(nrow,ncol)
vmin = 1.0e+10
vmax = -1.0e+10
do 10 i = 2, nrow-1
do 20 j = 2, ncol-1
val = a(i,j)
c spval2 is special "blackout" value - don't count it.
if (val .eq. spval2) go to 20
vmin = amin1(val, vmin)
vmax = amax1(val, vmax)
20 continue
10 continue
return
end
c
c ------------------------------------------------------------
c
subroutine blackout(mptr,level,val,nrow,ncol,spval)
c
c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c ::::::::: Array "val" contains the values of grid "mptr" at "level".
c ::::::::: For each cell of mptr, determine if this cell overlaps
c ::::::::: a grid at level+1. If so, black out the cell's value.
c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
dimension val(nrow,ncol)
c
include "call.i"
c
dx = hxposs(level)
dy = hyposs(level)
x = rnode(cornxlo,mptr)
y = rnode(cornylo,mptr)
nptr = lstart(level+1)
10 if (nptr .ne. 0) then
xst = rnode(cornxlo,nptr)
yst = rnode(cornylo,nptr)
xend = rnode(cornxhi,nptr)
yend = rnode(cornyhi,nptr)
ist = max(ifix((xst-x)/dx+2.1), 1)
jst = max(ifix((yst-y)/dy+2.1), 1)
iend = min(ifix((xend-x)/dx+1.1), nrow)
jend = min(ifix((yend-y)/dy+1.1), ncol)
if ((ist .gt. iend) .or. (jst .gt. jend)) go to 40
do 20 i = ist, iend
do 20 j = jst, jend
val(i,j) = spval
20 continue
40 nptr = node(levelptr,nptr)
go to 10
endif
return
end
c
c ------------------------------------------------------------
c
subroutine addbndry( level, mptr, a, nrow, ncol, nvar,
1 xlo, ylo, xhi, yhi, spval, lst,
2 deltax, deltay)
c
c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c ::::::::: Array "a" contains the values of the grid at "level"
c ::::::::: pointed to by "mptr".
c ::::::::: This routine fills in the boundry values array "a".
c ::::::::: The boundry value of a cell is determined by:
c ::::::::: (1) it is "spval" if the cell is outside the physical
c ::::::::: bounds of the problem defined by xlow, ylow, xhi, yhi.
c ::::::::: (2) if the cell overlaps another grid at "level" it is
c ::::::::: given the value of the overlapping cell.
c ::::::::: (3) if it does not overlap a grid at the same level
c ::::::::: it must overlap a cell at a coarser level. The
c ::::::::: four nearest neighbor cells of this coarser grid
c ::::::::: are interpolated to give a value to the cell.
c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
dimension a(nrow,ncol,nvar)
real xlo, ylo, xhi, yhi, interp
real q(4),v11(4),v21(4),v12(4),v22(4),regval(4)
integer level, mptr
logical outside, xinside, yinside
c
include "call.i"
c
interp(xx1,vv1,xx2,vv2,xx) = vv1 + (vv2-vv1)*(xx-xx1)/(xx2-xx1)
outside(x,y) = ( (x .lt. xlo) .or. (x .gt. xhi) .or.
1 (y .lt. ylo) .or. (y .gt. yhi) )
xbot = rnode(cornxlo,mptr)
ybot = rnode(cornylo,mptr)
do 70 i = 1, nrow
xinside = ( (i .gt. 1) .and. (i .lt. nrow) )
xcen = xbot + deltax*(float(i) - 1.5)
do 60 j = 1, ncol
yinside = ( (j .gt. 1) .and. (j .lt. ncol) )
if ( xinside .and. yinside ) goto 60
ycen = ybot + deltay*(float(j) - 1.5)
if (outside(xcen,ycen)) then
do 10 ivar = 1, nvar
c if (i .eq. 1) then
c if (j .eq. 1 .or. j .eq. ncol) then
c a(i,j,ivar) = spval
c else
c a(1,j,ivar) = a(2,j,ivar)
c endif
c else if (i .eq. nrow) then
c a(nrow,j,ivar) = a(nrow-1,j,ivar)
c else if (j .eq. ncol) then
c a(i,ncol,ivar) = a(i,ncol-1,ivar)
c else if (j .eq. 1) then
c a(i,1,ivar) = a(i,2,ivar)
c endif
10 a(i,j,ivar) = spval
c10 continue
goto 60
endif
call srchlev(xcen,ycen,level,ngrd,i1,j1,x1,y1)
if (ngrd .ne. 0) then
c :::::::: found at same level, just use that value :::::
c nr = node(maxnumrow,ngrd) + 1
c nc = node(maxnumcol,ngrd) + 1
nr = node(ndihi,ngrd) - node(ndilo,ngrd) + 3
nc = node(ndjhi,ngrd) - node(ndjlo,ngrd) + 3
loc = node(tempptr,ngrd)
call getval(alloc(loc),nr,nc,i1,j1,q,nvar)
do 15 ivar = 1, nvar
15 a(i,j,ivar) = q(ivar)
go to 60
endif
c :::::::: not found at same level, search lower level
c :::::::: and interplolate from four nearest points
lev = level - 1
call srchlev(xcen,ycen,lev,ngrd,i1,j1,x1,y1)
if (ngrd .ne. 0) then
dx = hxposs(lev)
dy = hyposs(lev)
xsgn = sign( 1.0, xcen - x1 )
ysgn = sign( 1.0, ycen - y1 )
x2 = x1 + xsgn*dx
y2 = y1 + ysgn*dy
i2 = i1 + nint(xsgn)
j2 = j1 + nint(ysgn)
c nr = node(maxnumrow,ngrd) + 1
c nc = node(maxnumcol,ngrd) + 1
nr = node(ndihi,ngrd) - node(ndilo,ngrd) + 3
nc = node(ndjhi,ngrd) - node(ndjlo,ngrd) + 3
loc = node(tempptr,ngrd)
call getval(alloc(loc),nr,nc,i1,j1,v11,nvar)
if (outside(x1,y2)) then
c :::: (x2,y1) must be inside. Use 2 point interp.
call srchlev(x2,y1,lev,ng,ii,jj,xx,yy)
c nr = node(maxnumrow,ng) + 1
c nc = node(maxnumcol,ng) + 1
nr = node(ndihi,ng) - node(ndilo,ng) + 3
nc = node(ndjhi,ng) - node(ndjlo,ng) + 3
loc = node(tempptr,ng)
call getval(alloc(loc),nr,nc,ii,jj,v21,nvar)
if ((abs(v11(1)).eq.spval).and.
. (abs(v21(1)).ne.spval)) then
call fix(v11,v21)
elseif ((abs(v11(1)).ne.spval).and.
. (abs(v21(1)).eq.spval)) then
call fix(v21,v11)
endif
do 35 ivar = 1, nvar
a(i,j,ivar)=interp(x1,v11(ivar),x2,v21(ivar),xcen)
35 continue
elseif (outside(x2,y1)) then
c :::: (x1,y2) must be inside. Use 2 point interp.
call srchlev(x1,y2,lev,ng,ii,jj,xx,yy)
c nr = node(maxnumrow,ng) + 1
c nc = node(maxnumcol,ng) + 1
nr = node(ndihi,ng) - node(ndilo,ng) + 3
nc = node(ndjhi,ng) - node(ndjlo,ng) + 3
loc = node(tempptr,ng)
call getval(alloc(loc),nr,nc,ii,jj,v12,nvar)
if ((abs(v11(1)).eq.spval).and.
. (abs(v12(1)).ne.spval)) then
call fix(v11,v12)
elseif ((abs(v11(1)).ne.spval).and.
. (abs(v12(1)).eq.spval)) then
call fix(v12,v11)
endif
do 40 ivar = 1, nvar
a(i,j,ivar)=interp(y1,v11(ivar),y2,v12(ivar),ycen)
40 continue
else
c :::: All points inside. Use 4 point interp.
call srchlev(x1,y2,lev,ng,ii,jj,xx,yy)
c nr = node(maxnumrow,ng) + 1
c nc = node(maxnumcol,ng) + 1
nr = node(ndihi,ng) - node(ndilo,ng) + 3
nc = node(ndjhi,ng) - node(ndjlo,ng) + 3
loc = node(tempptr,ng)
call getval(alloc(loc),nr,nc,ii,jj,v12,nvar)
call srchlev(x2,y1,lev,ng,ii,jj,xx,yy)
c nr = node(maxnumrow,ng) + 1
c nc = node(maxnumcol,ng) + 1
nr = node(ndihi,ng) - node(ndilo,ng) + 3
nc = node(ndjhi,ng) - node(ndjlo,ng) + 3
loc = node(tempptr,ng)
call getval(alloc(loc),nr,nc,ii,jj,v21,nvar)
call srchlev(x2,y2,lev,ng,ii,jj,xx,yy)
c nr = node(maxnumrow,ng) + 1
c nc = node(maxnumcol,ng) + 1
nr = node(ndihi,ng) - node(ndilo,ng) + 3
nc = node(ndjhi,ng) - node(ndjlo,ng) + 3
loc = node(tempptr,ng)
call getval(alloc(loc),nr,nc,ii,jj,v22,nvar)
c ::: are all coarse values in the regular domain? :::
if ( ((abs(v11(1)).ne.spval)
. .and.(abs(v12(1)).ne.spval)
. .and.(abs(v21(1)).ne.spval)
. .and.(abs(v22(1)).ne.spval)) .or.
. ((abs(v11(1)).eq.spval)
. .and.(abs(v12(1)).eq.spval)
. .and.(abs(v21(1)).eq.spval)
. .and.(abs(v22(1)).eq.spval)) ) then
do 45 ivar = 1, nvar
v1 = interp(y1,v11(ivar),y2,v12(ivar),ycen)
v2 = interp(y1,v21(ivar),y2,v22(ivar),ycen)
c :::: interpolate in x direction :::::
a(i,j,ivar) = interp(x1,v1,x2,v2,xcen)
45 continue
else
c ::: just find one non-special value to use
c ::: piecewise constant interp.
if (abs(v11(1)).ne.spval) then
call fix(regval,v11)
elseif (abs(v12(1)).ne.spval) then
call fix(regval,v12)
elseif (abs(v21(1)).ne.spval) then
call fix(regval,v21)
elseif (abs(v22(1)).ne.spval) then
call fix(regval,v22)
endif
do 234 ivar = 1, nvar
a(i,j,ivar) = regval(ivar)
234 continue
endif
go to 60
endif
c
c :::::::: should never fall through this loop :::::
else
write(16,100) xcen, ycen
100 format( "no coarse grid contains ",2(e13.6,2x))
do 55 ivar = 1, nvar
if (i .eq. 1) then
if (j .eq. 1 .or. j .eq. ncol) then
a(i,j,ivar) = spval
else
a(1,j,ivar) = a(2,j,ivar)
endif
else if (i .eq. nrow) then
a(nrow,j,ivar) = a(nrow-1,j,ivar)
else if (j .eq. ncol) then
a(i,ncol,ivar) = a(i,ncol-1,ivar)
else if (j .eq. 1) then
a(i,1,ivar) = a(i,2,ivar)
endif
55 continue
call clsgks
c stop
endif
c
60 continue
70 continue
return
end
c
c ---------------------------------------------------
c
subroutine fix(v1,v2)
dimension v1(4), v2(4)
c
c set v1 equal to v2 so that interpolation in addbndry
c routine either sets boundary value to spval or to a "real"
c (but obviously not very accurate) value
c
do 10 i = 1, 4
v1(i) = v2(i)
10 continue
return
end
c
c ------------------------------------------------------------
c
subroutine getval(a,nrows,ncols,i,j,q,nvar)
dimension a(nrows,ncols,nvar), q(nvar)
c
do 10 ivar = 1, nvar
q(ivar) = a(i,j,ivar)
10 continue
c
return
end
c
c ------------------------------------------------------------
c
subroutine srchlev(xcen,ycen,level,ngrd,i,j,x,y)
c
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c ::::::::: Search all the grids at "level" until one is found
c ::::::::: that contains the point (xcen,ycen).
c ::::::::: If no such grid is found, ngrd will be returned as zero.
c ::::::::: If one is found, ngrd will point to that grid,
c ::::::::: (i,j) will be the indicies of the cell it is found in,
c ::::::::: and (x,y) will be the coordinates of the center of the cell.
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
include "call.i"
logical inside
c
ngrd = lstart(level)
10 if (ngrd .ne. 0) then
xlow = rnode(cornxlo,ngrd)
ylow = rnode(cornylo,ngrd)
xhigh = rnode(cornxhi,ngrd)
yhigh = rnode(cornyhi,ngrd)
inside = ( (xcen .ge. xlow) .and. (xcen .le. xhigh) .and.
1 (ycen .ge. ylow) .and. (ycen .le. yhigh) )
if (inside) then
dx = hxposs(level)
dy = hyposs(level)
i = int( (xcen - xlow) / dx ) + 2
j = int( (ycen - ylow) / dy ) + 2
x = xlow + dx*(float(i) - 1.5)
y = ylow + dy*(float(j) - 1.5)
go to 99
endif
ngrd = node(levelptr,ngrd)
goto 10
endif
99 return
end
c
c ------------------------------------------------------------
c
subroutine restore( orig, black, fixed, nrow, ncol,
1 mptr, spval, xlo, ylo, xhi, yhi )
c
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c ::::::::: Array "black" is identical to array "orig" except
c ::::::::: that some cells may be blackened out because they
c ::::::::: overlap cells in finer grids.
c ::::::::: This routine creates the array "fixed" to be identical
c ::::::::: to "black" except that if restores the origional
c ::::::::: value to a blackened cell if that cell satisfies
c ::::::::: the following conditions:
c ::::::::: (1) the cell is within the physical problem domain
c ::::::::: (2) the cell is blackened out.
c ::::::::: (3) the cell is adjacent to a cell that is not
c ::::::::: blackened out.
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
parameter (eps=1.0)
real orig(nrow, ncol), fixed(nrow, ncol), black(nrow, ncol)
logical notblack, outside
c
include "call.i"
c
notblack(xx) = ((xx .lt. spval-eps) .or. (xx .gt. spval+eps))
c ::::::::: get the physical coordinates of the grid we are restoring
level = node(nestlevel,mptr)
dx = hxposs(level)
dy = hyposs(level)
x = rnode(cornxlo,mptr)
y = rnode(cornylo,mptr)
do 10 i = 1, nrow
klow = -1
if (i .eq. 1) klow = 0
khigh = 1
if (i .eq. nrow) khigh = 0
do 20 j = 1, ncol
fixed(i,j) = black(i,j)
c ::::::: check only blackened cells :::::
if (notblack( black(i,j) )) goto 20
c ::::::: check if cell is within bounds of physical domain :::::
xcen = x + dx*(float(i) - 1.5)
ycen = y + dy*(float(j) - 1.5)
outside = ( (xcen .le. xlo) .or. (xcen .ge. xhi) .or.
1 (ycen .le. ylo) .or. (ycen .ge. yhi) )
if (outside) goto 20
llow = -1
if (j .eq. 1) llow = 0
lhigh = 1
if (j .eq. ncol) lhigh = 0
c ::::::: check nearest neighbors for non-black cells :::::
do 30 k = klow,khigh
do 40 l = llow, lhigh
if (notblack(black(i+k,j+l))) then
c ::::::: restore to origional value :::::
c write(16,200) mptr, i, j
200 format("Restoring value: mptr, I, J ",3(i4,3x) )
fixed(i,j) = orig(i,j)
goto 20
endif
40 continue
30 continue
20 continue
10 continue
c
return
end
c
c ------------------------------------------------------------------
c
subroutine drawbox(xlo,ylo,xhi,yhi,level)
dimension icl(5)
data icl/10,40,100,110,120/
call gsplci(icl(level))
call gstxci(icl(level))
call line(xlo,ylo,xlo,yhi)
call line(xlo,yhi,xhi,yhi)
call line(xhi,yhi,xhi,ylo)
call line(xhi,ylo,xlo,ylo)
return
end
c
c ------------------------------------------------------------------
c
subroutine dtree (lst,lend,line,linelen,gprint2)
c
include "call.i"
character*50 line
integer linelen
logical gprint2
c
c *******************************************************************
c dtree - draw the grids in the subtree starting at level lst to lend.
c (just outline the grids, not their values)
c ******************************************************************
c
c
c set scaling using (x,y) min/max of coarsest level rectangles.
xmin = 10.e32
xmax = - 10.e32
ymin = 10.e32
ymax = - 10.e32
c
mptr = lstart(lst)
10 if (mptr .ne. 0) then
x1 = rnode(cornxlo,mptr)
x2 = rnode(cornxhi,mptr)
xmin = amin1(x1,x2,xmin)
xmax = amax1(x1,x2,xmax)
y1 = rnode(cornylo,mptr)
y2 = rnode(cornyhi,mptr)
ymin = amin1(y1,y2,ymin)
ymax = amax1(y1,y2,ymax)
mptr = node(levelptr,mptr)
go to 10
endif
c
c add border
ratxy =.8*amin1(1.,(xmax-xmin)/(ymax-ymin))
ratyx =.8*amin1(1.,(ymax-ymin)/(xmax-xmin))
call set(.1,.1+ratxy,.1,.1+ratyx,xmin,xmax,ymin,ymax,1)
c
c actually generate call to draw each rectangle now.
level = lst
30 if (level .le. lend) then
mptr = lstart(level)
40 if (mptr .ne. 0) then
call drect(mptr,gprint2)
mptr = node(levelptr,mptr)
go to 40
endif
level = level + 1
go to 30
endif
c
call set(0.,1.,0.,1.,xmin,xmax,ymin,ymin+1.2*(ymax-ymin),1)
xthird = xmin + (xmax-xmin)/3.
call pwrit(xthird,ymin+1.1*(ymax-ymin),line,linelen,2,0,-1)
c
c reset plotting coords. in case call came from dclust - more to draw.
c
call set(.1,.1+ratxy,.1,.1+ratyx,xmin,xmax,ymin,ymax,1)
c
return
end
subroutine drect(mptr,gprint2)
c
include "call.i"
dimension x(4), y(4)
logical gprint2
character*3 numg
c
c ******************************************************************
c drect - draw rectangle of grid mptr.
c if gprint2 true, print grid number in grid.
c
c this routine assumes dtree already called, appropriate graphics
c calls already made.
c ******************************************************************
c
x(1) = rnode(cornxlo,mptr)
y(1) = rnode(cornylo,mptr)
x(2) = rnode(cornxlo,mptr)
y(2) = rnode(cornyhi,mptr)
x(3) = rnode(cornxhi,mptr)
y(3) = rnode(cornyhi,mptr)
x(4) = rnode(cornxhi,mptr)
y(4) = rnode(cornylo,mptr)
level = node(nestlevel, mptr)
hx = hxposs(level)
hy = hyposs(level)
do 10 i = 1,4
call line(x(i),y(i),x((mod(i,4))+1),y((mod(i,4))+1))
10 continue
c
c print grid number?
c
if (gprint2) then
xplace = x(1) + 2.*hx
yplace = y(2) - 3.*hy
write(numg(1:3),'(i3)') mptr
call pwrit(xplace,yplace,numg,3,0,0,0)
endif
return
end
c
c -------------------------------------------------------
c
subroutine contor(a,m,n,header,hlen,mptr)
dimension a(m,n)
character header*50
include "call.i"
common /conre1/ ioffp, spval
common /conre4/ sizel, sizem, sizep, nrep, ncrt, ilab,
1 nulbll, ioffd, ext, ioffm, isolid, nla,
2 nlm, xlt, ybt, side
data ncons/40/
c
ioffp = 1
nlm = 40
spval = 1.0e10
spval2 = -1.e10
call cpseti('LLP - line label position',0)
c call cpsetc('HLT - high/low label text',' ')
c call cpsetc('ILT - informational label text',' ')
call cpseti('NCL - number of contour levels',ncons)
call cpseti('SET - do set call flag',0)
call cpsetr('SPV - set special value ',spval)
c
c ::::::::: only work with data in the subarray (2..m-1,2..n-1) :::::
flm = float(m-2)
fln = float(n-2)
xlen = .8*amin1(1.,flm/fln)
ylen = .8*amin1(1.,fln/flm)
xmax = .1+xlen
ymax = .1+ylen
fncons = float(ncons)
totmax = -1.e+10
totmin = 1.e+10
do 100 i=2,m-1
do 100 j=2,n-1
if (a(i,j) .eq. spval2) go to 100
totmax = amax1(a(i,j),totmax)
totmin = amin1(a(i,j),totmin)
100 continue
write(7,*)" grid ",mptr," ranges from ",totmin," to ", totmax
c
if (ioffp .eq. 0) go to 30
do 25 i = 2,m-1
do 25 j = 2,n-1
if (a(i,j) .eq. spval2) a(i,j) = spval
25 continue
30 continue
c
33 dela = totmax - totmin
finc = dela/fncons
fhi = totmax -.5*finc
flo = totmin +.5*finc
call set(.1,xmax,.1,ymax,.5,flm+.5,.5,fln+.5,1)
call perim(10,1,10,1)
call conrec(a(2,2),m,m-2,n-2,flo,fhi,finc,-1,-1,0)
c call cpcnrc(a(2,2),m,m-2,n-2,flo,fhi,finc,1,-1,0)
c
c prepare titles
c
xthird = flm/3.
xplace = flm/10.
yplace = 1.1*fln
call set(0.,1.,0.,1.,0.,flm,0.,1.2*fln,1)
call pwrit(xplace,yplace,header,hlen,2,0,-1)
c
call frame
return
end
SUBROUTINE CONREC (Z,L,M,N,FLO,HI,FINC,NSET,NHI,NDOT)
C
C +-----------------------------------------------------------------+
C | |
C | Copyright (C) 1987 by UCAR |
C | University Corporation for Atmospheric Research |
C | All Rights Reserved |
C | |
C | NCARGRAPHICS Version 2.00 |
C | |
C +-----------------------------------------------------------------+
C
C
C
C DIMENSION OF Z(L,N)
C ARGUMENTS
C
C LATEST REVISION June, 1987
C
C PURPOSE CONREC draws a contour map from data stored
C in a rectangular array, labeling the lines.
C
C USAGE If the following assumptions are met, use
C
C CALL EZCNTR (Z,M,N)
C
C ASSUMPTIONS:
C --All of the array is to be contoured.
C --Contour levels are picked
C internally.
C --Contouring routine picks scale
C factors.
C --Highs and lows are marked.
C --Negative lines are drawn with a
C dashed line pattern.
C --EZCNTR calls FRAME after drawing the
C contour map.
C
C If these assumptions are not met, use
C
C CALL CONREC (Z,L,M,N,FLO,HI,FINC,NSET,
C NHI,NDOT)
C
C ARGUMENTS
C
C ON INPUT Z
C FOR EZCNTR M by N array to be contoured.
C
C M
C First dimension of Z.
C
C N
C Second dimension of Z.
C
C ON OUTPUT All arguments are unchanged.
C FOR EZCNTR
C
C ON INPUT Z
C FOR CONREC The (origin of the) array to be
C contoured. Z is dimensioned L by N.
C
C L
C The first dimension of Z in the calling
C program.
C
C M
C The number of data values to be contoured
C in the X-direction (the first subscript
C direction). When plotting an entire
C array, L = M.
C
C N
C The number of data values to be contoured
C in the Y-direction (the second subscript
C direction).
C
C FLO
C The value of the lowest contour level.
C If FLO = HI = 0., a value rounded up from
C the minimum Z is generated by CONREC.
C
C HI
C The value of the highest contour level.
C If HI = FLO = 0., a value rounded down
C from the maximum Z is generated by
C CONREC.
C
C FINC
C > 0 Increment between contour levels.
C = 0 A value, which produces between 10
C and 30 contour levels at nice values,
C is generated by CONREC.
C < 0 The number of levels generated by
C CONREC is ABS(FINC).
C
C NSET
C Flag to control scaling.
C = 0 CONREC automatically sets the
C window and viewport to properly
C scale the frame to the standard
C configuration.
C The GRIDAL entry PERIM is
C called and tick marks are placed
C corresponding to the data points.
C > 0 CONREC assumes that the user
C has set the window and viewport
C in such a way as to properly
C scale the plotting
C instructions generated by CONREC.
C PERIM is not called.
C < 0 CONREC generates coordinates so as
C to place the (untransformed) contour
C plot within the limits of the
C user's current window and
C viewport. PERIM is not called.
C
C NHI
C Flag to control extra information on the
C contour plot.
C = 0 Highs and lows are marked with an H
C or L as appropriate, and the value
C of the high or low is plotted under
C the symbol.
C > 0 The data values are plotted at
C each Z point, with the center of
C the string indicating the data
C point location.
C < 0 Neither of the above.
C
C NDOT
C A 10-bit constant designating the desired
C dashed line pattern.
C If ABS(NDOT) = 0, 1, or 1023, solid lines
C are drawn.
C > 0 NDOT pattern is used for all lines.
C < 0 ABS(NDOT) pattern is used for nega-
C tive-valued contour lines, and solid is
C used for positive-valued contours.
C CONREC converts NDOT
C to a 16-bit pattern and DASHDB is used.
C See DASHDB comments in the DASHLINE
C documentation for details.
C
C
C
C ON OUTPUT All arguments are unchanged.
C FOR CONREC
C
C
C ENTRY POINTS CONREC, CLGEN, REORD, STLINE, DRLINE,
C MINMAX, PNTVAL, CALCNT, EZCNTR, CONBD
C
C COMMON BLOCKS INTPR, RECINT, CONRE1, CONRE2, CONRE3,
C CONRE4,CONRE5
C
C REQUIRED LIBRARY Standard version: DASHCHAR, which at
C ROUTINES NCAR is loaded by default.
C Smooth version: DASHSMTH which must be
C requested at NCAR.
C Both versions require GRIDAL, the
C ERPRT77 package, and the SPPS.
C
C REQUIRED GKS LEVEL 0A
C
C I/O Plots contour map.
C
C PRECISION Single
C
C LANGUAGE FORTRAN 77
C
C HISTORY Replaces old contouring package called
C CALCNT at NCAR.
C
C ALGORITHM Each line is followed to completion. Points
C along a line are found on boundaries of the
C (rectangular) cells. These points are
C connected by line segments using the
C software dashed line package, DASHCHAR.
C DASHCHAR is also used to label the
C lines.
C
C NOTE To draw non-uniform contour levels, see
C the comments in CLGEN. To make special
C modifications for specific needs see the
C explanation of the internal parameters
C below.
C
C TIMING Varies widely with size and smoothness of
C Z.
C
C INTERNAL PARAMETERS NAME DEFAULT FUNCTION
C ---- ------- --------
C
C ISIZEL 1 Size of line labels,
C as per the size definitions
C given in the SPPS
C documentation for WTSTR.
C
C ISIZEM 2 size of labels for minimums
C and maximums,
C as per the size definitions
C given in the SPPS
C documentation for WTSTR.
C
C ISIZEP 0 Size of labels for data
C point values as per the size
C definitions given in the SPPS
C documentation for WTSTR.
C
C NLA 16 Approximate number of
C contour levels when
C internally generated.
C
C NLM 40 Maximum number of contour
C levels. If this is to be
C increased, the dimensions
C of CL and RWORK in CONREC
C must be increased by the
C same amount.
C
C XLT .05 Left hand edge of the plot
C (0.0 is the left edge of
C the frame and 1.0 is the
C right edge of the frame.)
C
C YBT .05 Bottom edge of the plot
C (0.0 is the bottom of the
C frame and 1.0 is the top
C of the frame.)
C
C SIDE 0.9 Length of longer edge of
C plot (see also EXT).
C
C NREP 6 Number of repetitions of
C the dash pattern between
C line labels.
C
C NCRT 4 Number of CRT units per
C element (bit) in the dash
C pattern.
C
C ILAB 1 Flag to control the drawing
C of line labels.
C . ILAB non-zero means label
C the lines.
C . ILAB = 0 means do not
C label the lines.
C
C NULBLL 3 Number of unlabeled lines
C between labeled lines. For
C example, when NULBLL = 3,
C every fourth level is
C labeled.
C
C IOFFD 0 Flag to control
C normalization of label
C numbers.
C . IOFFD = 0 means include
C decimal point when
C possible (do not
C normalize unless
C required).
C . IOFFD non-zero means
C normalize all label
C numbers and output a
C scale factor in the
C message below the graph.
C
C EXT .25 Lengths of the sides of the
C plot are proportional to M
C and N (when CONREC sets
C the window and viewport).
C In extreme cases, when
C MIN(M,N)/MAX(M,N) is less
C than EXT, CONREC
C produces a square plot.
C
C IOFFP 0 Flag to control special
C value feature.
C . IOFFP = 0 means special
C value feature not in use.
C . IOFFP non-zero means
C special value feature in
C use. (SPVAL is set to the
C special value.) Contour
C lines will then be
C omitted from any cell
C with any corner equal to
C the special value.
C
C SPVAL 0. Contains the special value
C when IOFFP is non-zero.
C
C IOFFM 0 Flag to control the message
C below the plot.
C . IOFFM = 0 if the message
C is to be plotted.
C . IOFFM non-zero if the
C message is to be omitted.
C
C ISOLID 1023 Dash pattern for
C non-negative contour lines.
C
C
EXTERNAL CONBD
C
SAVE
CHARACTER*1 IGAP ,ISOL ,RCHAR
CHARACTER ENCSCR*22 ,IWORK*126
DIMENSION LNGTHS(5) ,HOLD(5) ,WNDW(4) ,VWPRT(4)
DIMENSION Z(L,N) ,CL(50) ,RWORK(50) ,LASF(13)
COMMON /INTPR/ PAD1, FPART, PAD(8)
COMMON /CONRE1/ IOFFP ,SPVAL
COMMON /CONRE3/ IXBITS ,IYBITS
COMMON /CONRE4/ ISIZEL ,ISIZEM ,ISIZEP ,NREP ,
1 NCRT ,ILAB ,NULBLL ,IOFFD ,
2 EXT ,IOFFM ,ISOLID ,NLA ,
3 NLM ,XLT ,YBT ,SIDE
COMMON /CONRE5/ SCLY
COMMON /RECINT/ IRECMJ ,IRECMN ,IRECTX
DATA LNGTHS(1),LNGTHS(2),LNGTHS(3),LNGTHS(4),LNGTHS(5)
1 / 12, 3, 20, 9, 17 /
DATA ISOL, IGAP /'$', ''''/
C
C ISOL AND IGAP (DOLLAR-SIGN AND APOSTROPHE) ARE USED TO CONSTRUCT PAT-
C TERNS PASSED TO ROUTINE DASHDC IN THE SOFTWARE DASHED-LINE PACKAGE.
C
C
C
C THE FOLLOWING CALL IS FOR GATHERING STATISTICS ON LIBRARY USE AT NCAR
C
CALL Q8QST4 ('GRAPHX','CONREC','CONREC','VERSION 01')
C
C NONSMOOTHING VERSION
C
C
C
C CALL RESET FOR COMPATIBILITY WITH ALL DASH ROUTINES(EXCEPT DASHLINE)
C
CALL RESET
C
C GET NUMBER OF BITS IN INTEGER ARITHMETIC
C
IARTH = I1MACH(8)
IXBITS = 0
DO 101 I=1,IARTH
IF (M .LE. (2**I-1)) GO TO 102
IXBITS = I+1
101 CONTINUE
102 IYBITS = 0
DO 103 I=1,IARTH
IF (N .LE. (2**I-1)) GO TO 104
IYBITS = I+1
103 CONTINUE
104 IF ((IXBITS*IYBITS).GT.0 .AND. (IXBITS+IYBITS).LE.24) GO TO 105
C
C REPORT ERROR NUMBER ONE
C
IWORK = 'CONREC - DIMENSION ERROR - M*N .GT. (2**IARTH) M =
+ N = '
WRITE (IWORK(56:62),'(I6)') M
WRITE (IWORK(73:79),'(I6)') N
CALL SETER( IWORK, 1, 1 )
RETURN
105 CONTINUE
C
C INQUIRE CURRENT TEXT AND LINE COLOR INDEX
C
CALL GQTXCI ( IERR, ITXCI )
CALL GQPLCI ( IERR, IPLCI )
C
C SET LINE AND TEXT ASF TO INDIVIDUAL
C
CALL GQASF ( IERR, LASF )
LSV3 = LASF(3)
LSV10 = LASF(10)
LASF(3) = 1
LASF(10) = 1
CALL GSASF ( LASF )
C
GL = FLO
HA = HI
GP = FINC
MX = L
NX = M
NY = N
IDASH = NDOT
NEGPOS = ISIGN(1,IDASH)
IDASH = IABS(IDASH)
IF (IDASH.EQ.0 .OR. IDASH.EQ.1) IDASH = ISOLID
C
C SET CONTOUR LEVELS.
C
CALL CLGEN (Z,MX,NX,NY,GL,HA,GP,NLA,NLM,CL,NCL,ICNST)
C
C FIND MAJOR AND MINOR LINES
C
IF (ILAB .NE. 0) CALL REORD (CL,NCL,RWORK,NML,NULBLL+1)
IF (ILAB .EQ. 0) NML = 0
C
C SAVE CURRENT NORMALIZATION TRANS NUMBER NTORIG AND LOG SCALING FLAG
C
CALL GQCNTN ( IERR, NTORIG )
CALL GETUSV ('LS',IOLLS)
C
C SET UP SCALING
C
CALL GETUSV ( 'YF' , IYVAL )
SCLY = 1.0 / ISHIFT ( 1, 15 - IYVAL )
C
IF (NSET) 106,107,111
106 CALL GQNT ( NTORIG,IERR,WNDW,VWPRT )
X1 = VWPRT(1)
X2 = VWPRT(2)
Y1 = VWPRT(3)
Y2 = VWPRT(4)
C
C SAVE NORMALIZATION TRANS 1
C
CALL GQNT (1,IERR,WNDW,VWPRT)
C
C DEFINE NORMALIZATION TRANS AND LOG SCALING
C
CALL SET(X1, X2, Y1, Y2, 1.0, FLOAT(NX), 1.0, FLOAT(NY), 1)
GO TO 111
107 CONTINUE
X1 = XLT
X2 = XLT+SIDE
Y1 = YBT
Y2 = YBT+SIDE
X3 = NX
Y3 = NY
IF (AMIN1(X3,Y3)/AMAX1(X3,Y3) .LT. EXT) GO TO 110
IF (NX-NY) 108,110,109
108 X2 = SIDE*X3/Y3+XLT
GO TO 110
109 Y2 = SIDE*Y3/X3+YBT
C
C SAVE NORMALIZATION TRANS 1
C
110 CALL GQNT ( 1, IERR, WNDW, VWPRT )
C
C DEFINE NORMALIZATION TRANS 1 AND LOG SCALING
C
CALL SET(X1,X2,Y1,Y2,1.0,X3,1.0,Y3,1)
C
C DRAW PERIMETER
C
CALL PERIM (NX-1,1,NY-1,1)
111 IF (ICNST .NE. 0) GO TO 124
C
C SET UP LABEL SCALING
C
IOFFDT = IOFFD
IF (GL.NE.0.0 .AND. (ABS(GL).LT.0.1 .OR. ABS(GL).GE.1.E5))
1 IOFFDT = 1
IF (HA.NE.0.0 .AND. (ABS(HA).LT.0.1 .OR. ABS(HA).GE.1.E5))
1 IOFFDT = 1
ASH = 10.**(3-IFIX(ALOG10(AMAX1(ABS(GL),ABS(HA),ABS(GP)))-5000.)-
1 5000)
IF (IOFFDT .EQ. 0) ASH = 1.
IF (IOFFM .NE. 0) GO TO 115
IWORK ='CONTOUR FROM TO CONTOUR INTERVAL
1 OF PT(3,3)= LABELS SCALED BY'
HOLD(1) = GL
HOLD(2) = HA
HOLD(3) = GP
HOLD(4) = Z(3,3)
HOLD(5) = ASH
NCHAR = 0
DO 114 I=1,5
WRITE ( ENCSCR, '(G13.5)' ) HOLD(I)
NCHAR = NCHAR+LNGTHS(I)
DO 113 J=1,13
NCHAR = NCHAR+1
IWORK(NCHAR:NCHAR) = ENCSCR(J:J)
113 CONTINUE
114 CONTINUE
IF (ASH .EQ. 1.) NCHAR = NCHAR-13-LNGTHS(5)
C
C SET TEXT INTENSITY TO LOW, AND WRITE TITLE USING NORMALIZATION
C TRANS NUMBER 0
C
CALL GSTXCI (IRECTX)
CALL GETUSV('LS',LSO)
CALL SETUSV('LS',1)
CALL GSELNT (0)
CALL WTSTR ( 0.5, 0.015625, IWORK(1:NCHAR), 0, 0, 0 )
CALL SETUSV('LS',LSO)
CALL GSELNT (1)
C
C
C
C * * * * * * * * * *
C * * * * * * * * * *
C
C
C PROCESS EACH LEVEL
C
115 FPART = .5
C
DO 123 I=1,NCL
CONTR = CL(I)
NDASH = IDASH
IF (NEGPOS.LT.0 .AND. CONTR.GE.0.) NDASH = ISOLID
C
C CHANGE 10 BIT PATTERN TO 10 CHARACTER PATTERN.
C
DO 116 J=1,10
IBIT = IAND(ISHIFT(NDASH,(J-10)),1)
RCHAR = IGAP
IF (IBIT .NE. 0) RCHAR = ISOL
IWORK(J:J) = RCHAR
116 CONTINUE
IF (I .GT. NML) GO TO 121
C
C SET UP MAJOR LINE (LABELED)
C
C
C NREP REPITITIONS OF PATTERN PER LABEL.
C
NCHAR = 10
IF (NREP .LT. 2) GO TO 119
DO 118 J=1,10
NCHAR = J
RCHAR = IWORK(J:J)
DO 117 K=2,NREP
NCHAR = NCHAR+10
IWORK(NCHAR:NCHAR) = RCHAR
117 CONTINUE
118 CONTINUE
119 CONTINUE
C
C PUT IN LABEL.
C
CALL ENCD (CONTR,ASH,ENCSCR,NCUSED,IOFFDT)
DO 120 J=1,NCUSED
NCHAR = NCHAR+1
IWORK(NCHAR:NCHAR) = ENCSCR(J:J)
120 CONTINUE
GO TO 122
C
C SET UP MINOR LINE (UNLABELED).
C
121 CONTINUE
C
C SET LINE INTENSITY TO LOW
C
CALL GSPLCI ( IRECMN )
NCHAR = 10
122 CALL DASHDC ( IWORK(1:NCHAR),NCRT, ISIZEL )
C
C
C DRAW ALL LINES AT THIS LEVEL.
C
CALL STLINE (Z,MX,NX,NY,CONTR)
C
C SET LINE INTENSITY TO HIGH
C
CALL GSPLCI ( IRECMJ )
C
123 CONTINUE
C
C FIND RELATIVE MINIMUMS AND MAXIMUMS IF WANTED, AND MARK VALUES IF
C WANTED.
C
IF (NHI .EQ. 0) CALL MINMAX (Z,MX,NX,NY,ISIZEM,ASH,IOFFDT)
IF (NHI .GT. 0) CALL MINMAX (Z,MX,NX,NY,ISIZEP,-ASH,IOFFDT)
FPART = 1.
GO TO 127
124 CONTINUE
IWORK = 'CONSTANT FIELD'
WRITE( ENCSCR, '(G22.14)' ) GL
DO 126 I=1,22
IWORK(I+14:I+14) = ENCSCR(I:I)
126 CONTINUE
C
C WRITE TITLE USING NORMALIZATION TRNS 0
C
CALL GETUSV('LS',LSO)
CALL SETUSV('LS',1)
CALL GSELNT (0)
CALL WTSTR ( 0.09765, 0.48825, IWORK(1:36), 3, 0, -1 )
C
C RESTORE NORMALIZATION TRANS 1, LINE AND TEXT INTENSITY TO ORIGINAL
C
127 IF (NSET.LE.0) THEN
CALL SET(VWPRT(1),VWPRT(2),VWPRT(3),VWPRT(4),
- WNDW(1),WNDW(2),WNDW(3),WNDW(4),IOLLS)
END IF
CALL GSPLCI ( IPLCI )
CALL GSTXCI ( ITXCI )
C
C SELECT ORIGINAL NORMALIZATION TRANS NUMBER NTORIG, AND RESTORE ASF
C
CALL GSELNT ( NTORIG )
LASF(3) = LSV3
LASF(10) = LSV10
CALL GSASF ( LASF )
C
RETURN
C
C
END
c
c -------------------------------------------------------
c
subroutine ctable
c
c set up the color table
c
ncolors = 125
neach = ncolors/3 - 1
c
c
c # interpolate between blue and blue-green
ilower = 2
iupper = ilower + neach
irange = iupper - ilower
range = float(irange)
blue = 1.0
red = 0.0
do 20 i = ilower, iupper
green = float(i-ilower)/range
call gscr(1,i,red,green,blue)
20 continue
c
c # interpolate between blue-green and pure green
ilower = iupper + 1
iupper = ilower + neach/2
irange = iupper - ilower
range = float(irange)
green = 1.0
red = 0.0
do 30 i = ilower, iupper
blue = float(iupper-i)/range
call gscr(1,i,red,green,blue)
30 continue
c
c # interpolate between pure green and green-red
ilower = iupper + 1
iupper = ilower + neach/2
irange = iupper - ilower
range = float(irange)
blue = 0.0
green = 1.0
do 40 i = ilower, iupper
red = float(i-ilower)/range
call gscr(1,i,red,green,blue)
40 continue
c
c # interpolate between green-red and pure red
ilower = iupper + 1
iupper = ncolors + 2
irange = iupper - ilower
range = float(irange)
blue = 0.0
red = 1.0
do 50 i = ilower, iupper
green = float(iupper-i)/range
call gscr(1,i,red,green,blue)
50 continue
c
return
end
c
c ----------------------------------------------------------------
c
subroutine lplotx(framecnt,line,linelen)
c
include "call.i"
c
integer framecnt, llen
character lline*50, line*50
c FIX DIMENSIONING
dimension xcord(2933),val(2933)
data lline/15HLINEPLOT LEVEL /,llen/16/
c
iadd(i,j) = loc + i - 1 + maxrows*(j-1)
c
c plot chosen variable in a straight line through domain.
c (here it's a horizontal line, use mid value for y)
c
level = 1
npts = 0
lline = "LINEPLOT "//line(1:linelen)//" LEVEL "
lentot = linelen + 9
eps = hxposs(lfine) /10.
ymid = (ylower + yupper)/2.0
c
xloc = xlower + eps
yloc = ymid
c
2 level = lfine
3 call srchlev(xloc,yloc,level,ngrd,i,j,x,y)
if (ngrd .eq. 0) then
level = level - 1
if (level .lt. 1) then
write(6,*)" couldn't find any grid in lplotx"
call clsgks
stop
endif
go to 3
endif
c
c ngrd is starting grid
c
loc = node(store1,ngrd)
maxrows = node(ndihi,ngrd) - node(ndilo,ngrd) + 3
maxcols = node(ndjhi,ngrd) - node(ndjlo,ngrd) + 3
15 npts = npts + 1
xloc = x
xcord(npts) = xloc
val(npts) = alloc(iadd(i,j))
c
c find next grid to continue with
c
if (level .eq. lfine) then
x = x + hxposs(level)
i = i + 1
if (i .lt. maxrows) go to 15
endif
c
c in general, increment just enough to possibly start next finer level
c
xloc = xloc + hxposs(level)/2.0 + eps
if (xloc .lt. xupper) go to 2
c
c the line is set. now plot
c
40 continue
valmax = -1.e10
valmin = 1.e10
do 115 i = 1, npts
valmin = amin1(valmin,val(i))
115 valmax = amax1(valmax,val(i))
if (valmax .eq. valmin) then
valdif = .05*valmin
else
valdif = .05*(valmax - valmin)
endif
valmin = valmin - valdif
valmax = valmax + valdif
c
valmax = float(int(valmax+.01) + 1)
valmin = float(int(valmin))
call set(.2,.8,.2,.8,xlower,xupper,valmin,valmax,1)
call labmod('(f4.1)','(f6.2)',4,6,1,1,0,0,0)
call gridal(4,4,2,5,1,1,5,dummy,dummy)
c call curve(xcord,val,npts)
ich = ichar('.')
do i = 1, npts
call point(xcord(i),val(i))
end do
c
c setup and print title
c
valdif = (valmax-valmin)/3.
call set(.2,.9,.2,1.,xlower,xupper,valmin,valmax+valdif,1)
xplace = xlower
yplace = valmax +valdif/2.
call pwrit(xplace,yplace,lline,lentot,2,0,-1)
framecnt = framecnt + 1
write(7,299) framecnt, "LINEPLOT",lline
299 format( "Frame# ",i3,2x,a8,2x,a50 )
call frame
c
return
end