!-------------------------------------- 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 DOBSGOES(PJO) 1,1
#if defined (DOC)
*
***s/r DOBSGOES  - Computation of Jo and the residuals to the
*                  radiance (for GOES) observations
*
*
*Author        : N.Wagneur *CMDA/MSC  April 23, 2001
*
*Revision :
*         C. Charette - ARMA/SMC - Sept 2004
*          - Conversion to hybrid vertical coordinate
*            Return if no data to process
*
*   -------------------
**    Purpose:
*
*Arguments
*     PJO: total value of Jo for GOES
*
#endif
      IMPLICIT NONE
*implicits
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comlun.cdk"
#include "comcst.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "commvohr.cdk"
#include "partov.cdk"
#include "cparamgoes.cdk"
#include "comgoes.cdk"
#include "comgoesst.cdk"
#include "comjacgoes.cdk"
#include "cvcord.cdk"
*
C
      REAL*8 ZVAR, ZOER
      REAL*8 ZTODEG
      REAL*8 DLSUM
      REAL*8 PJO, ZQMIN, ZJOALL, ZAVGALL
C
      REAL*8 ZPS (JPPFGO)
      REAL*8 ZTG (JPPFGO)
      REAL*8 ZLAT(JPPFGO),ZO3OBS(JPPFGO)
      REAL*8 ZVLEV(JPPFGO,NLEVTRL)
      REAL*8 ZT   (JPPFGO,NLEVTRL)
      REAL*8 ZLQ  (JPPFGO,NLEVTRL)
      REAL*8 ZQ   (JPPFGO,NLEVTRL)
      REAL*8 PANGL(JPPFGO),PANGS(JPPFGO)
      REAL*8 ZTBO(JPCHPFGO),ZDTB(JPCHPFGO)
      REAL*8 ZDTBOM1(JPCHPFGO)
      REAL*8 ZJOCH  (0:JPCHGO,JPNSATGO)
      REAL*8 ZAVGNRM(0:JPCHGO,JPNSATGO)
      REAL*8 PAV(NLEVTRL,JPNAVGO,JPPFGO),PSAV(JPNSAVGO,JPPFGO)
      REAL*8 PSSV(JPNSSVGO,JPPFGO),PCV(JPNCVGO,JPPFGO)
      REAL*8 PEMISGO(JPPFGO,JPCHGO)
      REAL*8 PGOES(JPCHPFGO),ZPTB(JPCHPFGO)
      REAL*8 TAUSFC(JPCHPFGO)
C
      INTEGER J,JCH,I,ISAT,KSAT,JOFF,IO,JF,ISATON,KCNT
      INTEGER IBEGIN, IBEGINOB, ILAST, ILASTOB
      INTEGER ILOWLVL, IMODE
      INTEGER KNPF, KNCHPF, INOBSJO
      INTEGER JO, JDATA, IDATA, ITYP, IDATEND, IDATYP
      INTEGER JK, JN, ICHN, IPROCES, JL, INDX
      INTEGER ILANSEA, INDXREG, INDXCLD, INUMCHN
      INTEGER KLENPF,KNAV,KNSAV,KNSSV,KNCV
C
      INTEGER KSURF(JPPFGO)
      INTEGER KCHAN(JPCHPFGO),KPROF(JPCHPFGO)
      INTEGER KCHNESDIS(JPCHPFGO)
      INTEGER KFAIL(JPCHPFGO)
      INTEGER IPTOBS  (JPPFGO)
      INTEGER IPTDATA (JPCHPFGO)
      INTEGER IPTCHPF(JPPFGO,JPCHGO)
      INTEGER IPTREG(JPPFGO)
      INTEGER IPTCLD(JPPFGO)
      INTEGER ISCANPOS(JPPFGO)
      INTEGER ISATZEN(JPPFGO)
      INTEGER INOBSCH(0:JPCHGO,JPNSATGO)
      INTEGER IFAIL(JPPFGO,JPNSATGO)
C
      INTEGER  ISRCHEQ, MRFVOI, MRFCLS
      EXTERNAL ISRCHEQ, MRFVOI, MRFCLS
      EXTERNAL LINTV2, EXTRAP
C
      LOGICAL  ASSIM
C
      if(nobgoes.eq.0) return    ! Exit if there are not GOES data
C
C*    1.  Initialization
C     .   --------------
C
c
      KCNT = 0
