C
C Program GRDPS to Display GRiD values in Post Script
C
C Version: 5.40
C Date: 2000, April 19
C
C Coded by Ludek Klimes
C             Department of Geophysics, Charles University Prague
C             Ke Karlovu 3,  121 16  Praha 2,  Czech Republic
C             E-mail: klimes@seis.karlov.mff.cuni.cz
C
C.......................................................................
C                                                    
C Description of data files:
C
C Input data read from the standard input device (*):
C     The data are read by the list directed input (free format) and
C     consist of a single string 'SEP':
C     'SEP'...String in apostrophes containing the name of the input
C             SEP parameter or history file with the input data.
C     No default, 'SEP' must be specified and cannot be blank.
C
C                                                     
C Input data file 'SEP':
C     File 'SEP' has the form of the SEP
C     parameter file.  The parameters, which do not differ from their
C     defaults, need not be specified in file 'SEP'.
C Names of the input and output files:
C     GRD='string' ... Name of the input ASCII file with the grid values
C             to be plotted.
C             For general description of files with gridded data refer
C             to file forms.htm.
C             Default: GRD='grd.out'
C     PS='string' ... Name of the output PostScript file.
C             If non-blank PSHEX is given, output file PS contains just
C             the prolog part of the output PostScript file, see PSHEX.
C             If the value of parameter N4 is greater than 1, PS is
C             the output filename for the first spatial grid.
C             The filenames for the subsequent spatial grids are
C             generated in such a way that all digits contained within
C             the filename are considered a number which is increased
C             by 1 for each new time slice.
C             Default: PS='grd.ps'
C     PSHEX='string' ... Optional name of the output file containing
C             hexadecimal grid data and the PostScript trailer.
C             If PSHEX is blank (default), file PS contains the whole
C             PostScript file.
C             Otherwise, file PS contains just the prolog, setup, and
C             object definition parts, whereas the grid data are written
C             to file PSHEX.
C             The separation into two files is designed to facilitate
C             batch or manual editing of the PostScript definitions.
C             Resulting PostScript file is then obtained by merging
C             PS, possible new definitions and PSHEX.
C             If the value of parameter N4 is greater than 1, PSHEX is
C             the output filename for the first spatial grid.
C             The filenames for the subsequent spatial grids are
C             generated in such a way that all digits contained within
C             the filename are considered a number which is increased
C             by 1 for each new time slice.
C             Default: PSHEX=' '
C     GRDPS2='string', GRDPS3='string', ... , GRDPS9='string' ... Names
C             of the optional input ASCII files with the grid values to
C             be plotted together with data of GRD.
C             For example, data GRD may control hue (colour) and data
C             GRDPS2 may control brightness or saturation.
C             For general description of files with gridded data refer
C             to file forms.htm.
C             Defaults: GRDSP2=' ', ... , GRDPS9=' '
C Data specifying grid dimensions:
C     N1=positive integer... Number of gridpoints along the X1 axis.
C             Default: N1=1
C     N2=positive integer... Number of gridpoints along the X2 axis.
C             Default: N2=1
C     N3=positive integer... Number of gridpoints along the X3 axis.
C             Default: N3=1
C     N4=positive integer... Number of time slices (snapshots).
C             Individual time slices from the input file 'FILEIN' are
C             separated into different files.  The name(s) of the first
C             file(s) is(are) given by input parameters 'PS' and
C             'PSHEX' described above.  Next filenames are generated in
C             such a way that all digits contained within the filenames
C             are considered as numbers which are increased by 1 for
C             each new time slice.
C             Default: N4=1
C     D4=real... Time interval between two consecutive time slices.
C             Useful only if explicitly specifying time-dependent colour
C             scaling of snapshots (see input parameters VCIRC4, VSAT4
C             and VBRI4 below).
C             Default: D4=1.
C Additional data specific to this program:
C (a) Dimensions and layout:
C     NH=positive integer... Layout of 2-D sections of a 3-D grid.
C             Individual 2-D sections of dimensions N1*N2 are merged
C             into rows NH sections long.  Resulting (N3-1)/NH+1 rows
C             are merged together to form the final image.
C             Default: NH=INT(SQRT(N3))
C     UNIT='string'... All lengths controlling the size and position of
C             the plot are assumed to be expressed in the units given
C             by the string.  The units also influence the default
C             paper size, plot size and margins.  Allowed values:
C             UNIT='cm': centimetres (default),
C             UNIT='in': inches (1in=2.54cm),
C             UNIT='pt': big points (1in=72pt).
C             Points (pt) are useful to generate plots for conversion to
C             bitmap forms, e.g., using GhostScript.
C             Default: UNIT='cm'
C     XSIGN=real... Determines the sign of the default value of HSIZE.
C             Default: XSIGN=1.
C     HSIZE=real... Size (in UNITs) of the image, corresponding to the X1
C             axis (horizontal before a possible rotation).
C             If negative, the values will be displayed from the right
C             to the left.
C             Default: HSIZE=SIGN( 16.0,XSIGN) for UNIT='cm',
C                      HSIZE=SIGN(  6.5,XSIGN) for UNIT='in',
C                      HSIZE=SIGN(NH*N1,XSIGN) for UNIT='pt'.
C     YSIGN=real... Determines the sign of the default value of VSIZE.
C             Default: YSIGN=1.
C     VSIZE=real... Size (in UNITs) of the image, corresponding to the X2
C             axis (vertical before a possible rotation).
C             If negative, the values will be displayed from the top to
C             the bottom.
C             Default (proportional display):
C               VSIZE=SIGN(HSIZE*((N3-1)/NH+1)*N2/(NH*N1),YSIGN), i.e.,
C               VSIZE=SIGN(HSIZE*N2/N1,YSIGN) for N3=1.
C     HOFFSET=real... Distance (in UNITs) of the image from the leftmost
C             paper edge (before a possible rotation).  Controls the
C             horizontal position of the figure.
C             Default: HOFFSET=2.5 for UNIT='cm',
C                      HOFFSET=1.0 for UNIT='in',
C                      HOFFSET=0.0 for UNIT='pt'.
C     VOFFSET=real... Distance (in UNITs) of the image from the bottom
C             paper edge (before a possible rotation).  Controls the
C             vertical position of the figure.
C             Default:
C               if VSIZE.LE.HEIGHT-2*2.5:     VOFFSET=HEIGHT-2.5-VSIZE
C               otherwise if VSIZE.LE.HEIGHT: VOFFSET=(HEIGHT-VSIZE)/2.
C               otherwise:                    VOFFSET=2.5
C     HEIGHT=real... Height of the paper in a portrait position.
C             Default: HEIGHT=29.7 for UNIT='cm',
C                      HEIGHT=11.0 for UNIT='in',
C                      HEIGHT=((N3-1)/NH+1)*N2 for UNIT='pt'.
C     ROTATE=real... Enables to rotate the image by angle specified in
C             degrees (positive counterclockwise).  The image is rotated
C             around the centre of the square paper of size HEIGHT.
C             If applied, the user will probably wish to specify the
C             value of ROTATE=90.
C             Parameters HSIZE,VSIZE,HOFFSET,VOFFSET apply to the image
C             before rotation.
C             Attention: BoundingBox is incorrect if ROTATE is not
C               multiple of 90 degrees.
C             Default: ROTATE=0.
C (b) Range of displayed values:
C     VMIN=real, VMAX=real... Values less than or equal to VMIN,
C             or greater than or equal to VMAX will be deemed
C             undefined.  For example, if VMIN=0 is set when plotting
C             velocities, zero velocities are rendered as undefined
C             values, that is usually desirable.
C             Defaults: VMIN=-999999, VMAX=999999000000.
C     R=real, G=real, B=real... Colour of the undefined
C             values.
C             Defaults: R=0.80, G=0.80, B=0.80 (light grey)
C (c) Colour interpretation of values contained within file GRD:
C     VPLUS=real, VSIGN=real, VCIRC=real... VCIRC is the extent of
C             values corresponding to the whole colour circle RGB.
C             Negative VCIRC corresponds to the opposite direction
C             around the colour circle (BGR).
C             Undefined values are displayed in gray.
C             Defaults: VPLUS=0, VSIGN=1,
C               VCIRC=SIGN(GMAX1-GMIN1+VPLUS,VSIGN),
C               where GMINi and GMAXi are the minimum and maximum grid
C               values defined in file 'GRDi'.
C               If the above value of VCIRC is zero (e.g., if
C               GMAX1=GMIN1), the default value of VCIRC is changed to
C               VCIRC=1.
C             Hint: Specify VPLUS=1 when plotting integer values.
C             Hint: To plot velocities with blue minimum velocity,
C               increasing through green, yellow and red again to blue,
C               specify VMIN=0 and VSIGN=-1 with default VREF and CREF.
C     VREF=real, CREF=real... Value VREF corresponds to colour CREF,
C             where Red=0, Yellow=1/6, Green=2/6, Cyan=3/6, Blue=4/6,
C             Magenta=5/6, Red=1, Yellow=7/6, Green=8/6, etc.
C             Default:  VREF=GMIN1, CREF=4/6 (blue).
C               where GMIN1 is the minimum defined grid value.
C               Default VMIN, VMAX, VPLUS, VSIGN, VCIRC, VREF and CREF
C               render the central value (GMIN1+GMAX1)/2 in yellow.
C             Hint: To plot the values oscillating around 0, you may
C               wish to set VREF=0 and CREF=0.166667 to render 0 in
C               yellow.
C     VCIRC4=real... If VCIRC is specified, VCIRC4 enables to modify it
C             in dependence on progressing time levels I4=1,2,...,N4:
C               VCIRC(I4)=VCIRC*EXP(-VCIRC4*(I4-1)*D4)
C             Default:  VCIRC4=0.
C (d) Saturation interpretation of values contained within file GRDPS2:
C     VSAT=real... The extent of values corresponding to the whole
C             saturation range from 0 (white) to 1 (fully saturated
C             colours).
C             Default:  VSAT=GMAX2-GMIN2 (or VSAT=1 for GMIN2=GMAX2).
C     VWHITE=real... Value corresponding to white (saturation=0).
C             Default:  VWHITE=GMIN2 (strictly speaking, =GMAX2-VSAT).
C     VSAT4=real... If VSAT is specified, VSAT4 enables to modify it in
C             dependence on progressing time levels I4=1,2,...,N4:
C               VSAT(I4)=VSAT*EXP(-VSAT4*(I4-1)*D4)
C             Default:  VSAT4=0.
C (e) Brightness interpretation of values contained within file GRDPS3:
C     VBRI=real... The extent of values corresponding to the whole
C             brightness range from 0 (black) to 1 (bright colours).
C             Default:  VBRI=GMAX3-GMIN3 (or VBRI=1 for GMIN3=GMAX3).
C     VBLACK=real... Value corresponding to black (brightness=0).
C             Default:  VBLACK=GMIN3 (strictly speaking, =GMAX3-VBRI).
C     VBRI4=real... If VBRI is specified, VBRI4 enables to modify it in
C             dependence on progressing time levels I4=1,2,...,N4:
C               VBRI(I4)=VBRI*EXP(-VBRI4*(I4-1)*D4)
C             Default:  VBRI4=0.
C (f) Form of the output PostScript file:
C     SHOWPAGE=integer... PostScript command 'showpage' at the end of
C             file directs printer to print and delete the picture.
C             This is usually what we want.  However, sometimes we may
C             wish to overlay the picture with another one.  In this
C             case, we wish to remove the 'showpage'.
C             SHOWPAGE=0: Two last lines of the file containing strings
C               'showpage' and '%%EOF' are not written.
C             SHOWPAGE=1: The lines are written.
C             Default:  SHOWPAGE=1
C
C=======================================================================
C
C Common block /RAMC/:
      INCLUDE 'ram.inc'
