SUBROUTINE ROBSGOES(PJO)
#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
*
*Revision:
*            Y. Yang - Oct. 2004
*              - Added include "comnumbr.cdk"
*                due to the dependence of the "cvcord.cdk" on JPNBRELEM
*
*   -------------------
**    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 "comnumbr.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