!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!

      SUBROUTINE SUTOVST 1,6
#if defined (DOC)
*
***s/r SUTOVST  - Read the observation error statistics and
*                 utilization flag for TOVS processing.
*
*
*Author  : J. Halle *CMDA/AES  May 08, 1996
*
*Revision 01  : J. Halle *CMDA/AES  Oct 1999
*               - change file name to stats_tovs
*
*Revision 002  : J. Halle *CMDA/AES  dec 2000
*                adapt to TOVS level 1b.
*
*Revision 003  : J. Halle *CMDA/SMC  may 2002
*                adapt to RTTOV-7.
*
*Revision 004  : J. Halle *CMDA/SMC  sept 2006
*                adapt to RTTOV-8.
*
*Revision 005  : A. Beaulne *CMDA/SMC  fevr 2007
*                adapt utilization flag for AIRS channels
*
*Revision 006  : S. Heilliette
*                adapt utilization flag for IASI channels
*
*    -------------------
**    Purpose: Read the observation error statistics and
*              utilization flag for TOVS processing. This information
*              resides on an ASCII file and is read using a free format.
#endif

      use airsch
      use iasich

      IMPLICIT NONE

*implicits
#include "comlun.cdk"
#include "partov.cdk"
#include "comtov.cdk"
#include "comtovst.cdk"
#include "comct0.cdk"
C
      INTEGER MXPLATFORM, MXINSTRUMENT
      PARAMETER (MXPLATFORM   = 16)
      PARAMETER (MXINSTRUMENT = 29)
C
      INTEGER IER, ILUTOV, JI, JJ, JK, JL, JM, I
      INTEGER IPOS1, IPOS2
      INTEGER INUMSAT, ISAT, IPLF
      INTEGER FNOM, FCLOS, ISRCHEQ
      INTEGER IPLATFORM (JPNSATMAX)
      INTEGER ISATID (JPNSATMAX)
      INTEGER IINSTRUMENT (JPNSATMAX)
      INTEGER IUTILST   (JPCHMAX,JPMXCLD,JPMXREG,JPNSATMAX)
      INTEGER ICHN   (JPCHMAX,JPNSATMAX)
      INTEGER ICHNIN   (JPCHMAX,JPNSATMAX)
      INTEGER NUMCHN (JPNSATMAX)
      INTEGER NUMCHNIN (JPNSATMAX)
      INTEGER NOPLATFORM(MXPLATFORM)
      INTEGER NOINSTRUMENT(MXINSTRUMENT)
*
      REAL*8    TOVERRIN(JPCHMAX,JPMXCLD,JPMXREG,JPNSATMAX)
C
      CHARACTER*132  CLDUM
      CHARACTER*13   CLCLD(JPMXCLD)
      CHARACTER*13   CLREG(JPMXREG)
C
      CHARACTER*15 CPLATFORM  (MXPLATFORM  )
      CHARACTER*15 CINSTRUMENT(MXINSTRUMENT)

C
      DATA CLCLD / 'CLEAR        ' ,
     S             'PARTLY CLOUDY' ,
     S             'CLOUDY       ' /
      DATA CLREG / 'OCEAN        ' ,
     S             'CONTINENT    ' /
*
**                         Tables for Platforms
**                         --------------------
*
      DATA CPLATFORM  / 'NOAA',    'DMSP',   'METEOSAT',     'GOES',
     &                   'GMS',     'FY2',       'TRMM',      'ERS',
     &                   'EOS',   'METOP',    'ENVISAT',      'MSG',
     &                   'FY1',   'ADEOS',      'MTSAT', 'CORIOLIS'/
*
      DATA NOPLATFORM /      1,         2,            3,          4,
     &                       5,         6,            7,          8,
     &                       9,        10,           11,         12,
     &                      13,        14,           15,         16/
*
**                         Tables for Instruments
**                         ----------------------
*
      DATA CINSTRUMENT  /      'HIRS',       ' MSU',         'SSU',
     &                        'AMSUA',      'AMSUB',       'AVHRR',
     &                         'SSMI',      'VTPR1',       'VTPR2',
     &                          'TMI',      'SSMIS',        'AIRS',
     &                          'HSB',      'MODIS',        'ATSR',
     &                          'MHS',       'IASI',        'AMSR',
     &                        'MVIRI',     'SEVERI',  'GOESIMAGER',
     &                  'GOESSOUNDER',   'GMSMTSAT',    'FY2VISSR',
     &                     'FY1MVISR',       'CRIS',       'CMISS',
     &                        'VIIRS',    'WINDSAT'/               