C     ram.inc
C
      INTEGER MGRID
      PARAMETER (MGRID=MRAM)
      REAL GRID(MGRID)
      EQUIVALENCE (GRID,RAM)
      INTEGER IGRID(MGRID)
      EQUIVALENCE (GRID,IGRID)
C
C.......................................................................
C
      CHARACTER*2 UNIT
      REAL UNITPT,HEIGHT,OFFSET,WIDTH
C
C     UNIT... One of: 'cm', 'in', 'pt'.
C     UNITPT...Size of the length unit, in which input data controlling
C             the size and position of the plot are expressed, in big
C             points (pt).  E.g., UNITPT=72./2.54 corresponds to plotting
C             in cm.
C     HEIGHT..Anticipated height of the paper sheet.
C     OFFSET..Left margin, and top or bottom margin for low or high
C             plots, respectively.
C     WIDTH...Default width of the plot.
C
      INTEGER MFILE,LU
      PARAMETER (MFILE=9,LU=10)
      CHARACTER*80 FSEP,FPS,FPSHEX,FILE(MFILE)
      CHARACTER*1 HEX1(0:15)
      CHARACTER*2 HEX2(0:255)
      CHARACTER*6 FGRDPS
      INTEGER LUIN(MFILE)
      REAL UNDEF
      PARAMETER (UNDEF=-999999.)
      INTEGER NFILE,IFILE,N1,N2,N3,N31,N32,N4,J,J0,I,I0,I1,I2,I31,I32,I4
      INTEGER ISHOW
      REAL XSIGN,YSIGN
      REAL VMIN,VMAX,VPLUS,VSIGN,VCIRC,VREF,CREF,ROTATE,RED,GREEN,BLUE
      REAL GMIN(MFILE),GMAX(MFILE),G,G0,GSTEP
      REAL BBOX1,BBOX2,BBOX3,BBOX4,BB1,BB2,BB3,BB4
      REAL BB1P,BB2P,BB3P,BB4P,BB2DEF,BB4DEF,AUX,VAUX,C,S
      DATA LUIN /1,2,3,4,5,6,7,8,9/
      DATA HEX1
     * /'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'/
