SUBROUTINE GETCMA(PVALUES,KLIST,KFLAGS,LDFLAG,PROFIL,LDERR,LDSAT, 2 + KELE,KVAL,KNT,KNDAT,KVCORD,PVCORD,KINDEX,KRVAL) IMPLICIT NONE * INTEGER KNDAT,KRVAL INTEGER KELE,KVAL,KNT,KVCORD,KINDEX INTEGER KLIST(KELE) INTEGER KFLAGS(KELE,KVAL,KNT) * REAL*8 PVALUES(KELE,KVAL,KNT),PVCORD(KVAL),PROFIL(KVAL) * LOGICAL LDFLAG,LDSAT,LDERR * #if defined (DOC) ************************************************************************ * ****s/r GETCMA -GET BODY OF CMA REPORT * *Author . P. KOCLAS(CMC/CMSV TEL. 4628) *Revision: * P. KOCLAS : November 1998 * . Update quality control flags for krval for krval .ne. ncmoma ncmomp * JM Belanger CMDA/SMC Jan 2001 * . 32 bits conversion * . P. Koclas *CMC/CMDA Dec 2003: * -conversion for surface wind * . D. Anselmo *ARMA/SMC November 2004: * -treatment of ln specific humidity * . Y. Yang Aug. 2004 * - Added include "comnumbr.cdk" due to the dependence of * the "cvcord.cdk" on JPNBRELEM * * * PURPOSE : TRANSFER THE IN-CORE FORMAT (CMA) OF THE 3-D VARIATIONAL * ANALYSIS TO VECTORS DIMENSIONED FOR OUTPUT TO CMC * BURP FILES. * * ARGUMENTS: * INPUT: * * -PVALUES : DATA BLOCK * -KLIST : LIST OF BUFR ELEMENTS * -KFLAGS : QUALITY CONTROL FLAGS * * -LDFLAG : .TRUE. --> INSERT FLAGS IN CMA * .FALSE. --> INSERT DUMMY VALUE(2**12) * -LDERR : .TRUE. --> INSERT OBS ERROR IN CMA (HUMSAT...) * -LDSAT : .TRUE. --> INSERT REFERENCE PRESURE IN CMA * -KELE : NUMBER OF ELEMENTS IN DATA BLOCK * -KVAL : NUMBER OF LEVELS IN DATA BLOCK * -KNT : THIRD DIMENSION OF DATA BLOCK * -KNDAT : THIRD DIMENSION OF DATA BLOCK * -KVCORD : BUFR ELEMENT CODE OF VERTICAL COORDINATE * -PVCORD : VERTICAL COORDINATE VALUES EXTRACTED FROM DATA BLOCK * -KINDEX : THIRD DIMENSION INDEX OF DATA BLOCK * -KRVAL : INDEX OF ELEMENT IN CMA LIST * ( 1 ---> OBS ERROR , 2 ---> O-A ) * * OUTPUT: * -KNDAT : AMOUNT OF DATA INSERTED IN CMA FILE * ************************************************************************ #endif * #include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "comnumbr.cdk"
#include "cvcord.cdk"
#include "cparbrp.cdk"
#include "comcst.cdk"
INTEGER IFIND INTEGER ILEM,IND,IIND,IP,IK,IFLG INTEGER JI,JJ,JDATA LOGICAL LLOMAFI * REAL*8 ZTORAD,ZFACT REAL*8 ZERR,ZSTAT,ZPRL real*8 padd,pmul * ************************************************************************ * SET BAD FLAG VALUE IIND AND UNIT CONVERSION CONSTANTS ************************************************************************ * IIND =-1 ZTORAD=RPI/180.0D0 * ZFACT =VCONV * IP =NDATA + 1 IND =0 * ************************************************************************ * PUT ALL NON MISSING DATA IN CMA FILE * EXIT IF THERE IS MORE DATA AVAILABLE THAN ALLOCATED TO CMA FILE * DATA IS CONVERTED TO UNITS USED BY 3D-VAR ANALYSIS. ************************************************************************ * LLOMAFI=(KRVAL .EQ. NCMOMF) .OR. (KRVAL .EQ. NCMOMA) .OR. (KRVAL .EQ. NCMOMI) IK= KINDEX IF (LLOMAFI) THEN DO JI=1,KELE ILEM=IFIND(KLIST(JI)) DO JJ=1,KVAL if ( ilem .le. 0 )PVALUES (JI,JJ,IK)=PPMIS END DO END DO ENDIF DO JI=1,KELE ILEM=IFIND(KLIST(JI)) IF ( (ILEM .GT. 0) .AND. (KLIST(JI) .NE. KVCORD) ) THEN DO JJ=1,KVAL if( ldsat ) profil(jj)=ROBDATA(NCMPRL,IP+IND) IF ( PVCORD(JJ) .NE. PPMIS ) THEN Cpik IF ( PVALUES (JI,JJ,IK) .NE. PPMIS ) THEN IF ( IP + IND .LE. NDATAP ) THEN ZERR= ROBDATA(NCMOER,IP+IND) ZSTAT= ROBDATA(KRVAL, IP+IND) IFLG= MOBDATA(NCMFLG,IP+IND) * IF ( KRVAL .EQ. NCMOMF .OR. KRVAL .EQ. NCMOMA) THEN if (MOBDATA(NCMASS,IP+IND) .EQ. 1 .OR. & (MOBDATA(NCMVNM,IP+IND) .EQ. NEHU .and. & ZSTAT .NE. PPMIS) .OR. & MOBDATA(NCMVNM,IP+IND) .EQ. NEHS) then PVALUES (JI,JJ,IK)=-ZSTAT*ZERR else PVALUES (JI,JJ,IK)=PPMIS endif ELSE PVALUES (JI,JJ,IK)=ZSTAT KFLAGS (JI,JJ,IK)=IFLG ENDIF IF ( PVALUES (JI,JJ,IK) .NE. PPMIS) then * CONVERT TO M/S IF ( ILEM .EQ. 1 ) THEN padd=0.0D0 pmul=1.0D0 CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT TO M/S IF ( ILEM .EQ. 2 ) THEN padd=0.0D0 pmul=1.0D0 CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT TO Z IF ( ILEM .EQ. 3 ) THEN padd=0.0D0 pmul=1.0D0/RG CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT TO KELVIN IF ( ILEM .EQ. 8 ) THEN padd=0.0D0 pmul=1.0D0 CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT TO DEGREES IF ( ILEM .EQ. 48 .OR. ILEM .EQ. 54 ) THEN padd=0.0D0 pmul=1.0D0/ZTORAD CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF ENDIF IND=IND + 1 ELSE *================================================== KNDAT = IND NDATA = NDATA + KNDAT *================================================== RETURN ENDIF Cpik ENDIF ENDIF END DO ENDIF END DO *============================= KNDAT = IND NDATA = NDATA + KNDAT *============================= * RETURN * END