C
      ZTODEG = 180.0 / RPI
      KLENPF = NLEVTRL
      KNAV   = JPNAVGO
      KNSAV  = JPNSAVGO
      KNSSV  = JPNSSVGO
      KNCV   = JPNCVGO
C
C
C*    1.1   Set index for model's lowest level
C     .     ----------------------------------
C
      IF ( VLEVHR(1) .LT. VLEVHR(NLEVTRL) ) THEN
         ILOWLVL = NLEVTRL
      ELSE
         ILOWLVL = 1
      ENDIF
C
C*    1.2   Initialize RT global common block
C     .     ---------------------------------
C
      DO J = 1, NOBGOES
         MJOGO(J) = 0
      ENDDO
C
C*    2.  Computation of (HX - Z)/SIGMA for GOES data only
C     .   ------------------------------------------------
C
 200  CONTINUE
C
      DLSUM   = 0.
      INOBSJO = 0
      DO J = 1, NSATGO
         DO I = 0, JPCHGO
            INOBSCH(I,J) = 0
            ZJOCH  (I,J) = 0.0
            ZAVGNRM(I,J) = 0.0
         ENDDO
      ENDDO
      DO I = 0, JPCHGO
         ZO3OBS(I) = 0.0
      ENDDO
C
C**   Loop over all files
C
      DO 295 JF = 1, NFILES
       IF ( CFAMTYP(JF).EQ.'GO' .AND. NBEGINTYP(JF).GT.0 ) THEN
        IBEGIN   = NBEGINTYP(JF)
        ILAST    = NENDTYP  (JF)
        IBEGINOB = MOBDATA(NCMOBS,IBEGIN)
        ILASTOB  = MOBDATA(NCMOBS,ILAST )
C
C**   Loop over all satellites specified by user
C
        DO 290 KSAT = 1, NSATGO
         KNPF=0
         DO I = 1, JPCHPFGO
            ZPTB    (I) = 0.
            PGOES   (I) = 0.
            ZDTB    (I) = 0.
            ZTBO    (I) = 0.
            KFAIL   (I) = 1
            IPTDATA (I) = 1
         ENDDO
         DO I = 1, JPPFGO
            DO J = 1, NLEVTRL
               ZT     (I,J) = 0.
               ZQ     (I,J) = 0.
               ZLQ    (I,J) = 0.
               ZVLEV  (I,J) = 0.
            ENDDO
            ZLAT (I)  = 0.
            ZPS  (I)  = 0.
            ZTG  (I)  = 0.
            PANGL(I) = 0.
            DO J = 1, JPCHGO
               PEMISGO(I,J) = 0.
            ENDDO
         ENDDO
         DO 290 JO = IBEGINOB, ILASTOB
C
C*    .  2.1  Extract general information for this observation point
C     .       ------------------------------------------------------
C
C*          Only process GOES/RADIANCES data (codtype = 180) to be assimilated?
C
            IDATYP = MOD(MOBHDR(NCMITY,JO),1000)
            IF ( IDATYP .EQ. 180  ) THEN
               IDATA   = MOBHDR(NCMRLN,JO)
               IDATEND = MOBHDR(NCMNLV,JO) + IDATA - 1
               ASSIM = .FALSE.
               DO JDATA= IDATA, IDATEND
                 IF ( MOBDATA(NCMASS,JDATA).EQ.1 ) THEN
                   ASSIM = .TRUE.
                 ENDIF
               ENDDO
C
               ISAT = MOD(MOBHDR(NCMITY,JO)/1000,1000)
cnwa
C
C*             Currently processed satellite
C*             N.B.: 252=GOES08, 253=GOES09, 254=GOES10,
C*                   255=GOES11, 256=GOES12, etc...
C
               ISAT  = ISAT - 244
C
               IF ( ASSIM .AND. (ISAT .EQ. NIDSATGO(KSAT)) ) THEN
C
                  KCNT = KCNT + 1
                  KNPF = KNPF + 1
C
                  MJOGO(KCNT) = JO
                  ISATON = ISAT
C
C*                Extract Latitude
C
                  ZLAT(KNPF) = ROBHDR(NCMLAT,JO) * ZTODEG
C
C*                Extract land/sea flag
C
                  ILANSEA = MOBHDR(NCMOFL,JO)
cnwa                  INDXREG = ISRCHEQ ( MLISREG, NREGST, ILANSEA )
                  KSURF(KNPF) = ILANSEA