*
      DATA NOINSTRUMENT /           0,            1,             2,
     &                              3,            4,             5,
     &                              6,            7,             8,
     &                              9,           10,            11,
     &                             12,           13,            14,
     &                             15,           16,            17,
     &                             20,           21,            22,
     &                             23,           24,            25,
     &                             26,           27,            28,
     &                             29,           30/               
C
      EXTERNAL FNOM, FCLOS, ISRCHEQ
      EXTERNAL ABORT3D
C
      WRITE(NULOUT,FMT=9000)
 9000 FORMAT(//,10x,"-SUTOVST: reading observation error statistics"
     S     ," required for TOVS processing")
C
C
C*    1. Initialize
C     .  ----------
C
 100  CONTINUE
      NREGST = 0
      NCLDST = 0
      DO JL = 1, JPNSATMAX
         DO JK = 1, JPMXREG
            DO JJ = 1, JPMXCLD
               DO JI = 1, JPCHMAX
                  TOVERRST(JI,JJ,JK,JL) = 0.0
                  TOVERRIN(JI,JJ,JK,JL) = 0.0
                  IUTILST   (JI,JJ,JK,JL) = 0
               ENDDO
            ENDDO
         ENDDO
      ENDDO
*
      DO JL = 1, JPNSATMAX
         IPLATFORM(JL) = 0
         NUMCHN(JL) = 0
         NUMCHNIN(JL) = 0
         DO JI = 1, JPCHMAX
            ICHN(JI,JL) = 0
            ICHNIN(JI,JL) = 0
         ENDDO
      ENDDO
C
C*    2. Open the file
C     .  -------------
C
 200  CONTINUE
      ilutov = 0
      IER =  FNOM(ILUTOV,'stats_tovs','SEQ+FMT',0)
      IF(IER.LT.0)THEN
         WRITE ( NULOUT, '(" SUTOVST: Problem opening ",
     S         "file stats_tovs ")' )
         CALL ABORT3D ( NULOUT,'SUTOVST         ')
      END IF
C
C*    3. Print the file contents
C     .  -----------------------
C
 300  CONTINUE
C
      WRITE(NULOUT,'(20X,"ASCII dump of stats_tovs file: "//)')
      DO JI = 1, 9999999
         READ (ILUTOV,'(A)',ERR=900,END=400) CLDUM
         WRITE(NULOUT,'(A)')   CLDUM
      ENDDO
C
C*    4. Read number of satellites, regions and cloud classes
C     .  ----------------------------------------------------
C
 400  CONTINUE
C
      REWIND(ILUTOV)
      READ (ILUTOV,*,ERR=900)
      READ (ILUTOV,*,ERR=900) INUMSAT, NREGST, NCLDST
C
C*    5. Read the satellite identification, the number of channels,
C*    .  the observation errors and the utilization flags
C     .  ----------------------------------------------------------
C
 500  CONTINUE
C
      DO JL = 1, INUMSAT
         READ (ILUTOV,'(A)',ERR=900) CLDUM
         READ (ILUTOV,*,ERR=900) ISATID(JL), NUMCHNIN(JL)
         DO JI = 1, 6
            READ (ILUTOV,*,ERR=900)
         ENDDO
C
         IPLATFORM(JL) = 1            
         DO I = 1, MXPLATFORM
            IPOS1=LEN_TRIM(CPLATFORM(I))
            IPOS2 = INDEX(CLDUM,CPLATFORM(I)(1:IPOS1))
            IF ( IPOS2 .NE. 0 ) THEN
               IPLATFORM(JL) = NOPLATFORM(I)
               GO TO 510
            ENDIF
         ENDDO
C
 510     CONTINUE
         IINSTRUMENT(JL) = -1    
         DO I = 1, MXINSTRUMENT
            IPOS1=LEN_TRIM(CINSTRUMENT(I))
            IPOS2 = INDEX(CLDUM,CINSTRUMENT(I)(1:IPOS1))
            IF ( IPOS2 .NE. 0 ) THEN
               IINSTRUMENT(JL) = NOINSTRUMENT(I)
               GO TO 520
            ENDIF
         ENDDO
C
 520     CONTINUE
         DO JI = 1, NUMCHNIN(JL)
            READ (ILUTOV,*,ERR=900) ICHNIN(JI,JL),
     S                ((TOVERRIN(ICHNIN(JI,JL),JJ,JK,JL),
     S                  IUTILST (ICHNIN(JI,JL),JJ,JK,JL),
     S                  JJ=1,NCLDST), JK=1,NREGST)
         ENDDO
      ENDDO
