!-------------------------------------- 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 RANDOBS 1,7
#if defined (DOC)
*
***s/r RANDOBS  - Multiply random observations by R^1/2
*                 Based on OBSCORUA
*
* ONLY HUMSAT AND SATEM HAVE VERT CORRELATIONS???
*
*Author  : M. Buehner *CMC/AES  February 2000
*Revision:

*                               1/2
**    Purpose:  - CALCULATE  [O]    * RAND
*
*Arguments
*
#endif
      IMPLICIT NONE
*implicits
#include "comlun.cdk"
#include "comcst.cdk"
#include "comdimo.cdk"
#include "comdim.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "cvcord.cdk"
#include "comstato.cdk"
#include "comvcor.cdk"
#include "comstate.cdk"
#include "comfilt.cdk"
#include "comcva.cdk"
#include "comstato2.cdk"
*
      REAL*8 GASDEV
      INTEGER IBEGIN,ILAST,IDATA,IK,IBEGINOBS,INOBS,IOBS,ILASTOBS
      INTEGER IERR, IELMGZ, IELMDZ, ILYR, ILEN
      INTEGER J,JDATA,JL,JVAR,jpos, INONZERO
      REAL*8 XTEMP(JPMAXILEV,JPNMAXPRO), RESULT(JPMAXILEV,JPNMAXPRO)
      REAL*8 ZRNDMEAN,ZRNDSTD
      LOGICAL LLOK
C
      INTEGER                      IUU , IVV , IGZ , IDZ  ,ITT ,   IES
      DATA IUU,IVV,IGZ,IDZ,ITT,IES/11003,11004,10194,10192,12001,12192/
      EXTERNAL GASDEV
C
C===============
      IELMGZ = 10194
      IELMDZ = 10192
C===============
C
C     LOOP OVER ALL FILES AND LOOK FOR THE ONES
c     CONTAINING HUMSAT, SATEM? or RAOBS
C
      WRITE(NULOUT,*) ' STARTING RANDOBS '
      DO J = 1,NFILES
C -----------HUMSAT--------------
        IF ( CFAMTYP(J) .EQ. 'HU') THEN
          WRITE(NULOUT,*) ' STARTING HUMSAT: ',CFAMTYP(J)
          IBEGIN=NBEGINTYP(J)
          ILAST =NENDTYP(J)
          IBEGINOBS=MOBDATA(NCMOBS,IBEGIN)
          ILASTOBS =MOBDATA(NCMOBS,ILAST)
          ILEN     =ILASTOBS-IBEGINOBS +1
C
          DO JVAR=1,nelems
            IK=0
            CALL ZERO(JPMAXILEV*JPNMAXPRO,XTEMP)
            DO JDATA = IBEGIN, ILAST
c              LLOK=
c     &            (MOBDATA(NCMASS,JDATA) .EQ. 1)
c     &            .AND. (MOBDATA(NCMXTR,JDATA) .EQ. 0)
c     &            .AND. (MOBDATA(NCMVNM,JDATA) .EQ. nlist(jvar))
              LLOK=(MOBDATA(NCMVNM,JDATA) .EQ. nlist(jvar))
              IF ( LLOK ) THEN
                IK=IK+1
                NINDX(IK) = JDATA
                ILYR  = MOBDATA(NCMLOBS,JDATA)
                IOBS  = MOBDATA(NCMOBS,JDATA)
                INOBS = IOBS-IBEGINOBS + 1
                XTEMP(ILYR,INOBS)  = GASDEV(1)
              ENDIF
            END DO
C
            IF (IK .GT. 0 ) THEN
C
              write(NULOUT,*) 'RANDOBS: humsat obs processed:',IK
              IF (nlist(jvar) .EQ. ies) THEN
                CALL MXMAOP(HUOBSCOR2,1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &            RESULT,1,JPMAXILEV,JPHLEV,JPHLEV,ILEN)
              ENDIF
C
C Add random perturbation to CMA
C
              DO JDATA = 1, IK
                IDATA = NINDX(JDATA)
                ILYR  = MOBDATA(NCMLOBS,IDATA)
                IOBS  = MOBDATA(NCMOBS,IDATA)
                INOBS = IOBS-IBEGINOBS + 1
                ROBDATA8(NCMVAR,IDATA) = ROBDATA8(NCMVAR,IDATA) +
     +            RESULT(ILYR,INOBS)*ROBDATA8(NCMOER,IDATA)
              END DO
