!-------------------------------------- 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 SIGMAOP 3,31

#if defined (DOC)
*Author  : P. Koklas CMDA/SMC
*
*Revision:
*          JM Belanger CMDA/SMC  Jan 2001
*                   . 32 bits conversion
*          C Charette ARMA/SMC  Oct 2001
*                   . Replace logical unit NULSTAT by NULBGST
*          S. Pellerin *ARMA/SMC nov. 2001
*                   . reordering of declaration dependencies (for Linux compilation)
*          J. St-James *CMDA/SMC - July 2003
*                   . Add code for profiler data
*          J.M. Aparicio *ARMA/MSC* October 2006
*                   . Adapt for GPSRO
*          Luc Fillion *ARMA/EC - 4 Aug 2009
*                   . Include lcva_hemis option.
*          S. Macpherson *ARMA/EC - 11 Sep 2009
*                   . Add code for GB-GPS data
#endif

      IMPLICIT NONE
#include "comlun.cdk"
#include "comcst.cdk"
#include "pardim.cdk"
#include "comdim.cdk"
#include "comcva.cdk"
#include "comgem.cdk"
#include "comgd0.cdk"
#include "compstat.cdk"

      INTEGER JLAT, JLON ,J
      CHARACTER*8 CLETIKET
      CHARACTER*1 CLTYPVAR,CLGRTYP
      CHARACTER*2 CLNOMVAR
      INTEGER IULSSF,IDATEO
      INTEGER VFSTLIR,FSTPRM,FNOM,FSTOUV,FCLOS,FSTFRM
      INTEGER IKEY,ILEN,IERR,IDATE

      REAL*8 ZBUFFER(NJ,NFLEV),ZTRANS(NI,NJ),ZJO
      POINTER (PXZBUFFER,ZBUFFER),(PXTRANS,ZTRANS)

      INTEGER INI,INJ,INK, INPAS, INBITS, IDATYP, IDEET
     +     ,IP1,IP2,IP3,IG1,IG2,IG3,IG4,ISWA,ILENGTH,IDLTF
     +     ,IUBC,IEXTR1,IEXTR2,IEXTR3
C----------------------------------------------------------------------
      ILEN = NJ*NFLEV
      CALL HPALLOC(PXZBUFFER,MAX(1,ILEN),IERR,8)
      ILEN = NJ*NI
      CALL HPALLOC(PXTRANS,MAX(1,ILEN),IERR,8)
C
C     1. Opening the statistics file
C
      IULSSF=NULBGST
C
C     .  2.1 Background error standard deviations
C
      CLETIKET = 'STDDEV'
      if(lcva_hemis) CLETIKET = 'SDZONAL'
      write(nulout,*) 'sigmaop: CLETIKET = ',CLETIKET
      IDATE    = -1
      IP1      = -1
      IP2      = -1
      IP3      = -1
      CLTYPVAR =' '
      ILEN = (NJEND -NJBEG +1)*NKGDIM
C
C READ IN STANDARD DEVIATION FOR EACH OBSERVATION TYPE
C
      CLNOMVAR = 'UU'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     S     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
      IERR = FSTPRM(IKEY,IDATEO,IDEET,INPAS
     +     ,INI,INJ,INK, INBITS, IDATYP
     +     ,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR,CLETIKET,CLGRTYP
     +     ,IG1,IG2,IG3,IG4,ISWA,ILENGTH,IDLTF
     +     ,IUBC,IEXTR1,IEXTR2,IEXTR3)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 ZTRANS(JLON,JLAT) =       ZBUFFER(JLAT,J)*RMSKNT
                 if(IG2 .eq. 0) then
                    UT0(JLON,J,INJ-JLAT+1) = (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 else
                    UT0(JLON,J,JLAT) =       (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 endif
              END DO
           END DO
       END DO
C
      CLNOMVAR = 'VV'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 ZTRANS(JLON,JLAT) =       ZBUFFER(JLAT,J)*RMSKNT
                 if(IG2 .eq. 0) then
                    VT0(JLON,J,INJ-JLAT+1) = (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 else
                    VT0(JLON,J,JLAT) =       (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 endif
              END DO
           END DO
        END DO
      CLNOMVAR = 'ES'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 if(IG2 .eq. 0) then
                    Q0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)
                 else
                    Q0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)
                 endif
                 ZTRANS(JLON,JLAT) =       ZBUFFER(JLAT,J)
              END DO
           END DO
        END DO
      CLNOMVAR = 'GZ'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 if(IG2 .eq. 0) then
                    TT0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)*RG*10.
                 else
                    TT0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)*RG*10.
                 endif
                 ZTRANS(JLON,JLAT) =       ZBUFFER(JLAT,J)
              END DO
           END DO
        END DO
