!-------------------------------------- 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 matvec(alpha,x,beta,y,kelem,cdfam) 3,8
#if defined (DOC)
*
***s/r MATVEC   - Matrix-vector product
*
*
*Author  : P. Koclas *CMC/AES  April  1996
*Revision:
*          S. Pellerin *ARMA/AES Sept 97.
*                      .Change from TT to GZ state variable.
*          S. Pellerin *ARMA/AES Aug. 98.
*                   - Built-up of O matrix based on assimilated elements
*                     and family of observation instead of NPOS variable.
*
*
*                              -1
**    Purpose:  -  Perform the  matrix-vector product
*                  y = alpha*A*x + beta*y,
*
*
*Arguments
*
*  INPUT :
*     -alpha ,beta:  Scalar values
*     -x  y       :  Vectors
*     kelem  : variable (observation) code (BUFR)
*     cdfam  : family of the observation
*  OUTPUT:
*         y      :  Updated value of y
*
*  NOTE:
*       -ARGUMENTS OF THIS ROUTINE ARE FIXED BY BY SUBROUTINE "CONJGRAD"
*       -Matrix A is passed via common COMSTATO
*       -Matrix multiplication is done by mxma
*       -Agrguments to mxma are passed via common COMVCOR
*
#endif
      IMPLICIT NONE
#include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "comstato.cdk"
#include "comvcor.cdk"
C
      REAL*8 ALPHA,BETA
      REAL*8 X(*),Y(*)
      REAL*8 Z
      integer kelem
      character*2 cdfam
C
      INTEGER IBEGIN,ILAST,IBEGINOBS,ILASTOBS,IB,INREPT,IDATA
      INTEGER JDATA
      INTEGER IOBS,IPOS,ILEN,INOBS,ILYR
      REAL*8 XTEMP(JPMAXILEV,JPNMAXPRO) ,  RESULT(JPMAXILEV,JPNMAXPRO)
      INTEGER                      IUU , IVV , IGZ , IDZ  ,ITT ,   IES
      DATA IUU,IVV,IGZ,IDZ,ITT,IES/11003,11004,10194,10192,12001,12192/
C
C     *******************************************
C     OBTAIN PARAMETERS FROM CONTENTS OF COMVCOR
C     *******************************************
C
C==========================================
      IB=MBAND
      INREPT=ND
      IBEGIN=NBEG
      ILAST= NEND
C
C     CALCULATE NUMBER OF OBSERVATIONS
C
      IBEGINOBS=MOBDATA(NCMOBS,IBEGIN)
      ILASTOBS =MOBDATA(NCMOBS,ILAST)
      ILEN     =ILASTOBS-IBEGINOBS +1
C==========================================
C
C
C     *********************************
C     X IS MAPPED INTO FULL SOUNDINGS
C     *********************************
C
      CALL ZERO(JPMAXILEV*JPNMAXPRO,XTEMP)
      DO JDATA = 1,INREPT
         IDATA = NINDX(JDATA)
         IOBS  = MOBDATA(NCMOBS,IDATA)
         ILYR  = MOBDATA(NCMLOBS,IDATA)
         INOBS = IOBS-IBEGINOBS + 1
C        =============================
         XTEMP(ILYR,INOBS)  = X(JDATA)
C        =============================
      END DO
C
C     *********************************
C     PERFORM MATRIX MULTIPLICATIONS
C     *********************************
C
C     -----------
      IF (kelem .EQ. iuu .and. cdfam .eq. 'UA') THEN
C        -----------
C        U-COMPONENT
C        -----------
         CALL MXMAOP(UUOBSCOR(1,1,IB),1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &    RESULT,1,JPMAXILEV,JPRALEV,JPRALEV,ILEN)
C
      ELSE IF (kelem .EQ. ivv .and. cdfam .eq. 'UA') THEN
C        -----------
C        V-COMPONENT
C        -----------
         CALL MXMAOP(UUOBSCOR(1,1,IB),1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &    RESULT,1,JPMAXILEV,JPRALEV,JPRALEV,ILEN)
C
      ELSE IF ( kelem .EQ. itt .and. cdfam .eq. 'UA' ) THEN
C        ----------------------------
C        TEMPERATURE
C        ----------------------------
         CALL MXMAOP(GZOBSCOR(1,1,IB),1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &    RESULT,1,JPMAXILEV,JPRALEV,JPRALEV,ILEN)
C
C     ----------------
      ELSE IF (kelem .EQ. ies .and. cdfam .eq. 'UA' ) THEN
C        ----------------
C        MOISTURE ( T-Td)
C        ----------------
         CALL MXMAOP(ESOBSCOR(1,1,IB),1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &    RESULT,1,JPMAXILEV,JPRALEV,JPRALEV,ILEN)
C
      ELSE IF (kelem .EQ. igz .and. cdfam .eq. 'UA') THEN
C        ----------------------------
C        GEOPOTENTIAL
C        ----------------------------
         CALL MXMAOP(GZOBSCOR(1,1,IB),1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &    RESULT,1,JPMAXILEV,JPRALEV,JPRALEV,ILEN)
C
C     ----------------
      ELSE IF (kelem .EQ. ies .and. cdfam .eq. 'HU') THEN
C     ----------------------------
C     --- HUMSAT ---
C     ----------------------------
         CALL MXMAOP(HUOBSCOR,1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &    RESULT,1,JPMAXILEV,JPHLEV,JPHLEV,ILEN)
C
C
      ELSE IF (kelem .EQ. idz .and. cdfam .eq. 'ST' ) THEN
C     ----------------------------
C     --- SATEMS ---
C     ----------------------------
         CALL MXMAOP(DZOBSCOR(1,1,IB),1,JPMAXILEV, XTEMP,1,JPMAXILEV,
     &    RESULT,1,JPMAXILEV,JPSALEV,JPSALEV,ILEN)
      ENDIF
C
C     *******************************************************
C     REMAP INTO ORIGINAL POSITIONS (Z)  AND UPDATE VECTOR  Y
C     *******************************************************
C
      DO JDATA = 1, INREPT
         IDATA = NINDX(JDATA)
         IOBS  = MOBDATA(NCMOBS,IDATA)
         ILYR  = MOBDATA(NCMLOBS,IDATA)
         INOBS = IOBS-IBEGINOBS + 1
          Z    = RESULT(ILYR,INOBS)
C        ================================
         Y(JDATA)=ALPHA*Z + BETA*Y(JDATA)
C        ================================
      END DO
C
      RETURN
      END