SUBROUTINE CH_CMABDY(PVALUES,KLIST,KFLAGS,POER,LDERR, 1,1
     +              KNUM,KSPEC,KIELE,KELE,KVAL,KNT,KNDAT,
     +              K2CORD,KNVCORD,PVCORD,PVCORD2,KINDEX,KOBSTYP,
     +              PLONG,PLAT,CDSTNID)
      IMPLICIT NONE
*
      CHARACTER*(*) CDSTNID
*
      INTEGER KNDAT,KNVCORD,KNUM,KSPEC,KIELE
      INTEGER KELE,KVAL,KNT,KINDEX,KLIST(KELE)
      INTEGER KFLAGS(KELE,KVAL,KNT),KOBSTYP,K2CORD
*
      REAL*8 PVALUES(KELE,KVAL,KNT),PLONG,PLAT
      REAL*8 PVCORD(KVAL),PVCORD2(KVAL),POER(KVAL)
*
      LOGICAL LDERR
*
#if defined (DOC)
************************************************************************
*
****s/r CMABDY - FILL BODY OF CMA REPORT FOR SPECIES OBS ONLY
*
*Author    . Y.J. Rochon ARQX/MSC June 2005
*            Adapted from CMABDY by P. KOCLAS(CMC TEL. 4665)
*
*Revision: (see cmabdy.ftn)
*          . Y. Yang April 2004
*            - Added PVCORD2 in the argument to store the extra column
*              for lower boundary of layers.
*            - For column data, stores the lower boundary of layer into
*              robdata8(NCMPOB, *)in addition to upper boundary of layer
*              which goes into robdata8(NCMPPP, *).
*          . Y.J. Rochon June 2005 - June3 2006, Jan/Feb 2007
*            - Re-organization and additions
*            - Addition of PLONG and PLAT input argument
*            - Discarding of MIPAS_ESA (STNID) data below 100hPa 
*              (as requested for ESA-contract).
*          . Y.J. Rochon Aug 2010
*            - Introduced used of CH_KGETPOS and QCFACT2
*
*
*    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 profile
*           -POER    : Obs std. dev. profile
*           -KFLAGS  : QUALITY CONTROL FLAGS
*           -KLIST   : List of elements in block
*           -LDERR   :  .FALSE. --> INSERT STD. DEV. ERROR IN CMA 
*           -KNUM    : Number of relevant obs in BURP block
*           -KSPEC   : Species identifier
*           -KIEVE   : ELEMENT INDEX
*           -KELE    : NUMBER OF ELEMENTS
*           -KVAL    : NUMBER OF LEVELS
*           -KNT     : THIRD DIMENSION
*           -KNVCORD : Coordinate type index
*           -K2CORD  : >0 implies use of PVCORD2 
*           -PVCORD  : VERTICAL COORDINATE VALUES
*           -PVCORD2 : SECOND VERTICAL COORDINATE VALUES IF REQUIRED
*           -KINDEX  : THIRD INDEX OF DATA BLOCK
*           -KOBSTYP : Index for forward/TLM model specification
*           -PLONG   : Longitude (degrees)
*           -PLAT    : Latitude (degrees)
*
*    OUTPUT:
*           -KNDAT   : AMOUNT OF DATA INSERTED IN CMA FILE
*                      
*   COMMENTS:
*                      
*            IMPORTANT: Obs counting in CH_BDY2BRP (and CH_BDY2BUF)
*                       must be consistent with that in CH_BRP2BDY
*                       (and CH_CMABDY). Otherwise, there will be a position
*                       mismatch between the required CMA data and the BURP
*                       report content (i.e. counting with NDATA - see BDY2BUF).
*
*            Modules should be cleaned up (removal of tempory considerations)
*            before becoming official.
*
*************************************************************************
#endif
*
#include "comdim.cdk"
#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"
#include "comlun.cdk"
#include "comchem.cdk"
*
      INTEGER IND,IP,IK,IFLAG,IASS,IDIR,ILEM
      REAL ZVAL
      INTEGER JI,JJ,J1
      LOGICAL LLGOOD
      INTEGER CH_KGETPOS
      EXTERNAL CH_KGETPOS
*
      REAL*8 padd,pmul,deg2rad
*
      IP=NDATA + 1
      IND=0
*
************************************************************************
*     PUT ALL REQUESTED DATA IN CMA FILE
*     EXIT IF THERE IS MORE DATA AVAILABLE THAN ALLOCATED TO CMA FILE
************************************************************************
*
      JI=KIELE
      IK= KINDEX