C
C Apply 3D amplification factor
C
        DO JLAT = 1, NJ
          DO J = 1, NFLEV
            DO JLON = 1, NI
              UT0(JLON,J,JLAT)= 
     +          UT0(JLON,J,JLAT)*damplibg(JLON,J,JLAT)       
              VT0(JLON,J,JLAT)= 
     +          VT0(JLON,J,JLAT)*damplibg(JLON,J,JLAT)       
cbue comment out, because tuning is for LQ, not ES
cbue              Q0(JLON,J,JLAT)= 
cbue     +          Q0(JLON,J,JLAT)*damplibg(JLON,J+3*NFLEV,JLAT)       
            END DO
          END DO
        END DO

      CALL BILIN
      CALL TRQTOES
      CALL TRTTOGZ
C
C     SET THE FIRST-GUESS ERRORS FOR CONVENTIONAL DATA ON PRESSURE LEVELS
C     --------------------------------------------------------------------
C
         CALL SETFGEFAM('AI')
         CALL SETFGEFAM('SW')
         CALL SETFGEFAM('UA')
         CALL SETFGEFAM('SF')
         CALL SETFGEFAM('HU')
         CALL SETFGEFAMZ('PR')
C
C     SET THE FIRST-GUESS ERRORS FOR RADIO OCCULTATION DATA
C     -----------------------------------------------------
C
         CALL SETFGEDIF('RO')
C
C     DO TEMPERATURE FIRST-GUESS ERROR
C     ---------------------------------
C
      CLNOMVAR = 'TT'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
      DO J = 1, NFLEV
         DO JLAT = 1, NJ
            DO JLON=1,NI
               if(IG2 .eq. 0) then
                  TT0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)
               else
                  TT0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)
               endif
               ZTRANS(JLON,JLAT) =       ZBUFFER(JLAT,J)
            END DO
         END DO
      END DO
C
C Apply 3D amplification factor
C
        DO JLAT = 1, NJ
          DO J = 1, NFLEV
            DO JLON = 1, NI
              TT0(JLON,J,JLAT)= 
     +          TT0(JLON,J,JLAT)*damplibg(JLON,J+2*NFLEV,JLAT)       
            END DO
          END DO
        END DO

      CALL BILIN
      CALL SETFGETT
C
C
C     DO SATEM FIRST-GUESS ERROR
C     --------------------------
C
      if(.not.lcva_hemis) then
        CLNOMVAR = 'DZ'
        IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +       ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
          DO J = 1, INK
             DO JLAT = 1, NJ
                DO JLON=1,NI
                   if(IG2 .eq. 0) then
                      TT0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)*10.
                   else
                      TT0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)*10.
                   endif
                   ZTRANS(JLON,JLAT) =       ZBUFFER(JLAT,J)
                END DO
             END DO
          END DO
        CALL BILIN
        call trttogz
        CALL SETFGEST
      endif
C
C     RELOAD DATA TO DO SURFACE FIRST-GUESS ERRORS
C     ---------------------------------------------
C
      CLNOMVAR = 'P0'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, INK
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 if(IG2 .eq. 0) then
                    GPS0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)*RMBTPA
                 else
                    GPS0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)*RMBTPA
                 endif
              END DO
           END DO
        END DO