C
C-----------------------------------------------------------------------
C
C     Reading name of SEP file with input data:
      WRITE(*,'(A)') '+GRDPS: Enter input filename: '
      FSEP=' '
      READ(*,*) FSEP
      WRITE(*,'(A)') '+GRDPS: Working ...           '
C
C     Reading all data from the SEP file into the memory:
      IF (FSEP.NE.' ') THEN
        CALL RSEP1(LU,FSEP)
      ELSE
C       GRDPS-04
        CALL ERROR('GRDPS-04: SEP file not given')
C       Input file in the form of the SEP (Stanford Exploration Project)
C       parameter or history file must be specified.
C       There is no default filename.
      ENDIF
C
C     Reading input parameters from the SEP file:
      CALL RSEP3T('GRD',FILE(1),'grd.out')
      CALL RSEP3T('PS',FPS,'grd.ps')
      CALL RSEP3T('PSHEX',FPSHEX,' ')
      FGRDPS='GRDPS0'
      DO 12 IFILE=1,MFILE
        FGRDPS(6:6)=CHAR(ICHAR('0')+IFILE)
        IF (IFILE.NE.1) CALL RSEP3T(FGRDPS,FILE(IFILE),' ')
        IF(FILE(IFILE).EQ.' ') THEN
          NFILE=IFILE-1
          GO TO 13
        END IF
   12 CONTINUE
   13 CONTINUE
      CALL RSEP3I('SHOWPAGE',ISHOW,1)
