!-------------------------------------- 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 OBSCORST(PJO),1
#if defined (DOC)
*
***s/r OBSCORST  - Vertical error correlations.
*                    for SATEMS.
*
*
*Author  : P. Koclas *CMC/AES  April  1996
*Revision:
*          S. Pellerin *ARMA/AES Sept 97.
*                   - Control of the different model state of the 3Dvar
*                     through COMSTATE, COMSTATEC and COMSTNUM common
*                     blocks variables (comstate.cdk).
*          S. Pellerin *ARMA/AES Aug. 98.
*                   - Built-up of O matrix based on assimilated elements
*                     instead of NPOS variable.
*          S. Pellerin *ARMA/SMC May 2000
*                   - Logical unit cleanup
*           C. Charette ARMA/SMC jan. 2005
*            - Replaced write(nuldbg,..) statements by write(nulout,...)
*            - Replaced print statements by write(nulout,...)
*
*
*                              -1
**    Purpose:  - CALCULATE  [O] * [ H(X) - obs ]/sigmaobs    FOR SATEMS
*
*               - save result into ROBDATA(NCMOMI,IDATA)
*               - calculate the contibution to J0
*
*
*Arguments
*     PJO:  CONTIBUTION to Jo(X)
*
#endif
      IMPLICIT NONE
*implicits
#include "comcst.cdk"
#include "comlun.cdk"
#include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "cvcord.cdk"
#include "comstato.cdk"
#include "comvcor.cdk"
#include "comfilt.cdk"
*
C
      REAL*8 PJO
C
      INTEGER IBEGIN,ILAST,IDATA,IK
      INTEGER J,JDATA,JL
      INTEGER IERR,IELMDZ,jvar
C
      REAL*8 DLSUM
C
      LOGICAL LLOK,LLPR
C
      REAL*8   X(JPGRADLEN),B(JPGRADLEN)
      REAL*8  WK(1)
      POINTER(PXWRK,WK)
C
      INTEGER INFO,ITER
      REAL*8 ZPRE
      EXTERNAL MATVEC
C
C     ALLOW MEMORY FOR WORKSPACE
C
      CALL HPALLOC(PXWRK,5*JPGRADLEN,IERR,8)
C
C======================
      IELMDZ = 10192
      DLSUM  = 0.
C======================
C
      ITER=30
      ZPRE=RPRECIS
c      WRITE(NULOUT,*) '  '
c      WRITE(NULOUT,*)'*************-OBSCORST-*************************'
c      WRITE(NULOUT,*) ' DATA FAMILY                  ---> ','SATEMS'
c      WRITE(NULOUT,*) ' MAXIMUM NUMBER OF ITERATIONS ---> ',ITER
c      WRITE(NULOUT,*) ' REQUESTED ACCURACY           ---> ',ZPRE
      DO J = 1,NFILES
        IF ( CFAMTYP(J) .EQ. 'ST') THEN
          IBEGIN=NBEGINTYP(J)
          ILAST =NENDTYP(J)
C
          NBEG=IBEGIN
          NEND=ILAST
C
c          WRITE(NULOUT,*
c     &         )'----------------------------------------------'
c          WRITE(NULOUT,*) ' DATA FILE                   ---> ',CFILNAM(J
c     &         )
c          WRITE(NULOUT,*
c     &         )'----------------------------------------------'
c          WRITE(NULOUT,*) '  '
C
C       LOOP OVER VARIABLE TYPES ( 0=U 1=V 2=GZ 3=T-Td ...)
C
C     ----------------------------
          DO JVAR=1,nelems
C--------==============----
            DO JL=1,JPNTYP
C--------==============---
C
C       MBAND=1:CLEAR 2 : CLOUDY
C
              MBAND=JL
              IK=0
              DO JDATA = IBEGIN, ILAST
                LLOK= ((MOBDATA(NCMOEC,JDATA) .EQ. JL )
     &               .AND. (MOBDATA(NCMASS,JDATA) .EQ. 1)
     &               .AND. (MOBDATA(NCMXTR,JDATA) .EQ. 0)
     &               .AND.   (MOBDATA(NCMVNM,JDATA) .EQ. nlist(jvar)))
     &            .OR.  ((MOBDATA(NCMOEC,JDATA) .EQ. JL)
     &                    .AND.(MOBDATA(NCMASS,JDATA) .EQ. 1)
     &                    .AND.(MOBDATA(NCMXTR,JDATA) .EQ. 2)
     &                    .AND.(MOBDATA(NCMVNM,JDATA) .EQ. nlist(jvar))
     &                    .AND.(MOBDATA(NCMVNM,JDATA) .EQ. IELMDZ))
***************************************
c               write(6,*)' obscorst:LLOK,ass,xtr,vnm',llok,
c     %         MOBDATA(NCMASS,JDATA),MOBDATA(NCMXTR,JDATA),
c     %         MOBDATA(NCMVNM,JDATA)
c               write(6,*)' obscorst:jvar,nlist,',jvar,nlist(jvar)
******************************************
                IF ( LLOK ) THEN
                  IK=IK+1
                  X(IK)    = ROBDATA8(NCMOMA,JDATA)*.99
                  B(IK)    = ROBDATA8(NCMOMA,JDATA)
                  NINDX(IK) = JDATA
                ENDIF
              END DO
C
C
C           ======
              ND=IK
C           ======
              IF ( ND .NE. 0 ) THEN
c                WRITE(NULOUT,*
c     &               )'----------------------------------------'
c                WRITE(NULOUT,*) ' ',ND,' SATEMS WITH TYPE: ',JL
C
C    SOLVE BY CONJUGATE GRADIENT METHOD
C
                ITER=30
                ZPRE=RPRECIS
               LLPR=.FALSE.
***********************************************************************
c               LLPR=.TRUE.
c               WRITE(NULOUT,*) 'obscorst: x= ',(x(jdata),jdata=1,nd)
c               WRITE(NULOUT,*) 'obscorst: B= ',(b(jdata),jdata=1,nd)
***********************************************************************
C
C=======================================================================
                CALL CONJGRAD(ND,B,X,WK,ND,ITER,ZPRE,MATVEC,INFO,LLPR
     &               ,nlist(jvar),CFAMTYP(j))
C=======================================================================
c                WRITE(NULOUT,*)'------CONJGRAD: ',ITER
c     &               ,' ITERATIONS-----'
c                WRITE(NULOUT,*
c     &               )'----------------------------------------'
C
                DO JDATA = 1, ND
                  IDATA=NINDX(JDATA)
                  ROBDATA8(NCMOMI,IDATA) =X(JDATA)
                  DLSUM=DLSUM+ROBDATA8(NCMOMI,IDATA)*
     &                        ROBDATA8(NCMOMA,IDATA)
                END DO
C
c              ELSE
c                WRITE(NULOUT,*) ' NO SATEMS WITH TYPE: ',JL
              ENDIF
C
C-------=======----
            END DO
C-------=======---
C
          enddo
        endif
      END DO
C======================
      PJO = DLSUM/2.0
C======================
C
      CALL HPDEALLC(PXWRK,IERR,1)
c      WRITE(NULOUT,*)'-END----------OBSCORST------------------END-----'
      RETURN
      END