!-------------------------------------- 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 CMABDY(PVALUES,KLIST,KFLAGS,LDFLAG,PROFIL,LDERR,LDSAT, 4,7
     +             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
*          . S. Heilliette
*                     -Additions for IASI 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 "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