C
C     Identify order position as provided under NAMGEM namelist.
C
      IF (KSPEC.gt.0) THEN
         ILEM = CH_KGETPOS(KLIST(JI),KSPEC,CDSTNID)        
         IF (ILEM.LE.0) THEN
           write(nulout,*) KLIST(JI),KSPEC,CDSTNID
           CALL ABORT3D(NULOUT,'CH_CMABDY: Unidentified obs')
         END IF
      END IF
C
      IDIR=-1
      IF (KLIST(JI).EQ.NEDW) THEN
C
C        Will need to store observing direction of Doppler wind speed
C
         DO JJ=1,KELE
            IF (KLIST(JJ).EQ.NOBSLOS(1)) THEN
               IDIR=JJ
               EXIT
            END IF
         END DO
         IF (IDIR.EQ.-1) THEN
            WRITE(NULOUT,*)' CH_CMABDY: Missing dir. angle - CALL ABORT3D '
            call abort3d(nulout,'CH_CMABDY')
         END IF
         deg2rad=RPI/180.0D0
      END IF
C
      DO JJ=1,KVAL
C
C        Test on flags and obs values
C
         IFLAG=KFLAGS(JI,JJ,IK)
         ZVAL=PVALUES(JI,JJ,IK)
C
C        Verify validity of data.
C
c         IASS=0
c         DO J1=1,NTOTTRFLAG
c            IF (IFLAG.EQ.NTRFLAG(J1)) IASS=1
c         END DO
         IASS=1
C
         LLGOOD=(ZVAL.NE.PPMIS.AND.IASS.EQ.1.AND.ZVAL.LT.1.E28)
         IF (KSPEC.GT.0) THEN
            LLGOOD=(LLGOOD.AND.ZVAL.GT.0.0.AND.ZVAL.NE.PPMIS)
C
            IF (CDSTNID(1:9).EQ.'MIPAS_ESA'.AND.PVCORD(JJ).GT.10000.0) THEN
cc            IF (CDSTNID(1:9).EQ.'AURAMLS00'.AND.(PVCORD(JJ).GT.7000.0.OR.
cc     &          PVCORD(JJ).LT.19.0)) THEN
                   LLGOOD=.FALSE.
                   IFLAG=2048
c                   WRITE(NULOUT,*)' CH_CMABDY: Suspicious data rejected: ',
c     &             PVCORD(JJ),ZVAL,POER(JJ),KSPEC,K2CORD,KOBSTYP,
c     &             ' ',CDSTNID
            ELSE IF (.NOT.LDERR.AND.LLGOOD) THEN
               IF (POER(JJ).LE.1.0D-28.OR.POER(JJ).GE.1.0D28.OR.
     &             ZVAL.GT.QCFACT2(ILEM)*POER(JJ).OR.ZVAL.LT.0.1*POER(JJ)) THEN
                   LLGOOD=.FALSE.
                   IFLAG=2048
c                   WRITE(NULOUT,*)' CH_CMABDY: Suspicious data rejected: ',
c     &             PVCORD(JJ),ZVAL,POER(JJ),KSPEC,K2CORD,KOBSTYP,
c     &             ' ',CDSTNID
               ELSE IF (KSPEC.EQ.2) THEN
C
C                  It is assumed that KSPEC=2 refers to humidity. This
C                  must be consistent with the content of the 'tablespecies'
C                  file!
C
C                  Verification only done for obs in vmr!
C
                   IF ((KLIST(JI).EQ.15026.OR.KLIST(JI).EQ.15008.OR.
     &                KLIST(JI).EQ.15197)
     &                .AND.ZVAL.LT.RMINHU) THEN
                      LLGOOD=.FALSE.
                      IFLAG=2048
c                      WRITE(NULOUT,*) ' CH_CMABDY: Low humidity - rejected: ',
c     &                               KLIST(JI),ZVAL,POER(JJ),KSPEC,
c     &                               ' ',CDSTNID
                   END IF
               END IF
            END IF
         ELSE IF (KLIST(JI).EQ.12001) THEN
C
C           Screening out of suspicious temperature observations
C
            IF (CDSTNID(1:9).EQ.'MIPAS_ESA'.AND.
     &          PVCORD(JJ).GT.10000.0) THEN
C
               LLGOOD=.FALSE.
               IFLAG=2048
c               WRITE(NULOUT,*)' CH_CMABDY: Suspicious data rejected: ',
c     &             PVCORD(JJ),ZVAL,POER(JJ),KSPEC,K2CORD,KOBSTYP,PLAT,
c     &             ' ',CDSTNID
            ELSE IF (POER(JJ).GT.22.0.OR.POER(JJ).LT.0.1.OR.
     &         ZVAL.LT.50.0.OR.ZVAL.GT.400.0) THEN