C
C     Recalling the data specifying grid dimensions
C     (arguments: Name of value in input data, Variable, Default):
      CALL RSEP3I('N1',N1,1)
      CALL RSEP3I('N2',N2,1)
      CALL RSEP3I('N3',N3,1)
      CALL RSEP3I('N4',N4,1)
C     Transforming 2-D arrays to N1*N2*1 and 1-D arrays to N1*1*1
      IF(N1.EQ.1) THEN
        N1=N2
        N2=N3
        N3=1
      END IF
      IF(N1.EQ.1) THEN
        N1=N2
        N2=1
      END IF
      IF(N2.EQ.1) THEN
        N2=N3
        N3=1
      END IF
C     Determining the layout of 2-D slices of 3-D arrays
      CALL RSEP3I('NH',N31,INT(SQRT(FLOAT(N3))+.001))
      N32=(N3-1)/N31+1
      IF(N1*N2*N31*N32*NFILE.GT.MGRID) THEN
C       GRDPS-01
        CALL ERROR('GRDPS-01: Too small array RAM(MRAM)')
C       Array RAM(MRAM) allocated in include file 'ram.inc' is too small
C       to contain the grid values to be plotted.  You may wish to
C       increse the dimension MRAM in file 'ram.inc'.
C       ram.inc
      END IF
C     N3 slices will be arranged into N31*N32 slices.
C
C     Recalling the plotting unit and setting default dimensions:
      CALL RSEP3T('UNIT',UNIT,'cm')
      CALL LOWER(UNIT)
      IF(UNIT.EQ.'cm') THEN
        UNITPT=72./2.54
        HEIGHT=29.7
        OFFSET=2.5
        WIDTH=16.0
      ELSE IF(UNIT.EQ.'in') THEN
        UNITPT=72.
        HEIGHT=11.0
        OFFSET=1.0
        WIDTH=6.5
      ELSE IF(UNIT.EQ.'pt') THEN
        UNITPT=1.
        HEIGHT=FLOAT(N32*N2)
        OFFSET=0.0
        WIDTH=FLOAT(N31*N1)
      ELSE
C       GRDPS-02
        CALL ERROR('GRDPS-02: Unrecognized plotting units')
C       Allocated plotting units are UNIT='cm', UNIT='in' or UNIT='pt'.
      END IF

C.......................................................................
C
C     Loop over time slices:
      DO 90 I4=1,N4
        IF(I4.EQ.1) THEN
          IF(N4.GT.1) THEN
            DO 15 IFILE=1,NFILE
              OPEN(LUIN(IFILE),FILE=FILE(IFILE),
     *                                    FORM='FORMATTED',STATUS='OLD')
              FILE(IFILE)=' '
   15       CONTINUE
          END IF
        ELSE
C         Generating new output filenames:
          CALL NEWNAM(FPS)
          CALL NEWNAM(FPSHEX)
        END IF
C
C       Reading input grid values:
        DO 16 IFILE=1,NFILE
          CALL RARRAY(LUIN(IFILE),FILE(IFILE),'FORMATTED',.TRUE.,UNDEF,
     *                         N1*N2*N3,GRID(N1*N2*N31*N32*(IFILE-1)+1))
   16   CONTINUE
