SUBROUTINE READ_SORT_CTL (LCNTRL,MAXG,MAXF,K5PDS,MDLID,KGRIDA,
     &  TYPE,SCAL,NAMES,KGRID,IG1,KSMPR,KSMPO,ITILS,JTILS,NEARN,
     &  NFILS,NGRDS,NFLDS,JPDS5,JPDS6,JPDS7,JPDS16,JPDS19,IOUTUN,IRET)
C$$$  SUBPROGRAM DOCUMENTATION BLOCK
C                .      .    .                                       .
C   SUBPROGRAM: READ_SORT_CTL
C   PRGMMR: BALDWIN          ORG: NP22        DATE: 98-08-11  
C
C ABSTRACT: READ_SORT_CTL PROCESSES THE PRDGEN CONTROL FILE.
C
C PROGRAM HISTORY LOG:
C   98-08-11  BALDWIN     ORIGINATOR
C   99-03-25  BALDWIN     MODIFY TO ADD NUMBER OF TILES TO SMOOTHING
C                          PARAMETERS (10'S DIGIT)
C
C USAGE:  CALL READ_SORT_CTL (LCNTRL,MAXG,MAXF,K5PDS,MDLID,KGRIDA,
C    &  TYPE,SCAL,NAMES,KGRID,IG1,KSMPR,KSMPO,ITILS,JTILS,
C    &  NFILS,NGRDS,NFLDS,JPDS5,JPDS6,JPDS7,JPDS16,IOUTUN,IRET)
C
C   INPUT:
C         LCNTRL            INTEGER - UNIT NUMBER OF CONTROL FILE
C         MAXG              INTEGER - MAXIMUM NUMBER OF OUTPUT FILES 
C              ("GRIDS")
C         MAXF              INTEGER - MAXIMUM NUMBER OF GRIB PARAMETERS 
C              ("FIELDS")             IN CONTROL FILE
C
C   OUTPUT:
C         K5PDS(5,MAXF)     INTEGER - PDS ELEMENTS 9-12, 21 FOR EACH FIELD
C         MDLID(MAXG,MAXF)  INTEGER - MODEL NUMBER FOR EACH GRID/FIELD
C         KGRIDA(MAXG,MAXF) INTEGER - GRID NUMBER FOR EACH GRID/FIELD
C         TYPE(MAXG,MAXF)   CHAR*4  - WMO HEADER TYPE FOR EACH GRID/FIELD
C                                      H = INTERNATIONAL     
C                                      A = AWIPS              
C                                      X = NO HEADER           
C         SCAL(MAXG,MAXF)   REAL    - PACKING PRECISION FOR EACH GRID/FIELD
C         NAMES(MAXG,MAXF)  CHAR*16 - OUTPUT NAME FOR EACH GRID/FIELD
C         KGRID(MAXG)       INTEGER - SORTED LIST OF UNIQUE GRID NUMBERS
C         IG1               INTEGER - NUMBER OF UNIQUE OUTPUT GRIDS
C         KSMPR(MAXG,MAXF)  INTEGER - NUMBER OF PRE-INTERPOLATION SMOOTHING
C                                     PASSES FOR EACH GRID/FIELD
C         KSMPO(MAXG,MAXF)  INTEGER - NUMBER OF POST-INTERPOLATION SMOOTHING
C                                     PASSES FOR EACH GRID/FIELD
C         ITILS(MAXG,MAXF)  INTEGER - NUMBER OF TILES IN X DIRECTION
C         JTILS(MAXG,MAXF)  INTEGER - NUMBER OF TILES IN Y DIRECTION
C         NFILS(MAXF)       INTEGER - NUMBER OF OUTPUT FILES THAT EACH
C                                     FIELD WILL BE WRITTEN TO
C         NGRDS(MAXF)       INTEGER - NUMBER OF OUTPUT GRIDS THAT EACH
C                                     FIELD WILL BE INTERPOLATED TO
C                                     (COULD BE LESS THAN NFILS SINCE
C                                      CERTAIN GRIDS ARE WRITTEN TO MORE
C                                      THAN ONE FILE)
C         NFLDS             INTEGER - NUMBER OF FIELDS READ
C         JPDS5(MAXF)       INTEGER - PDS OCTET 9 OF EACH FIELD
C         JPDS6(MAXF)       INTEGER - PDS OCTET 10 OF EACH FIELD
C         JPDS7(MAXF)       INTEGER - PDS OCTET 11-12 OF EACH FIELD
C         JPDS16(MAXF)      INTEGER - PDS OCTET 21 OF EACH FIELD
C         IOUTUN(MAXG,MAXF) INTEGER - OUTPUT UNIT NUMBER OF EACH GRID/FIELD
C         IRET              INTEGER - RETURN CODE
C
C   ENVIRONMENT VARIABLES: (OPTIONAL)
C           COMSP   - PATH PREFIX OF OUTPUT FILE NAMES
C           fhr     - FORECAST HOUR APPENDED TO FILE NAME
C           tmmark  - TIME MARK (tm00) APPENDED TO FILE NAME
C
C   SUBPROGRAMS CALLED:
C     UNIQUE:
C       CTL_RDR - CONTROL FILE READER
C
C   RETURN CODES:
C     IRET =   0 - NORMAL EXIT
C             -1 - INVALID FILE ENTRY
C             -2 - MISPLACED GRID/TYPE INFO 
C             -3 - INVALID GRID/TYPE ENTRY
C             -4 - INVALID GRID #  
C
C ATTRIBUTES:
C   LANGUAGE: FORTRAN 90
C   MACHINE : CRAY J-916
C
C$$$
C    
C    
      INTEGER KGRIDA(MAXG,MAXF),KGRID(MAXG)
      INTEGER JPDS5(MAXF),JPDS6(MAXF), NEARN(MAXF),
     &        JPDS7(MAXF),JPDS16(MAXF),JPDS19(MAXF) 
      INTEGER K5PDS(7,MAXF)
      INTEGER NGRDS(MAXF),NFILS(MAXF),MDLID(MAXG,MAXF)
      INTEGER IOUTUN(MAXG,MAXF)
      INTEGER KSMPO(MAXG,MAXF),KSMPR(MAXG,MAXF)
      INTEGER ITILS(MAXG,MAXF),JTILS(MAXG,MAXF)

      LOGICAL MATCH

      REAL SCAL(MAXG,MAXF)

      CHARACTER NAMES(MAXG,MAXF)*16,FNAME1(MAXG)*16
      CHARACTER FSTHR*16,RESTHR*16,ENVAR*240,DATSET*16,FNAME*256
      CHARACTER TYPE(MAXG,MAXF)*4
C
C
C
      IRET=0
C
C     READ CNTRL FILE.
C     
      DO N=1,MAXF
       NFILS(N)=0
       NGRDS(N)=0
      ENDDO

      CALL CTL_RDR  (LCNTRL, MAXG, K5PDS, MDLID, KGRIDA, TYPE,
     &     SCAL, NAMES, KSMPR, KSMPO, NFILS, NFLDS, IRET0)
      DO I=1,MAXG
      DO J=1,MAXF
       ITILS(I,J)=KSMPR(I,J)/10
       JTILS(I,J)=KSMPO(I,J)/10
       KSMPR(I,J)=MOD(KSMPR(I,J),10)
       KSMPO(I,J)=MOD(KSMPO(I,J),10)
      ENDDO
      ENDDO
      IRET=IRET0

      IF (IRET.NE.0) RETURN
C           
C
C
       DO N=1,NFLDS
        JPDS5(N)=K5PDS(1,N)
        JPDS6(N)=K5PDS(2,N)
        JPDS7(N)=K5PDS(3,N)*256+K5PDS(4,N)
        JPDS16(N)=K5PDS(5,N)
        JPDS19(N)=K5PDS(6,N)
        NEARN(N)=K5PDS(7,N)
        IF(K5PDS(7,N).GT.2 .OR. K5PDS(7,N).LT.1)THEN
          NEARN(N)=1
          print *, 'PLEASE SET INTERPOLATION FLAG TO 1 OR 2 - CODE '
     &,               'WILL ASSUME YOU WANTED 1'
        ENDIF
       ENDDO

C
C  MAKE GDS FOR OUTPUT GRIDS
C   ALSO KEEP TRACK OF NUMBER OF UNIQUE GRIDS, THIS WILL
C   PROBABLY NOT BE THE SAME AS THE NUMBER OF OUTPUT FILES
C

      DO M=1,MAXG
       KGRID(M)=0
      ENDDO
      IG1=0
      DO N=1,NFLDS
       NG1=NFILS(N)
       DO M=1,NG1
C
        JJ=0
        DO L=1,IG1
        IF (KGRIDA(M,N).EQ.KGRID(L)) JJ=JJ+1
        ENDDO
        IF (JJ.EQ.0) THEN
          IG1=IG1+1
          KGRID(IG1)=KGRIDA(M,N)
        ENDIF
C
        MATCH=.FALSE.
        DO L=1,M-1
        IF (KGRIDA(M,N).EQ.KGRIDA(L,N)) MATCH=.TRUE.
        ENDDO
        IF (.NOT.MATCH) NGRDS(N)=NGRDS(N)+1
C
       ENDDO
      ENDDO
C
C  FIGURE OUT UNIQUE FILE NAMES AND ASSIGN UNIT NUMBERS TO EACH FIELD
C
      INAM1=0
      DO N=1,NFLDS
       NG1=NFILS(N)
       DO M=1,NG1
        MATCH=.FALSE.
        DO L=1,INAM1
        IF (NAMES(M,N).EQ.FNAME1(L)) THEN
          MATCH=.TRUE.
          IOUTUN(M,N)=45+L
        ENDIF
        ENDDO
C
C  NEW FILE NAME
C
        IF (.NOT.MATCH) THEN
          INAM1=INAM1+1
          FNAME1(INAM1)=NAMES(M,N)
          IOUTUN(M,N)=45+INAM1
        ENDIF
       ENDDO
      ENDDO
C
C  OPEN OUTPUT FILES
C
C     
C        GET FULL PATH FOR OUTPUT FILE FROM ENVIRONMENT VARIABLE
C        COMSP WHICH IS SET IN THE SCRIPT RUNNING THE MODEL.
C        RESTHR GETS APPENDED TO THE NAME
C        FSTHR IS THE FORECAST HOUR (THIS IS REQUIRED)
C     
C        CONSTRUCT FULL PATH-FILENAME FOR OUTPUT FILE
         ENVAR = ' '
         RESTHR = ' '
         FSTHR = ' '
         CALL get_environment_variable('COMSP',ENVAR)
         CALL get_environment_variable('tmmark',RESTHR)
         CALL get_environment_variable('fhr',FSTHR)
         KENV = INDEX(ENVAR,' ') -1
         IF (KENV.LE.0) KENV = LEN(ENVAR)
         KTHR = INDEX(RESTHR,' ') -1
         IF (KTHR.LE.0) KTHR = LEN(RESTHR)
         KFHR = INDEX(FSTHR,' ') -1
         IF (KFHR.LE.0) KFHR = LEN(FSTHR)

         DO L=1,INAM1
          LUNOUT=45+L
          DATSET=FNAME1(L)
          KDAT = INDEX(DATSET,' ') -1
          IF (KDAT.LE.0) KDAT = LEN(DATSET)
C     
C         CONSTRUCT FULL PATH-FILENAME FOR OUTPUT FILE
          IF (ENVAR(1:4).EQ.'    ') THEN
           IF (RESTHR(1:4).EQ.'    ') THEN
            FNAME = DATSET(1:KDAT) // FSTHR(1:KFHR)
           ELSE
            FNAME = DATSET(1:KDAT) // FSTHR(1:KFHR) // '.' // RESTHR
           ENDIF
          ELSE
           IF (RESTHR(1:4).EQ.'    ') THEN
            FNAME = ENVAR(1:KENV) // DATSET(1:KDAT) // FSTHR(1:KFHR)
           ELSE
            FNAME = ENVAR(1:KENV) // DATSET(1:KDAT) // FSTHR(1:KFHR)
     &              //'.'// RESTHR
           ENDIF
          ENDIF
C
C           OPEN UNIT FOR GRIB DATA FILE.
C
          CALL BAOPENW(LUNOUT,FNAME,IER)
          IF (IER.NE.0) THEN
            WRITE(6,*) '  ERROR = ',IER,' OPENING OUTPUT GRIB DATA ',
     X        'FILE  ',FNAME
          ELSE
            WRITE(6,*)' OPENED ',LUNOUT,' FOR GRIB DATA ',FNAME
          ENDIF
         ENDDO
C
C
C  SORT GRIDS BY GRID NUMBER
C
      DO M=1,IG1-1
       DO MM=M+1,IG1
        IF (KGRID(M).GT.KGRID(MM)) THEN
         IGRID1=KGRID(M)
         KGRID(M)=KGRID(MM)
         KGRID(MM)=IGRID1
        ENDIF
       ENDDO
      ENDDO

      RETURN
      END