c            ELSE IF (POER(JJ).GT.22.0.OR.POER(JJ).LT.0.1.OR. 
c     &         ZVAL.LT.100.0.OR.ZVAL.GT.350.0.OR.
c     &         (PLAT.GT.-30.0.AND.PLAT.LT.30.0.AND.
c     &          PVCORD(JJ).GT.1000.0.AND.KNVCORD.EQ.2.)) THEN
C
C              NOTE: Condition for exclusion of T obs in tropics below
C              10 hPa (1000 Pa) is to prevent appearance of
C              distortions on species fields, i.e. the so-called
C              wiggles, when running in 3D-var mode.
C
               LLGOOD=.FALSE.
               IFLAG=2048
c               WRITE(NULOUT,*)' CH_CMABDY: Suspicious data rejected: ',
c     &             PVCORD(JJ),ZVAL,POER(JJ),KSPEC,K2CORD,KOBSTYP,PLAT,
c     &             ' ',CDSTNID
            ELSE
C
C               Add tropical bias
C
c                if (PVCORD(JJ).GT.250.0.and.PVCORD(JJ).LT.4000.0
c     &            .and.PLAT.LT.7.5.AND.PLAT.GT.-22.5) THEN
c                   ZVAL=ZVAL
c     &             -4.*sin(3.1415*LOG(PVCORD(JJ)/1000.D0)/
c     &                 LOG(0.25D0))
c     &             *sin(3.1415*(PLAT+7.5)/15.0)
c                end if
            END IF
         END IF
         IF ( IP + IND .GT. NDATAMX ) THEN
            WRITE(NULOUT,*)' CH_CMABDY: CMA FILE FULL - CALL ABORT3D '
            call abort3d(nulout,'CH_CMABDY') 
         END IF
C
C        VERTICAL COORDINATE
C              
C        Store reference vertical level.
C              
         ROBDATA8(NCMPPP,IP+IND)=PVCORD(JJ)
C               
         if (K2CORD.GT.0) then
C
C           For column integrals/averages, store the lower boundary
C           of layer into ROBDATA8(NCMPOB,IP+IND)
C           in addition to upper boundary of layer
C           which goes into ROBDATA8(NCMPPP,IP+IND).
C
            ROBDATA8(NCMPOB,IP+IND)=PVCORD2(JJ)
         ELSE
            ROBDATA8(NCMPOB,IP+IND)=-1.0  
         endif
C
         MOBDATA(NCMFLG,IP+IND)=IFLAG
         MOBDATA(NCMSPEC,IP+IND)=KSPEC   
         MOBDATA(NCMVNM,IP+IND)=KLIST(JI)
         MOBDATA(NCMVCO,IP+IND)=KNVCORD  
         MOBDATA(NCMCORD1,IP+IND)=KOBSTYP
         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
         ROBDATA(NCMDWN,IP+IND)=PPMIS
C
         IF (LLGOOD) THEN
C
C              NOTE: Could apply CVT3D for unit conversion
C              if so required/desired. Currently commented out as all
C              unit conversions done in forward and adjoint models since some
C              conversions may depend on temperature and pressure. See
C              module CH_CONVERT.
C               
C               padd=0.0D0
C               pmul=1.0D0
C               CALL CVT3D(ZVAL,padd,pmul,1)
C
               ROBDATA8(NCMVAR,IP+IND)=ZVAL
               MOBDATA(NCMASS,IP+IND)=1
C
C              Store obs error std. if available.
C
               IF (.NOT.LDERR) THEN
                   ROBDATA8(NCMOER,IP+IND)=POER(JJ)
               ENDIF
C
C              Store observing direction
C
               IF (IDIR.GT.0) ROBDATA(NCMDWN,IP+IND)=PVALUES(IDIR,JJ,IK)
     &                        *deg2rad
C
         ELSE
C
C              Keep CMA space for invalid/missing data in profile to avoid 
C              any ordering mixup in going back from CMA to BURP during 
C              postprocessing.
C
               ROBDATA8(NCMVAR,IP+IND)=PPMIS
               MOBDATA(NCMASS,IP+IND)=0         ! Flagged as not usable.
         ENDIF
         IND=IND+1
      END DO
C
      KNDAT = IND
      IF (IND.GT.0) MOBDATA(NCMNUM1,IP+0:IP+IND-1) = IND 
C
      NDATA = NDATA + KNDAT
C
      RETURN
      END