C
C       Rearranging 3-D input N1*N2*N3 grid into (N1*N31)*(N2*N32) grid:
        DO 29 IFILE=0,N1*N2*N31*N32*(NFILE-1),N1*N2*N31*N32
C         Extending the grid to N1*N2*N31*N32 points
          DO 21 I=IFILE+N1*N2*N3+1,IFILE+N1*N2*N31*N32
            GRID(I)=UNDEF
   21     CONTINUE
C         Transposing the N1*N2*N31*N32 grid to N1*N31*N2*N32 grid
          DO 25 I32=0,N2*N31*(N32-1),N2*N31
            DO 24 I0=0,N2*N31-1
              J0=I0
   22         CONTINUE
                I2=J0/N31
                I31=J0-I2*N31
                J0=I31*N2+I2
              IF(J0.LT.I0) GO TO 22
              I=IFILE+(I32+I0)*N1
              J=IFILE+(I32+J0)*N1
              DO 23 I1=1,N1
                I=I+1
                J=J+1
                AUX=GRID(I)
                GRID(I)=GRID(J)
                GRID(J)=AUX
   23         CONTINUE
   24       CONTINUE
   25     CONTINUE
   29   CONTINUE
C
        N1=N1*N31
        N2=N2*N32
C
C.......................................................................
C
C       Recalling the data for the plotting area:
        CALL RSEP3R('XSIGN'  ,XSIGN,1.)
        CALL RSEP3R('YSIGN'  ,YSIGN,1.)
        AUX=HEIGHT
        CALL RSEP3R('HEIGHT' ,HEIGHT,AUX)
        CALL RSEP3R('HSIZE'  ,BB3,SIGN(WIDTH,XSIGN))
        CALL RSEP3R('HOFFSET',BB1,OFFSET)
C       Default height of the figure
        BB4DEF=ABS(BB3)*FLOAT(N2)/FLOAT(N1)
        CALL RSEP3R('VSIZE'  ,BB4,SIGN(BB4DEF,YSIGN))
C       Default vertical position of the figure
        IF(ABS(BB4).LE.HEIGHT-2.*OFFSET) THEN
          BB2DEF=HEIGHT-OFFSET-ABS(BB4)
        ELSE IF(ABS(BB4).LE.HEIGHT) THEN
          BB2DEF=(HEIGHT-ABS(BB4))/2.
        ELSE
          BB2DEF=OFFSET
        END IF
        CALL RSEP3R('VOFFSET',BB2,BB2DEF)
        IF(BB3.LT.0.) THEN
          BB1=BB1-BB3
        END IF
        IF(BB4.LT.0.) THEN
          BB2=BB2-BB4
        END IF
        CALL RSEP3R('ROTATE',ROTATE,0.)
C
C       Transformation from plotting units (e.g. centimetres) to points:
        BB1P=BB1*UNITPT
        BB2P=BB2*UNITPT
        BB3P=BB3*UNITPT
        BB4P=BB4*UNITPT
C       Bounding box:
        BBOX1=AMIN1(BB1P,BB1P+BB3P)
        BBOX2=AMIN1(BB2P,BB2P+BB4P)
        BBOX3=AMAX1(BB1P,BB1P+BB3P)
        BBOX4=AMAX1(BB2P,BB2P+BB4P)
        IF(ROTATE.NE.0.) THEN
          C=COS(ROTATE*3.14159/180.)
          S=SIN(ROTATE*3.14159/180.)
          BBOX1=BBOX1-HEIGHT*UNITPT/2.
          BBOX2=BBOX2-HEIGHT*UNITPT/2.
          BBOX3=BBOX3-HEIGHT*UNITPT/2.
          BBOX4=BBOX4-HEIGHT*UNITPT/2.
          AUX  =C*BBOX1-S*BBOX2
          BBOX2=S*BBOX1+C*BBOX2
          BBOX1=AUX
          AUX  =C*BBOX3-S*BBOX4
          BBOX4=S*BBOX3+C*BBOX4
          BBOX3=AUX
          BBOX1=BBOX1+HEIGHT*UNITPT/2.
          BBOX2=BBOX2+HEIGHT*UNITPT/2.
          BBOX3=BBOX3+HEIGHT*UNITPT/2.
          BBOX4=BBOX4+HEIGHT*UNITPT/2.
          AUX  =AMIN1(BBOX1,BBOX3)
          BBOX3=AMAX1(BBOX1,BBOX3)
          BBOX1=AUX
          AUX  =AMIN1(BBOX2,BBOX4)
          BBOX4=AMAX1(BBOX2,BBOX4)
          BBOX2=AUX
        END IF