C
C*                Extract processing technique
C
                  IPROCES = MOBHDR(NCMITY,JO)/1000000
cnwa                  INDXCLD = ISRCHEQ ( MLISCLD, NCLDST, IPROCES )
C
C*                Extract scan position
C
                  ISCANPOS(KNPF) = MOD(MOBHDR(NCMBOX,JO),100)
C
C*                Extract satellite zenith angle
C
                  ISATZEN(KNPF) = MOBHDR(NCMBOX,JO)/10000
                  PANGL(KNPF) = (ISATZEN(KNPF)-9000) / 100.0
C
                  IPTCLD(KNPF) = 1
                  IPTREG(KNPF) = 1
C
                  ZTG(KNPF) = GOMTGRHR(1,JO)
                  ZPS(KNPF) = GOMPSHR(1,JO)
C
                  DO JL = 1, NLEVTRL
                    ZT   (KNPF,JL) = GOMTHR(JL,JO)
                    ZLQ  (KNPF,JL) = GOMQHR(JL,JO)
                    ZQ   (KNPF,JL) = EXP(GOMQHR(JL,JO))
                    ZVLEV(KNPF,JL) = RPPOBSHR(JL,JO)
                  ENDDO
c
                  IPTOBS(KNPF) = JO

                  DO JDATA = IDATA, IDATEND
                  ITYP = MOBDATA(NCMVNM,JDATA)
C
C                    A emissivity (elements )?
                     IF ( ITYP.EQ.12163 ) THEN
                        ZVAR = ROBDATA8(NCMPRL,JDATA)
                        ICHN = NINT(ROBDATA8(NCMPPP,JDATA))
                        PEMISGO(KNPF,ICHN) = ZVAR
                     ENDIF
                  ENDDO
               ENDIF
            ENDIF
            IF ( KNPF .LE. 0                          ) GO TO 290
            IF ( KNPF .NE. JPPFGO .AND. JO .NE. ILASTOB ) GO TO 290
C
C
C*    .  2.4  Extrapolation of humidity profile above 300mb (kg/kg)
C     .       -----------------------------------------------------
C
cnwa            Not done ....
C
            IF ( LDBGGO ) THEN
               JOFF = 0
               WRITE(NULOUT,*)'KNPF, KNCHPF, KSAT = ',
     &                         KNPF, KNCHPF, KSAT
               DO JN = 1, KNPF
                  WRITE(NULOUT,*)'KFAIL = ', KFAIL(JN)
                  WRITE(NULOUT,*)'IPTCLD = ', IPTCLD(JN)
                  WRITE(NULOUT,*)'IPTREG = ', IPTREG(JN)
                  WRITE(NULOUT,*)'Temperature profile (K)'
                  WRITE(NULOUT,*)(JN,I,ZT(JN,I),ZQ(JN,I),I=1,NLEVTRL)
                  WRITE(NULOUT,*)'Surface air variables: T(K),',
     &                           'lnq(kg/kg),Ps(hpa)'
                  WRITE(NULOUT,*)ZT(JN,ILOWLVL),LOG(ZQ(JN,ILOWLVL)),ZPS(JN)
                  WRITE(NULOUT,*)'Surface skin variables: Tskin(K)'
                  WRITE(NULOUT,*)ZTG(JN)
                  INUMCHN = NCHNAGO(IPTCLD(JN),IPTREG(JN),KSAT)
                  WRITE(NULOUT,*)'Angles: satzen,satazim,solzen,',
     &                           'relsolazim(deg)'
                  WRITE(NULOUT,*) PANGL(JN)
                  WRITE(NULOUT,*)'Surface type'
                  WRITE(NULOUT,*) KSURF(JN)
                  JOFF = JOFF + INUMCHN
               ENDDO
            ENDIF
c 290     CONTINUE
C
C*    .  2.6  Forward RT model
C     .       ----------------
C
C*  On desactive le calcul de la matrice Jacobienne
C
            IMODE = 0
C
            CALL RTGOES(ZPTB,PGOES,ZPS,ZT,ZQ,
     &  ZTG,PANGL,ZLAT,ZO3OBS,NLEVTRL,PEMISGO,
     &  KSURF,KNPF,ZVLEV,NIDSATGO(KSAT),KCNT,IMODE)
