!-------------------------------------- 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 ROBSGOES(PJO) 1,1
#if defined (DOC)
*
***s/r ROBSGOES  - Refresh computation of Jo and the residuals to the
*                  radiance (for GOES) observations
*
*
*Author        : N.Wagneur *CMDA/MSC  July, 2002
*
*
*   -------------------
**    Purpose:
*
*Arguments
*     PJO: total value of Jo for GOES
*
#endif
      IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comdim.cdk"
#include "comgem.cdk"
#include "comdimo.cdk"
#include "comlun.cdk"
#include "comcst.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "commvo.cdk"
#include "commvog.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,NFLEV)
      REAL*8 ZT   (JPPFGO,NFLEV)
      REAL*8 ZLQ  (JPPFGO,NFLEV)
      REAL*8 ZQ   (JPPFGO,NFLEV)
      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(NFLEV,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
C
C*    1.  Initialization
C     .   --------------
C
c
      KCNT = 0
C
      ZTODEG = 180.0 / RPI
      KLENPF = NFLEV
      KNAV   = JPNAVGO
      KNSAV  = JPNSAVGO
      KNSSV  = JPNSSVGO
      KNCV   = JPNCVGO
C
C
C*    1.1   Set index for model's lowest level
C     .     ----------------------------------
C
      IF ( VLEV(1) .LT. VLEV(NFLEV) ) THEN
         ILOWLVL = NFLEV
      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, NFLEV
               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) = GOMTGRG(1,JO) + GOMTGR(1,JO)
                  ZPS(KNPF) = GOMPSG(1,JO) + GOMPS(1,JO)
C
                  DO JL = 1, NFLEV
                    ZT   (KNPF,JL) = GOMTG(JL,JO) + GOMT(JL,JO)
                    ZLQ  (KNPF,JL) = GOMQG(JL,JO) + GOMQ(JL,JO)
                    ZQ   (KNPF,JL) = EXP(ZLQ(KNPF,JL))
                    ZVLEV(KNPF,JL) = RPPOBS(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,NFLEV)
                  WRITE(NULOUT,*)'Surface air variables: T(K),',
     &                           'lnq(kg/kg),Ps(hpa)'
                  WRITE(NULOUT,*)ZT(JN,28),LOG(ZQ(JN,28)),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*          NIMODE du namelist permet d'activer le calcul de la matrice Jacobienne
C
            IMODE = NIMODE 
C
            CALL RTGOES(ZPTB,PGOES,ZPS,ZT,ZQ,
     &  ZTG,PANGL,ZLAT,ZO3OBS,NFLEV,PEMISGO,
     &  KSURF,KNPF,ZVLEV,NIDSATGO(KSAT),KCNT,IMODE)
C
C
C
9261        FORMAT(40I3)
9262        FORMAT(1X,10F8.3)
9263        FORMAT(1X,10F8.6)
9264        FORMAT(1X,10F8.6)
9265        FORMAT(1X,F8.3,1X,F8.6,1X,F8.6)

C
C
C
C** Next bunch !
c
 285        KNPF = 0
            DO I = 1, JPCHPFGO
               ZPTB  (I) = 0.
               PGOES(I) = 0.
c               ZDTB (I) = 0.
c               ZTBO (I) = 0.
            ENDDO
            DO I = 1, JPPFGO
               DO J = 1, NFLEV
                  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 = 0.0D0
*
**    Printout of mean Jo and normalized average for each satellite.
*
 9000 FORMAT(//,10X,"-ROBSGOES: computing Jo and residuals to GOES"
     S     ," observations")
C
 9001 CONTINUE
      RETURN
      END