C
C.......................................................................
C
C       Calculating minimum and maximum values GMIN(*) and GMAX(*):
        CALL RSEP3R('VMIN',VMIN,-999999.)
        CALL RSEP3R('VMAX',VMAX, 999999000000.)
        DO 33 IFILE=1,NFILE
          NNN=N1*N2*(IFILE-1)
          GMINI=VMAX
          GMAXI=VMIN
          DO 31 I=NNN+1,NNN+N1*N2
            G=GRID(I)
            IF(G.NE.UNDEF) THEN
              IF(G.LE.VMIN.OR.VMAX.LE.G) THEN
                GRID(I)=UNDEF
              ELSE
                GMINI=AMIN1(GMINI,G)
                GMAXI=AMAX1(GMAXI,G)
              END IF
            END IF
   31     CONTINUE
C
C         Rescaling range GMIN--GMAX to 0--254
c         (undefined values are 255):
          IF(GMINI.NE.GMAXI) THEN
            GSTEP=(GMAXI-GMINI)/254.
          ELSE
            GSTEP=1.
          END IF
          G0=GMINI-GSTEP/2.
          DO 32 I=NNN+1,NNN+N1*N2
            IF(GRID(I).NE.UNDEF) THEN
              G=(GRID(I)-G0)/GSTEP
              IGRID(I)=INT(G)
            ELSE
              IGRID(I)=255
            END IF
   32     CONTINUE
C
          GMIN(IFILE)=GMINI
          GMAX(IFILE)=GMAXI
   33   CONTINUE
C
C       Preparing hexadecimal coding table:
        I=0
        DO 42 I2=0,15
          DO 41 I1=0,15
            HEX2(I)(1:1)=HEX1(I2)
            HEX2(I)(2:2)=HEX1(I1)
            I=I+1
   41     CONTINUE
   42   CONTINUE
C
C       Parameters controlling colours:
        CALL RSEP3R('D4'    ,D4    ,1.)
        TIME=FLOAT(I4-1)*D4
        CALL RSEP3R('VPLUS' ,VPLUS ,0.)
        CALL RSEP3R('VSIGN' ,VSIGN ,0.)
        CALL RSEP3R('VCIRC4',VAUX  ,0.)
        VAUX=EXP(VAUX*TIME)
        AUX=SIGN(GMAX(1)-GMIN(1)+VPLUS,VSIGN)*VAUX
        IF(AUX.EQ.0.) AUX=1.
        CALL RSEP3R('VCIRC' ,VCIRC ,AUX)
        VCIRC=VCIRC/VAUX
        CALL RSEP3R('VREF'  ,VREF  ,GMIN(1))
        CALL RSEP3R('CREF'  ,CREF  ,2./3.)
        IF(NFILE.GE.2) THEN
          CALL RSEP3R('VSAT4' ,VAUX  ,0.)
          VAUX=EXP(VAUX*TIME)
          AUX=(GMAX(2)-GMIN(2))*VAUX
          IF(AUX.EQ.0.) AUX=1.
          CALL RSEP3R('VSAT'  ,VSAT  ,AUX)
          VSAT=VSAT/VAUX
          CALL RSEP3R('VWHITE',VWHITE,GMAX(2)-AUX)
        END IF
        IF(NFILE.GE.3) THEN
          CALL RSEP3R('VBRI4' ,VAUX  ,0.)
          VAUX=EXP(VAUX*TIME)
          AUX=(GMAX(3)-GMIN(3))*VAUX
          IF(AUX.EQ.0.) AUX=1.
          CALL RSEP3R('VBRI'  ,VBRI  ,AUX)
          VBRI=VBRI/VAUX
          CALL RSEP3R('VBLACK',VBLACK,GMAX(3)-AUX)
        END IF
C
C       Writing PostScript prolog:
        WRITE(*,'(''+'',79('' ''))')
        WRITE(*,'(2A)') '+Writing: ',FPS(1:MIN0(LEN(FPS),70))
        OPEN(LU,FILE=FPS)
        WRITE(LU,'(A/A,4I6,/(A))')
     *  '%!PS-Adobe-3.0',
     *  '%%BoundingBox:',INT(BBOX1+.5),INT(BBOX2+.5),
     *                   INT(BBOX3+.5),INT(BBOX4+.5),
     *  '%%EndComments',
     *  '%%BeginProlog',
     *  '%%BeginProcSet: (grdps)',
     *  '%%Creator: grdps',
     *  '%-----------------------------------------------------------',
     *  '% Default UNDEFINED procedure:'
