SUBROUTINE CMABDY(PVALUES,KLIST,KFLAGS,LDFLAG,PROFIL,LDERR,LDSAT, 2 + LDGO,LDAIRS,LDIASI,KELE,KVAL,KNT,KNDAT,KVCORD,PVCORD,KINDEX,KIDTYP) IMPLICIT NONE * INTEGER KNDAT INTEGER KELE,KVAL,KNT,KVCORD,KINDEX,KIDTYP INTEGER KLIST(KELE) INTEGER KFLAGS(KELE,KVAL,KNT) * REAL*8 PVALUES(KELE,KVAL,KNT),PVCORD(KVAL),PROFIL(KVAL) * LOGICAL LDFLAG,LDERR,LDSAT,LDGO,LDAIRS,LDIASI * #if defined (DOC) ************************************************************************ * ****s/r CMABDY -FILL BODY OF CMA REPORT * *Author . P. KOCLAS(CMC TEL. 4665) * *Revision: * . P. Koclas *CMC/AES Sept 1994: Add call to cvt3d * . before insertion of U and V for consistency * . P. Koclas *CMC/AES February 1995: * . New call sequence neccessary to : * . -allow insertion of "grouped data" records in BURP files. * . -allow data observed in various vertical coordinates * . -observation errors no longer initialized * * . P. Koclas *CMC/AES March 1995: * -Additions for humsat and satem data * . * . C. Charette *ARMA Jan 2001 * -Max value for T-Td surface element(12203) * * JM Belanger CMDA/SMC Feb 2001 * . 32 bits conversion * . P. Koclas *CMC/CMDA Sept 2001: * -set first-guess and observation errors to missing values * * .N Wagneur CMDA/SMC Jine 2002 * . -Additions for goes data * . P. Koclas *CMC/CMDA Dec 2003: * -conversion for surface wind * . C. Charette *ARMA/SMC Apr 2005: * -Set flag bit #12 (Element assimilated by analysis) to zero * (see banco-burp documentation for more detail) * . A. Beaulne *CMDA/SMC Aug 2006 * -Additions for AIRS data * * PURPOSE : TRANSFER DATA BLOCKS EXTRACTED FROM CMC BURP FILES TO * THE IN-CORE FORMAT (CMA) OF THE 3-D VARIATIONAL ANALYSIS * * 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) * -LERR : .TRUE. --> INSERT OBS ERROR IN CMA (HUMSAT DATA) * -LDSAT : .TRUE. --> INSERT REF PRESSURE IN CMA (SATEMS) * -LDGO : .TRUE. --> INSERT EMISSIVITIES IN CMA (GOES RADIANCES) * -LDAIRS : .TRUE. --> INSERT EMISSIVITIES IN CMA (AIRS RADIANCES) * -LDIASI : .TRUE. --> INSERT EMISSIVITIES IN CMA (IASI RADIANCES) * * -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 * * 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"
#include "comfilt.cdk"
INTEGER IFIND INTEGER ILEM,IND,IIND,IP,IK INTEGER IBAD,IFLAG INTEGER JI,JJ INTEGER ZESMAX,ZES * REAL*8 ZTORAD,ZFACT,padd,pmul,ZEMFACT * ************************************************************************ * SET BAD FLAG VALUE IIND AND UNIT CONVERSION CONSTANTS ************************************************************************ * IIND =-1 IBAD=2**11 ZTORAD=RPI/180. * ZFACT=VCONV * ZEMFACT=0.01 * ZESMAX=30. * 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. ************************************************************************ * IK= KINDEX DO JI=1,KELE ILEM=IFIND(KLIST(JI)) IF ( (ILEM .GT. 0) .AND. (KLIST(JI) .NE. KVCORD) ) THEN DO JJ=1,KVAL if(pvcord(jj) .ne. ppmis .and. (nonelev .eq. -1 .or. & nonelev .eq. nint(pvcord(jj)*zfact))) then IF ( PVALUES (JI,JJ,IK) .NE. PPMIS ) THEN IF ( IP + IND .LE. NDATAMX ) THEN * VERTICAL COORDINATE ROBDATA8(NCMPPP,IP+IND)=PVCORD(JJ)*ZFACT +vcordsf(ilem,kidtyp) C C FOR PNM HEIGHT IS SET TO 0 C ---------------------------- IF ( ILEM .EQ. 53 ) THEN ROBDATA8(NCMPPP,IP+IND)=0. ENDIF C ---------------------------- C IF ( ILEM .EQ. 1 ) THEN padd=0.0D0 pmul=1.0D0 CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT TO V IF ( ILEM .EQ. 2 ) THEN padd=0.0D0 pmul=1.0D0 CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT TO GZ IF ( ILEM .EQ. 3 ) THEN padd=0.0D0 pmul=RG CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT THIKNESSES TO METERS IF ( ILEM .EQ. 4 ) THEN padd=0.0D0 pmul=1.0D0 CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * CONVERT TO CELSIUS IF ( ILEM .EQ. 8 ) THEN padd=0.0D0 pmul=1.0D0 CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * Max value T-Td upper air IF ( ILEM .EQ. 9 ) THEN IF ( PVALUES(JI,JJ,IK) .GT. ZESMAX) THEN PVALUES(JI,JJ,IK)=ZESMAX ENDIF ENDIF * Max value T-Td surface IF ( ILEM .EQ. 11 ) THEN IF ( PVALUES(JI,JJ,IK) .GT. ZESMAX) THEN PVALUES(JI,JJ,IK)=ZESMAX ENDIF ENDIF * CONVERT TO RADIANS IF ( ILEM .EQ. 48 .OR. ILEM .EQ. 54 ) THEN padd=0.0D0 pmul=ZTORAD CALL CVT3D(PVALUES(JI,JJ,IK),padd,pmul,1) ENDIF * FLAGS IF (LDFLAG) THEN * SET BIT 12 TO ZERO * (Element assim by 3dvar) IFLAG = KFLAGS(JI,JJ,IK) IFLAG = IBCLR(IFLAG,12) MOBDATA(NCMFLG,IP+IND)= IFLAG ELSE MOBDATA(NCMFLG,IP+IND)= IBAD ENDIF * ROBDATA8(NCMVAR,IP+IND)=PVALUES (JI,JJ,IK) MOBDATA(NCMVNM,IP+IND)=KLIST(JI) MOBDATA(NCMVCO,IP+IND)=NVCORDTYP ROBDATA8(NCMOMF,IP+IND)=PPMIS ROBDATA8(NCMOMA,IP+IND)=PPMIS ROBDATA8(NCMOMI,IP+IND)=PPMIS ROBDATA(NCMFGE,IP+IND)=PPMIS ROBDATA8(NCMOER,IP+IND)=PPMIS * * OBS ERROR FOR HUMSAT * IF ( LDERR ) THEN ROBDATA8(NCMOER,IP+IND)=PROFIL(JJ) ENDIF * * REFERENCE LEVEL FOR SATEMS * IF ( LDSAT ) THEN ROBDATA8(NCMPRL,IP+IND)=PROFIL(JJ)*ZFACT ROBDATA8(NCMOER,IP+IND)=1.0D0 ENDIF * * SURFACE EMISSIVITIES FOR GOES AIRS AND IASI RADIANCES * IF ( LDGO ) THEN ROBDATA8(NCMPRL,IP+IND)=PROFIL(JJ) & *ZEMFACT ENDIF IF ( LDAIRS ) THEN ROBDATA8(NCMPRL,IP+IND)=PROFIL(JJ) & *ZEMFACT END IF IF ( LDIASI ) THEN ROBDATA8(NCMPRL,IP+IND)=PROFIL(JJ) & *ZEMFACT END IF * IND=IND + 1 ELSE *================================================== KNDAT = IND NDATA = NDATA + KNDAT *================================================== RETURN ENDIF ENDIF ENDIF END DO ENDIF END DO *============================= KNDAT = IND NDATA = NDATA + KNDAT *============================= * RETURN * END