C
            ENDIF
C
          enddo
C
C -----------SATEM--------------
        ELSEIF ( CFAMTYP(J) .EQ. 'ST') THEN
          WRITE(NULOUT,*) ' STARTING SATEM: ',CFAMTYP(J)
          IBEGIN=NBEGINTYP(J)
          ILAST =NENDTYP(J)
          IBEGINOBS=MOBDATA(NCMOBS,IBEGIN)
          ILASTOBS =MOBDATA(NCMOBS,ILAST)
          ILEN     =ILASTOBS-IBEGINOBS +1
C
C       LOOP OVER VARIABLE TYPES ( 0=U 1=V 2=GZ 3=T-Td ...)
C
          DO JVAR=1,nelems
            DO JL=1,JPNTYP
C
C       JL=1:CLEAR 2 : CLOUDY
C
              IK=0
              CALL ZERO(JPMAXILEV*JPNMAXPRO,XTEMP)
              DO JDATA = IBEGIN, ILAST
c                LLOK= ((MOBDATA(NCMOEC,JDATA) .EQ. JL )
c     &               .AND. (MOBDATA(NCMASS,JDATA) .EQ. 1)
c     &               .AND. (MOBDATA(NCMXTR,JDATA) .EQ. 0)
c     &               .AND.   (MOBDATA(NCMVNM,JDATA) .EQ. nlist(jvar)))
c     &            .OR.  ((MOBDATA(NCMOEC,JDATA) .EQ. JL)
c     &                    .AND.(MOBDATA(NCMASS,JDATA) .EQ. 1)
c     &                    .AND.(MOBDATA(NCMXTR,JDATA) .EQ. 2)
c     &                    .AND.(MOBDATA(NCMVNM,JDATA) .EQ. nlist(jvar))
c     &                    .AND.(MOBDATA(NCMVNM,JDATA) .EQ. IELMDZ))
                LLOK= (   (MOBDATA(NCMOEC,JDATA).EQ.JL)
     &               .AND.(MOBDATA(NCMVNM,JDATA).EQ.nlist(jvar)) )
                IF ( LLOK ) THEN
                  IK=IK+1
                  NINDX(IK) = JDATA
                  ILYR  = MOBDATA(NCMLOBS,JDATA)
                  IOBS  = MOBDATA(NCMOBS,JDATA)
                  INOBS = IOBS-IBEGINOBS + 1
                  XTEMP(ILYR,INOBS)  = GASDEV(1)
                ENDIF
              END DO
C
              IF ( IK .NE. 0 ) THEN
C
                write(NULOUT,*) 'RANDOBS: satem obs processed:',IK
                IF (nlist(jvar) .EQ. idz) THEN
                  CALL MXMAOP(DZOBSCOR2(1,1,JL),1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &              RESULT,1,JPMAXILEV,JPSALEV,JPSALEV,ILEN)
                ENDIF
C
C Add Random Perturbation to CMA
C
                DO JDATA = 1, IK
                  IDATA = NINDX(JDATA)
                  ILYR  = MOBDATA(NCMLOBS,IDATA)
                  IOBS  = MOBDATA(NCMOBS,IDATA)
                  INOBS = IOBS-IBEGINOBS + 1
                  ROBDATA8(NCMVAR,IDATA) = ROBDATA8(NCMVAR,IDATA) +
     +              RESULT(ILYR,INOBS)*ROBDATA8(NCMOER,IDATA)
                END DO
C
              ELSE
                WRITE(NULOUT,*) ' NO SATEMS WITH TYPE: ',JL
              ENDIF
C
            END DO
          enddo
C
C -----------OTHER TYPES (NO VERTICAL CORRELATIONS)--------------
        ELSE
C
C Other types: just add random variable multiplied by Sigma_obs
C
          WRITE(NULOUT,*) ' STARTING OTHER TYPE: ',CFAMTYP(J)
          IF(NBEGINTYP(J) .GT. 0) THEN
            IBEGIN=NBEGINTYP(J)
            ILAST =NENDTYP(J)
            DO JDATA = IBEGIN, ILAST
              ROBDATA8(NCMVAR,JDATA) = ROBDATA8(NCMVAR,JDATA) +
     +              GASDEV(1)*ROBDATA8(NCMOER,JDATA)
            END DO
          ENDIF
C
        ENDIF
      END DO

      WRITE(NULOUT,*)'-END----------RANDOBS------------------END-'

      RETURN
      END