SUBROUTINE DOBSGOES(PJO) 3
#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
*         Y.J. Rochon *AQRX/MSC Feb 2005
*          - Added comnumbr.cdk 
*            as JPNBRELEM of comnumbr required by cvcord.
*         Y.J. Rochon ARQX, Jan 2010
*          - Addition of obs simulation option with LSIMOB=.TRUE.
*
*   -------------------
**    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 "comnumbr.cdk"
#include "cvcord.cdk"
#include "comct0.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.0D0
      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))
                  if (.NOT.LSIMOB) then
                     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))
                  else
                     ROBDATA8(NCMOMA,JDATA) = 0.0D0
                     ROBDATA8(NCMOMI,JDATA) = 0.0D0                     
                     ROBDATA8(NCMVAR,JDATA) = ZPTB(I)
                  end if
                  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