C520    WRITE(LU,'(A)')
C520 *  '/UNDEFINED {0 0 0.80 sethsbcolor} bind def'
        CALL RSEP3R('R',RED  ,0.80)
        CALL RSEP3R('G',GREEN,0.80)
        CALL RSEP3R('B',BLUE ,0.80)
        WRITE(LU,'(A,3(F4.2,1X),A)')
     *  '/UNDEFINED {',RED,GREEN,BLUE,'setrgbcolor} bind def'
        WRITE(LU,'(A)')
     *  '% Default VALUEtoCOLOR procedure:'
        WRITE(LU,'(3(A,G13.6)/A,G13.6,A/A,G13.6,A/A)')
     *  '/VCIRC  ',VCIRC ,' def % Range of grid values:',
     *                                            GMIN(1),' to',GMAX(1),
     *  '/VREF   ',VREF  ,' def',
     *  '/CREF   ',CREF  ,' def',
     *  '/VRED VREF CREF VCIRC mul sub def'
        IF(NFILE.GE.2) THEN
          WRITE(LU,'(3(A,G13.6)/A,G13.6,A)')
     *    '/VSAT   ',VSAT  ,' def % Range of grid values:',
     *                                            GMIN(2),' to',GMAX(2),
     *    '/VWHITE ',VWHITE,' def'
        END IF
        IF(NFILE.GE.3) THEN
          WRITE(LU,'(3(A,G13.6)/A,G13.6,A)')
     *    '/VBRI   ',VBRI  ,' def % Range of grid values:',
     *                                            GMIN(3),' to',GMAX(3),
     *    '/VBLACK ',VBLACK,' def'
        END IF
        WRITE(LU,'(A)')
     *    '/VALUEtoCOLOR{'
        IF(NFILE.LE.1) THEN
          WRITE(LU,'(A)')
     *      ' VRED sub VCIRC div dup truncate sub dup 0 lt {1 add} if'
        ELSE
          WRITE(LU,'(A,I1,9A))')
     *      ' ',NFILE,' -1 roll',
     *      ' VRED sub VCIRC div dup truncate sub dup 0 lt {1 add} if'
        END IF
        IF(NFILE.LE.1) THEN
          WRITE(LU,'(A)')
     *    ' 1'
        ELSE
          WRITE(LU,'(A,I1,9A))')
     *      ' ',NFILE,' -1 roll',
     *      ' VWHITE sub VSAT div'
        END IF
        IF(NFILE.LE.2) THEN
          WRITE(LU,'(A)')
     *      ' 1'
        ELSE
          WRITE(LU,'(A,I1,9A))')
     *      ' ',NFILE,' -1 roll',
     *      ' VBLACK sub VBRI div'
        END IF
        DO 51 IFILE=4,NFILE
          WRITE(LU,'(A)')
     *    ' pop'
   51   CONTINUE
        WRITE(LU,'(A)')
     *  ' sethsbcolor} bind def',
     *  '%-----------------------------------------------------------',
     *  '% User-defined VALUEtoCOLOR procedure may be inserted here:'
        IF(FPSHEX.NE.' ') THEN
          CLOSE(LU)
          WRITE(*,'(''+'',79('' ''))')
          WRITE(*,'(2A)') '+Writing: ',FPSHEX(1:MIN0(LEN(FPSHEX),70))
          OPEN(LU,FILE=FPSHEX)
        END IF