C
      CLNOMVAR = 'UU'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 if(IG2 .eq. 0) then
                    UT0(JLON,J,INJ-JLAT+1) = (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 else
                    UT0(JLON,J,JLAT) =       (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 endif
              END DO
           END DO
        END DO
      CLNOMVAR = 'VV'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 if(IG2 .eq. 0) then
                    VT0(JLON,J,INJ-JLAT+1) = (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 else
                    VT0(JLON,J,JLAT) =       (ZBUFFER(JLAT,J)/CONPHY(JLAT))*RMSKNT
                 endif
              END DO
           END DO
        END DO
      CLNOMVAR = 'TT'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 if(IG2 .eq. 0) then
                    TT0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)
                 else
                    TT0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)
                 endif
              END DO
           END DO
        END DO
      CLNOMVAR = 'ES'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
        DO J = 1, NFLEV
           DO JLAT = 1, NJ
              DO JLON=1,NI
                 if(IG2 .eq. 0) then
                    Q0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)
                 else
                    Q0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)
                 endif
              END DO
           END DO
        END DO
C
C Apply 3D amplification factor
C
        DO JLAT = 1, NJ
          DO JLON = 1, NI
            GPS0(JLON,1,JLAT) =
     +        GPS0(JLON,1,JLAT)*damplibg(JLON,1+4*NFLEV,JLAT)
          END DO
        END DO
        DO JLAT = 1, NJ
          DO J = 1, NFLEV
            DO JLON = 1, NI
              UT0(JLON,J,JLAT)= 
     +          UT0(JLON,J,JLAT)*damplibg(JLON,J,JLAT)       
              VT0(JLON,J,JLAT)= 
     +          VT0(JLON,J,JLAT)*damplibg(JLON,J,JLAT)       
              TT0(JLON,J,JLAT)= 
     +          TT0(JLON,J,JLAT)*damplibg(JLON,J+2*NFLEV,JLAT)       
cbue comment out, because tuning is for LQ, not ES
cbue              Q0(JLON,J,JLAT)= 
cbue     +          Q0(JLON,J,JLAT)*damplibg(JLON,J+3*NFLEV,JLAT)       
            END DO
          END DO
        END DO

      CALL BILIN
C
C     SET THE FIRST-GUESS ERRORS FOR THE SURFACE DATA
C     ------------------------------------------------
C
      CALL SETFGESURF

C     READ IN LN Q FIRST-GUESS ERRORS FOR SETFGEGPS
C     ---------------------------------------------
C

      CLNOMVAR = 'LQ'
      IKEY = VFSTLIR(ZBUFFER,IULSSF,INI,INJ,INK,IDATE
     +     ,CLETIKET,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR)
      DO J = 1, NFLEV
        DO JLAT = 1, NJ
          DO JLON=1,NI
            if(IG2 .eq. 0) then
               Q0(JLON,J,INJ-JLAT+1) = ZBUFFER(JLAT,J)
            else
               Q0(JLON,J,JLAT) =       ZBUFFER(JLAT,J)
            endif
          END DO
        END DO
      END DO

C
C Apply 3D amplification factor to LQ
C
!
      DO JLAT = 1, NJ
         DO J = 1, NFLEV
            DO JLON = 1, NI
               Q0(JLON,J,JLAT)=
     +           Q0(JLON,J,JLAT)*damplibg(JLON,J+3*NFLEV,JLAT)
            END DO
         END DO
      END DO

      CALL BILIN
C
C     SET THE FIRST-GUESS ERRORS FOR GB-GPS ZTD DATA
C     ------------------------------------------------
C
      CALL SETFGEGPS
C
      CALL HPDEALLC(PXZBUFFER,IERR,1)
      CALL HPDEALLC(PXTRANS,IERR,1)
      RETURN
      END