subroutine matvec(alpha,x,beta,y,kelem,cdfam) #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. * Y. Yang Oct. 2004 * - Added include "comnumbr.cdk" * due to the dependence of the "cvcord.cdk" on JPNBRELEM * -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 "comnumbr.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