C
C
C
C
C*    .  2.7  Extract GOES observations of radiance (brightness temps.)
C     .       ------------------------------------------------------------------
C
            KNCHPF = KNPF * JPCHGO
            DO I = 1, KNCHPF
               ZTBO    (I) = 0.0
               ZDTB    (I) = 0.0
               ZDTBOM1 (I) = 0.0
               IPTDATA (I) = 0
               KFAIL   (I) = 1
            ENDDO
C
            DO 280 JN = 1, KNPF
               IO      = IPTOBS(JN)
               IDATA   = MOBHDR(NCMRLN,IO)
               IDATEND = MOBHDR(NCMNLV,IO)+IDATA - 1
C
C*             Loop through data. Extract and store temporarily brightness temps.
C
               DO 270 JDATA = IDATA, IDATEND
                  ITYP = MOBDATA(NCMVNM,JDATA)
C
C                 A radiance (elements 12163)?
                  IF ( ITYP.EQ.12163 ) THEN
C
                     ZVAR = ROBDATA8(NCMVAR,JDATA)
                     ICHN = NINT(ROBDATA8(NCMPPP,JDATA))
C
C*                   channel to be assimilated?
                     IF ( MOBDATA(NCMASS,JDATA).EQ.0 ) GO TO 270
C
                     MOBDATA(NCMXTR,JDATA) = 0
                     INDX = ICHN + (JN-1) * JPCHGO
                     IF ( LDBGGO ) THEN
                        WRITE (NULOUT,*) ' indx,ichn,jn = ',indx,ichn,jn
                        WRITE (NULOUT,'("ZPTB,O-P= ",
     S                      2F10.6)') ZPTB(INDX),ZVAR-ZPTB(INDX)
                     ENDIF
                     ZTBO    (INDX) = ZVAR
                     IPTDATA (INDX) = JDATA
                     KFAIL(INDX) = 0
                  ENDIF
 270           CONTINUE
C
 280        CONTINUE
C
C*    .  2.8  Compute residuals
C     .       -----------------
C
            DO I = 1, KNCHPF
               IF ( KFAIL(I) .EQ. 0 ) THEN
                  ZDTB(I) = ZPTB(I) - ZTBO(I)
               ENDIF
            ENDDO
C
C*    .  2.9  Store (HX - Z)/SIGMA in CMA
C     .       ---------------------------
c
******commented vectorization directive****   *vdir nodep
            DO I = 1, KNCHPF
               IF (IPTDATA(I) .NE. 0 ) THEN
                  ZOER = ROBDATA8(NCMOER,IPTDATA(I))
                  ROBDATA8(NCMOMA,IPTDATA(I)) = ZDTB(I)/ZOER
                  ROBDATA8(NCMOMI,IPTDATA(I)) =
     S                   ROBDATA8(NCMOMA,IPTDATA(I))
                  ZDTBOM1(I) = ZDTB(I)/(ZOER*ZOER)
                  DLSUM = DLSUM
     S                    + ROBDATA8(NCMOMA,IPTDATA(I))*
     S                      ROBDATA8(NCMOMA,IPTDATA(I))
                  INOBSJO = INOBSJO + 1
               ENDIF
            ENDDO
C
C*    .  2.10  Transfer RT variables to RT global common block
C     .        -----------------------------------------------
C
C   ................. not done anymore ...............
C
C** Next bunch !
c
 285        KNPF = 0
            DO I = 1, JPCHPFGO
               ZPTB  (I) = 0.
               PGOES(I) = 0.
               ZDTB (I) = 0.
               ZTBO (I) = 0.
            ENDDO
            DO I = 1, JPPFGO
               DO J = 1, NLEVTRL
                  ZT     (I,J) = 0.
                  ZQ     (I,J) = 0.
                  ZLQ    (I,J) = 0.
                  ZVLEV  (I,J) = 0.
               ENDDO
               DO J = 1, JPCHGO
                  PEMISGO(I,J) = 0.
               ENDDO
               ZLAT (I)  = 0.
               ZPS  (I)  = 0.
               ZTG  (I)  = 0.
               PANGL(I) = 0.
            ENDDO
C
 290     CONTINUE
C
        ENDIF
 295  CONTINUE
C
C*    3.  Close up
C     .   --------
C
300   CONTINUE
C
      NGOES = KCNT
      PJO = DLSUM
*
*
 9000 FORMAT(//,10X,"-DOBSGOES: computing Jo and residuals to GOES"
     S     ," observations")
C
      RETURN
      END