C
C       Writing the plotting procedure:
        WRITE(LU,'(A)')
     *  '%-----------------------------------------------------------',
     *  '%%EndProcSet',
     *  '%%EndProlog',
     *  '%-----------------------------------------------------------',
     *  '%%BeginSetup',
     *  '% Numerical values describing the image size and position:'
        WRITE(LU,'(A,I6,A)')          '/N1',N1,' def'
        WRITE(LU,'(A,I6,A)')          '/N2',N2,' def'
        WRITE(LU,'(A,F8.1,A,F8.3,A)') '/BB1',BB1P,' def %',BB1,'cm'
        WRITE(LU,'(A,F8.1,A,F8.3,A)') '/BB2',BB2P,' def %',BB2,'cm'
        WRITE(LU,'(A,F8.1,A,F8.3,A)') '/BB3',BB3P,' def %',BB3,'cm'
        WRITE(LU,'(A,F8.1,A,F8.3,A)') '/BB4',BB4P,' def %',BB4,'cm'
        WRITE(LU,'(A,F8.1,A)')        '/PAPERSIZE',HEIGHT*UNITPT,' def'
        WRITE(LU,'(A,F8.1,A)')        '/ROTATE',ROTATE,' def'
        WRITE(LU,'(A)')
     *  '% Scaling of grid values:'
        DO 52 IFILE=1,NFILE
          WRITE(LU,'(A,I1,A,G13.6,A)')
     *    '/GMIN',IFILE,' ',GMIN(IFILE),' def'
          WRITE(LU,'(A,I1,A,G13.6,A)')
     *    '/GMAX',IFILE,' ',GMAX(IFILE),' def'
   52   CONTINUE
        WRITE(LU,'(A)')
     *  '%%EndSetup',
     *  '%-----------------------------------------------------------',
     *  '%%BeginObject: (grdps)',
     *  'PAPERSIZE  2 div dup translate ROTATE rotate',
     *  'PAPERSIZE -2 div dup translate',
     *  '/SCALE1 N1 BB3 div def',
     *  '/SCALE2 N2 BB4 div def'
        DO 53 IFILE=1,NFILE
          WRITE(LU,'(9(A,I1))')
     *    '/VSTEP',IFILE,' GMAX',IFILE,' GMIN',IFILE,' sub 254 div def'
   53   CONTINUE
        WRITE(LU,'(A)')
     *  '/RGB 3 string def',
     *  'N1 N2 8 [ SCALE1 0 0 SCALE2 BB1 SCALE1 mul neg',
     *  '                            BB2 SCALE2 mul neg ]'
        WRITE(LU,'(A,I1,A)')
     *  '{currentfile ',NFILE,' string readhexstring pop'
        DO 54 IFILE=1,NFILE
          WRITE(LU,'(9(A,I1))')
     *    ' dup ',IFILE-1,
     *                  ' get VSTEP',IFILE,' mul GMIN',IFILE,' add exch'
   54   CONTINUE
        WRITE(LU,'(11A)')
     *  ' 0 get 255 eq {',('pop ',IFILE=1,NFILE),
     *                                'UNDEFINED} {VALUEtoCOLOR} ifelse'
        WRITE(LU,'(A)')
     *  ' currentrgbcolor',
     *  ' 255 mul .5 add cvi RGB exch 2 exch put',
     *  ' 255 mul .5 add cvi RGB exch 1 exch put',
     *  ' 255 mul .5 add cvi RGB exch 0 exch put RGB}',
     *  '                            bind false 3 colorimage'
C
C       Writing output hexadecimal values:
        N12=N1*N2
        NNN=N1*N2*NFILE
        IF(NFILE.EQ.1) THEN
          WRITE(LU,'(40A2)') (HEX2(IGRID(I)),I=1,N12)
        ELSE
          DO 61 I=N12+1,NNN
            IF(IGRID(I).GE.255) THEN
              IGRID(MOD(I,N12))=255
            END IF
   61     CONTINUE
          WRITE(LU,'(40A2)')
     *                    ((HEX2(IGRID(IFILE)),IFILE=I,NNN,N12),I=1,N12)
        END IF
C
C       Writing PostScript trailer:
        WRITE(LU,'(A)')
     *  'PAPERSIZE  2 div dup translate ROTATE neg rotate',
     *  'PAPERSIZE -2 div dup translate',
     *  '%%EndObject'
        IF(ISHOW.NE.0) THEN
          WRITE(LU,'(A)')
     *    'showpage',
     *    '%%EOF'
        END IF
        CLOSE(LU)
C
   90 CONTINUE
C     End of the loop over time slices.
C
      IF(N4.GT.1) THEN
        DO 91 IFILE=1,NFILE
          CLOSE(LUIN(IFILE))
   91   CONTINUE
      END IF
      WRITE(*,'(A)') '+GRDPS: Done.                 '
      STOP
      END
C
C=======================================================================
C
C     
C
      SUBROUTINE NEWNAM(NAME)
      CHARACTER*(*) NAME
C
C-----------------------------------------------------------------------
C
      INTEGER N,I
C
      IF(NAME.NE.' ') THEN
        N=LEN(NAME)
   10   CONTINUE
        DO 11 I=N,1,-1
          IF(LLE('0',NAME(I:I)).AND.LLE(NAME(I:I),'8')) THEN
            NAME(I:I)=CHAR(ICHAR(NAME(I:I))+1)
            GO TO 12
          ELSE IF(NAME(I:I).EQ.'9') THEN
            NAME(I:I)='0'
            N=I-1
            GO TO 10
          END IF
   11   CONTINUE
C         GRDPS-03
          CALL ERROR('GRDPS-03: Too many output files')
C         The digits in the template name of the output files do not
C         allow for the generation of all output filenames.
C         The number of digits should be increased.
   12   CONTINUE
      END IF
      RETURN
      END
C
C=======================================================================
C
      INCLUDE 'error.for'
C     error.for
      INCLUDE 'sep.for'
C     sep.for
      INCLUDE 'forms.for'
C     forms.for
      INCLUDE 'length.for'
C     length.for
C
C=======================================================================
C