C
C**   Check that oberservation error statistics have been defined for
C*    all the satellites specified in the namelist.
C
      DO JM= 1, INUMSAT
        DO JL = 1, NSENSORS
          IF ( PLATFORM (JL) .EQ. IPLATFORM(JM) .AND.
     S         SATELLITE(JL) .EQ. ISATID   (JM)       ) THEN
            IF ( IINSTRUMENT(JM) .EQ. -1       .OR. 
     S           INSTRUMENT (JL) .EQ. IINSTRUMENT(JM) ) THEN 
              NUMCHN(JL)=NUMCHNIN(JM)
              DO JK = 1, JPMXREG
                DO JJ = 1, JPMXCLD
                  DO JI = 1, JPCHMAX
                    TOVERRST(JI,JJ,JK,JL) = TOVERRIN(JI,JJ,JK,JM)
                  ENDDO
                ENDDO
              ENDDO
              DO JI = 1, JPCHMAX
                ICHN(JI,JL) = ICHNIN(JI,JM)
              ENDDO
            ENDIF
          ENDIF
        ENDDO
      ENDDO
C
      DO JL = 1, NSENSORS
         IPLF = ISRCHEQ ( IPLATFORM  , INUMSAT, PLATFORM  (JL) )
         ISAT = ISRCHEQ ( ISATID     , INUMSAT, SATELLITE (JL) )
         IF ( IPLF .EQ. 0 .OR. ISAT .EQ. 0 ) THEN
            WRITE ( NULOUT, '(" SUTOVST: Observation errors not ",
     S         "defined for sensor # ", I3)' ) JL
            CALL ABORT3D ( NULOUT,'SUTOVST         ')
         END IF
      ENDDO
C
C**   Utilization flag for AIRS channels
C
      IF ( NCONF .EQ. 101 ) THEN
       IF ( IPLATFORM(1) .EQ. 9 .AND. 
     &         ISATID(1) .EQ. 2 .AND. 
     &    IINSTRUMENT(1) .EQ. 11 ) THEN
         DO JI = 1, NUMCHNIN(1)
          AIRS_ASSIM(JI) = IUTILST(ICHNIN(JI,1),1,1,1)
         END DO
       END IF
       IF ( IPLATFORM(1) .EQ. 10 .AND. 
     &         ISATID(1) .EQ.  2 .AND. 
     &      IINSTRUMENT(1) .EQ. 16 ) THEN
          DO JI = 1, NUMCHNIN(1)
             IASI_ASSIM(JI) = IUTILST(ICHNIN(JI,1),1,1,1)
          END DO
       END IF
      END IF

C
C*    6. Print out observation errors for each sensor
C     .  --------------------------------------------
C
 600  CONTINUE
C
      WRITE(NULOUT,'(//1X,"Radiance observation errors read from file")')
      WRITE(NULOUT,'(  1X,"------------------------------------------")')
      DO JL = 1, NSENSORS
         WRITE(NULOUT,'(/1X,"SENSOR #",I2,". Platform: ",A,
     &                  "Instrument: ",A)')
     &                  JL, CSATID(JL), CINSTRUMENTID(JL)
         WRITE(NULOUT,'(1X,"Channel",T22,"Ocean",T50,
     &                  "Continent")')
         WRITE(NULOUT,'(T12,"clear",T20,"p.cloudy",T32,
     &                  "cloudy",T42,"clear",T50,"p.cloudy",T62,
     &                  "cloudy")')
         DO JI = 1, NUMCHN(JL)
            WRITE (NULOUT,'(I5,25F10.2)') ICHN(JI,JL),
     S                ((TOVERRST(ICHN(JI,JL),JJ,JK,JL),
     S                  JJ=1,NCLDST), JK=1,NREGST)
         ENDDO
      ENDDO
C
C*    7. Close the file
C     .  --------------
C
 700  CONTINUE
C
      IER = FCLOS(ILUTOV)
      IF(IER.NE.0)THEN
         CALL ABORT3D ( NULOUT,'SUTOVST         ')
      END IF
      RETURN
C
C*    Read error
C
900   WRITE ( NULOUT, '(" SUTOVST: Problem reading ",
     S         "file stats_tovs ")' )
      CALL ABORT3D ( NULOUT,'SUTOVST         ')
C
      RETURN
      END