!-------------------------------------- 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 BRPACMA(CDTYPE,indxfile,LDAPPEND,KFILE,KNRECS) 1,55
#if defined (DOC)
*
***s/r BRPACMA -CONVERT DATA IN CMC BURP FILES TO CMA.
*
*Author    . P. KOCLAS(CMC TEL. 4665)
*
*Revision:
*       . P. Koclas *CMC/AES September 1994:
*       .  - Removal of inconvenient i/o
*       .  -"Transformed latitude" is calculated with ISRCHILA
*       . P. Koclas *CMC/AES February 1995:
*          - modifications to read "tovs and acars" data
*            which are stored as "grouped data" recods in BURP
*            files.
*       . P. Koclas *CMC/AES April 1996:
*         - Modifications to read "uni info" bloc in satem reports.
*       . P. Koclas  AES/CMDA, Jan 1997 (421-4628)
*         - Modifications necessary for ssmi data
*       . C. Charette *ARMA/AES Jan 1997:
*         - New subroutine FLAGWND
*       . P. Koclas *CMC/CMSV October 1998:
*             for eta analysis:
*         - Temporary patch to read postalt markers for airep data.
*         C. Charette ARMA/AES NOV 1998
*            - Updates for option cvcord = 'PRESS'
*       . P. Koclas *CMC/AES June  1999:
*       .    - Y2K conversion (date element for grouped data)
*       . J. Halle *CMDA/AES Oct 1999
*         - Adapt to TOVS.
*       . P. Koklas *CMDA/AES Feb 2000
*         - Adapt to read data DERIVAT files for background check
*       . C. Charette *ARMA/AES Feb 2000
*         - Adapt to get data of family AI from block derivat in POSTOI files
*       . S. Pellerin *ARMA/SMC May 2000
*         - Fix for F90 conversion
*       . J. Halle *CMDA/AES Dec 2000
*         - TOVS level 1B data.
*       . JM Belanger *CMDA/SMC* june 2001
*         32 bits conversion.
*       . C. Charette *ARMA/AES Nov 2001:
*         - Warning messages. Option to abort when CMA is full
*       . J. Halle *CMDA/AES May 2002:
*         - Adapt to RTTOV-7: extract terrain type and instrument,
*                             remove extraction of scan position,
*                             change coding of sat. zenith angle in cma.
*       . N. Wagneur *MSC/CMC Juin 2002
*          - Adapt to GOES radiances
*       . J. St-James *MSC/CMC July 2003
*          - Add code for Profiler data
*       . JM Belanger CMDA/SMC Feb 2004
*          - Introduce "scatterometer family SC"
*       . D. Anselmo *MRB/ARMA  October 2004:
*          - Computation of ln specific humidity (LQ) for RAOBS and surface obs
*          - Addition of LQ to CMA
*       . D. Anselmo *MSC/ARMA Feb 2004
*          - Adapt to SSMI radiances
*       . A. Beaulne *MSC/CMDA June 2006
*          - Adapt to AIRS radiances
*       . J. Halle / C. COTE  *MSC/CMDA July 2007
*          - Adapt to METOP
*       . R. Sarrazin CMDA  April 2008
*          - Adapt to CSR radiances
*       . S. Heilliette
*          - Adapt to IASI radiances
*       . A. Beaulne
*          - Read element 7025 and 20010 only for AIRS
*            (was read by every sat up to 3dvar 10.3.4)
*       . S. Macpherson *MRD/ARMA September 2009
*          - Add code for GB-GPS (GP) data
*       . Bin He     *MRD/ARMA Mar. 2010 
*          - Implemented MPI version 
*       . A. Beaulne CMDA May 2010
*          - For IASI, do not read two consecutive times elements 7024 and 5021
*            (it was read two times in 3dvar 10.3.5)
*       . Luc Fillion & S. Heilliette - ARMA/EC - 9 Aug 2010 - Incorporate Cote & Wagneur's modifs below,
*                originally incorporated in v_10_4_0 & v_10_5_0 but forgotten in MPI version v_11_01B:
*               . C. Cote *MSC/CMDA Jan 2010
*                 - Modifier la conversion de NVCORD pour les plateforme
*                   tovs en utilisant seulement l'instrument comme test.
*               . N. Wagneur *MSC/CMDA Jul 2010
*                 - Modifier la lecture du numero d'instrument pour
*                   inclure un test sur la valeur de l'element.
*
*      PURPOSE:  TO READ ALL DATA BLOCKS IN BURP FILE AND TRANSFER
*                ALL GOOD DATA TO CMA.
*
*
*    ARGUMENTS:
*                 INPUT:
*
*                       -CDTYPE  : DATA TYPE (I.E: UA=UPPER AIR ...)
                        - indxfile : the index of the array CFAMTYP(J)  
*                       -LDAPPEND: .TRUE. -> APPEND DATA TO CMA FILE
*                                  .FALSE.->  START NEW CMC FILE
*                       -KFILE   : LOGICAL UNIT NUMBER OF BURP FILE
*                       -KNRECS  : NUMBER OF RECORDS IN BURP FILE
*
*                OUTPUT: NONE
*
#endif
*
      use common_iasi
      IMPLICIT NONE
#include "comlun.cdk"
#include "comdimo.cdk"
#include "comcst.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "cbtypes.cdk"
#include "cparbrp.cdk"
#include "cvcord.cdk"
#include "comnumbr.cdk"
#include "comct0.cdk"
*
      INTEGER KFILE,KNRECS,jji,jn,jpnbrelem
      INTEGER iind2,IIND,IPOS,ILPOS,INELEFD,ISCRAP
      INTEGER ITOTDAT,IMXL,IMXL3D,IMXLINF
      INTEGER ITECH,IMASK,ISAT,ISATCNT,ISATZEN,ITERRAIN
      INTEGER ISENSOR,INSTRUM,ISATAZIM,ISUNZA,ICLFR
      INTEGER IGQISFLAGQUAL,IGQISQUALINDEXLOC,ISUNAZIM
*
      CHARACTER *(*) CDTYPE
      INTEGER   indxfile  
      LOGICAL LDAPPEND,LLSURF
*
      INTEGER IER
      INTEGER IBTYP,IBKNAT,IBKTYP,IBKSTP,ibknatma
      INTEGER IHANDL,IBKNO,I3D
      INTEGER INELE,INVAL
      INTEGER INELEIN
      INTEGER INELE3D
      INTEGER IDLT,ITIME,IFLGS,IDBURP,ILAT,ILON,IDX,IDY,
     +        IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,IXAUX
      INTEGER ISTNID14,ISTNID58,ISTNID99
      CHARACTER *4 CSID14,CSID58
      CHARACTER *1 CSID99
*
      INTEGER MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
     +         ,MRFMXL
      INTEGER MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
     +        ,MRBPRML,MRBLOCX,MRBTBL
*
      EXTERNAL MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
     +         ,MRFMXL
      EXTERNAL MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
     +        ,MRBPRML,MRBLOCX,MRBTBL
*
*
      CHARACTER*9 CLSTNID
*
      REAL*8 ZPROF(jpmxnlv),ZEXTRA(jpmxnlv)
      INTEGER ITBL(10,JPMXBK)
      INTEGER   ILSTM(JPMXNEL)
      INTEGER ILIST3D(JPMXNEL)
      INTEGER ILISTIN(JPMXNEL)
      INTEGER   ILIST(JPMXNEL)
      INTEGER ILCOD3D(JPMXNEL)
      INTEGER   ILCOD(JPMXNEL)
      INTEGER ILCODMA(JPMXNEL)
      INTEGER ILISTNELE(JPMXNEL)
*
      INTEGER ITBLVAL(1)
      INTEGER  ITBL3D(1)
      INTEGER ITBLINF(1)
      INTEGER   IMARK(1)
      INTEGER    IBUF(1)
      REAL*8       ZVAL(1)
      REAL*8     ZVAL3D(1)

      POINTER(PXVAL    ,ZVAL)
      POINTER(PXVAL3D  ,ZVAL3D)
      POINTER(PXTABL   ,ITBLVAL)
      POINTER(PXTABL3D ,ITBL3D)
      POINTER(PXTABLINF,ITBLINF)
      POINTER(PXmark   ,Imark)
      POINTER(PXBUF    ,Ibuf)
*
      REAL*8 ZTORAD, XLAT, XLON
*
      INTEGER JI,JJ,JK,J3D
      INTEGER ICHECK,INELM,INVM,INTM,IBKNMA
      INTEGER ILONG,INBLKS,IKOUNT,IND,INBON,IEXTRAEL
      LOGICAL LLERR,LLMA,LLGROUP,LLERROR,LLSAT,LLUNI,LLRESET,LLGO,LLAIRS
      LOGICAL LCHECNAT,LCHECTYP,LCHECSTP,LLIASI

      INTEGER :: IfamID  

      IfamID = indxfile  

C
C     GENERATE TABLES TO ADJUST VERTICAL COORDINATE OF SURFACE DATA
C
      do jj=1,254
         do jn=1,jpnbrelem
            vcordsf(jn,jj)=0.
         end do
      end do
*
************************************************************************
*    SET BURP RELATED PARAMETERS VIA CALL TO RESUME SUBROUTINE
************************************************************************
*
      WRITE(NULOUT,*)' ------------------------------------------------'
      WRITE(NULOUT,*)' ---------    BEGIN  BRPACMA      ---------------'
      WRITE(NULOUT,*)' ------------------------------------------------'
*
      ZTORAD=RPI/180.
*
************************************************************************
*    ALLOCATE SPACE FOR DATA BUFFFER AND SET "ATTRIBUTES"
*    OF DATA TO BE READ VIA CALL TO RESUME ROUTINE
************************************************************************
*
      ILONG=MRFMXL(KFILE)
      CALL HPALLOC(PXBUF, ILONG + 20,IER,1)
      IBUF(1)=ILONG + 20
      IHANDL=MRFLOC(KFILE,0,'>>*******',-1,-1,-1,-1,-1,-1,0)
      IF ( IHANDL .LT. 0 ) THEN
         IHANDL=MRFLOC(KFILE,0,'*********',-1,-1,-1,-1,-1,-1,0)
         IF ( IHANDL .LT. 0 ) THEN
            WRITE(NULOUT,*)' BRPACMA: IMPOSSIBLE TO FIND VALID HANDLE'
            RETURN
         ENDIF
      ENDIF
      CALL RESUME(IHANDL,CDTYPE,IBUF)
      IER=VMRFOPR('MISSING',PPMIS)
*
************************************************************************
*    INITIALIZE DATA COUNTERS THEN BEGIN LOOP TO READ DATA
************************************************************************
*
      IF ( .NOT. LDAPPEND ) THEN
         NOBTOT  =0
         NDATA   =0
      ELSE
*
         WRITE(NULOUT,*)' '
         WRITE(NULOUT,*)'=============================================='
         WRITE(NULOUT,*)'NUMBER OF REPORTS CURRENTLY IN CMA FILE',NOBTOT
         WRITE(NULOUT,*)'DATA CURRENTLY IN CMA FILE             ',NDATA
         WRITE(NULOUT,*)'=============================================='
         WRITE(NULOUT,*) ' '
         IF ( NOBTOT .GE. NMXOBS ) THEN
            WRITE(NULOUT,*) ' CMA FILE FULL: NO DATA READ'
            WRITE(NULOUT,*)' ------------------------------------------'
            WRITE(NULOUT,*)' ------      END  BRPACMA     -------------'
            WRITE(NULOUT,*)' ------------------------------------------'
            RETURN
         ENDIF
      ENDIF
*
      IKOUNT=0
      IND   =0
*
************************************************************************
*    ALLOCATE SPACE TO READ DATA
************************************************************************
*
      IHANDL=0
      IMXL=1000
      IMXL3D=400
      IMXLINF=400
      CALL HPALLOC(PXVAL, IMXL,IER,8)
      CALL HPALLOC(PXVAL3D,IMXL3D,IER,8)
      CALL HPALLOC(PXTABL,IMXL,IER,1)
      CALL HPALLOC(PXmark,IMXL,IER,1)
      CALL HPALLOC(PXTABL3D,IMXL3D,IER,1)
      CALL HPALLOC(PXTABLINF,IMXLINF,IER,1)

*-----------------------------------------------------------------------
      DO 1 JI=1,KNRECS
         LLERR=.FALSE.
         itbl=0
*
************************************************************************
*    LOCATE AND READ THE OBSERVATION
************************************************************************
*
         IHANDL=MRFLOC(KFILE,IHANDL,'*********',-1,-1,-1,-1,-1,-1,0)
         IF ( IHANDL .LT. 0 )LLERR=.TRUE.
*
         IER=MRFGET(IHANDL,IBUF)
         IF (IER.LT.0) LLERR=.TRUE.
*
************************************************************************
*    EXTRACT THE HEADER
************************************************************************
*
         IER=MRBHDR(IBUF,ITIME,IFLGS,CLSTNID,IDBURP,ILAT,ILON,IDX,IDY,
     &                IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,0,IXAUX,0)

*
** Re-define NVCORD for SSMI, GOES, AIRS, GeoRad and IASI radiances
** (IDBURP=168,180,183,185,186)
** This is done until a more general BURP structure is defined
** and valid for all radiances from any platform.
**                       ------------
*
         SELECT CASE (IDBURP)
         CASE (164,181,182)
            !amsua, amsub, mhs
            !cas special d'un CLSTNID = UNKNOWN
            IF (CLSTNID .EQ. 'UNKNOWN' ) THEN
              NVCORD = 5042
            ELSE
              NVCORD = 2150
            ENDIF
            CASE (168,180,183,185,186)
            !ssmi, goes, airs, georad, iasi
            NVCORD = 5042
         ENDSELECT
*
         IF (IER.LT.0) LLERR=.TRUE.
*
************************************************************************
*    EXTRACT THE DATA AND FLAG BLOCKS
************************************************************************
*
         if ( CLSTNID(1:2) .eq. '>>') LLERR=.TRUE.
         IF ( .NOT. LLERR ) THEN
            INBLKS=MRBPRML(IBUF,0,ITBL,10,JPMXBK)
*
            IF ( CLSTNID(1:1) .EQ. '^' ) THEN
               IBKNO=MRBLOCX(IBUF,-1,-1,2,-1,-1,0)
               IF (IBKNO .LT. 0) IBKNO=MRBLOCX(IBUF,-1,-1,6,-1,-1,0)
               LLGROUP=.TRUE.
               IF ( IBKNO .GT. 0 ) THEN
                  I3D     =ITBL(4,IBKNO)
                  INELE3D =ITBL(2,IBKNO)
                  ITOTDAT=I3D*INELE3D
                  IF ( ITOTDAT .GT. IMXL3D) THEN
                     IMXL3D=ITOTDAT
                     CALL HPDEALLC(PXTABL3D,IER,1)
                     CALL HPDEALLC(PXVAL3D,IER,1)
                     CALL HPALLOC(PXTABL3D,IMXL3D,IER,1)
                     CALL HPALLOC(PXVAL3D,IMXL3D,IER,8)
                  ENDIF
                  IER=MRBXTR(IBUF,IBKNO,ILCOD3D,ITBL3D)
                  IER=VMRBCVT(ILCOD3D,ITBL3D,ZVAL3D,INELE3D,1,I3D,0)
                  IER=MRBDCL(ILCOD3D,ILIST3D,INELE3D)
                ENDIF
            ELSE
               LLGROUP=.FALSE.
               I3D=1
            ENDIF
*
*----------------------->
*    uni info block
*----------------------->
*
            IBKNO =MRBLOCX(IBUF,-1,-1,1,-1,-1,0)
            IF ( IBKNO .GT. 0 ) THEN
               INELEIN =ITBL(2,IBKNO)
               ITOTDAT=I3D*INELEIN
               IF ( ITOTDAT .GT. IMXLINF) THEN
                  IMXLINF=ITOTDAT
                  CALL HPDEALLC(PXTABLINF,IER,1)
                  CALL HPALLOC(PXTABLINF,IMXLINF,IER,1)
               ENDIF
               IER=MRBXTR(IBUF,IBKNO,ILCOD3D,ITBLINF)
               IER=MRBDCL(ILCOD3D,ILISTIN,INELEIN)
               LLUNI=.TRUE.
            ELSE
               LLUNI=.FALSE.
            ENDIF
*
*----------------------->
*    data  blocks
*----------------------->
*
           IPOS=1
           ILPOS=1
           ITOTDAT=0
           DO JK=1,INBLKS
              LLSURF=.FALSE.
              IBTYP=ITBL(7,JK)
              IER=MRBTYP(IBKNAT,IBKTYP,IBKSTP,IBTYP)
              IF (IBTYP==9217 .and. IDBURP==186) THEN
                 CALL IASIEXTRACT(IBKNAT,IBKTYP,IBKSTP,IBUF,IBUF(1),ITBL(2,JK),ITBL(3,JK),I3D)
              ENDIF
              IBKNMA=-1
              IF( LCHECNAT(IBKNAT) .AND. LCHECTYP(IBKTYP)
     +        .AND.  LCHECSTP(IBKSTP) ) THEN
                 IBKNO =MRBLOCX(IBUF,-1,-1,IBKNAT,IBKTYP,IBKSTP,0)
                 INELE =ITBL(2,JK)
                 INVAL =ITBL(3,JK)
*  ALLOW 2 EXTRA ELEMENTS IN CASE WE NEED TO ADDP FF DD WIND ARRAYS TO CMA
*  ALLOW 1 EXTRA ELEMENT FOR LQ
                 IEXTRAEL=3

                 ibknatma=(IBKNAT + 3)
                 ITOTDAT=ITOTDAT + (INELE+IEXTRAEL)*INVAL*I3D
                 IF ( ITOTDAT .GT. IMXL) THEN
                    IMXL=ITOTDAT
                    CALL HPDEALLC(PXVAL,IER,1)
                    CALL HPDEALLC(PXTABL,IER,1)
                    CALL HPDEALLC(PXmark,IER,1)
                    CALL  HPALLOC(PXVAL,ITOTDAT,IER,8)
                    CALL  HPALLOC(PXTABL,ITOTDAT,IER,1)
                    CALL  HPALLOC(PXmark,ITOTDAT,IER,1)
                 ENDIF
                 IER=MRBXTR(IBUF,IBKNO,ILCOD(ILPOS),ITBLVAL(IPOS))

                 do jji =1,INELE*INVAL*I3D
                    ZVAL(ipos + jji-1)=ITBLVAL(IPOS + jji -1)
                 end do
*
                 IER=VMRBCVT(ILCOD(ILPOS),ITBLVAL(IPOS),ZVAL(ipos),
     &           INELE,INVAL,I3D,0)
                 IER=MRBDCL(ILCOD(ILPOS),ILIST(ilpos),INELE)
*
                 IBKNMA=MRBLOCX(IBUF,-1,-1,NBKNAUN,IBKTYP,IBKSTP,0)
                 IF ( IBKNMA .LE. 0 ) THEN
                    IBKNMA=MRBLOCX(IBUF,-1,-1,NBKNAMU,IBKTYP,IBKSTP,0)
                 ENDIF
C
                 IF ( IBKNMA .GT. 0 ) THEN
                    IER =MRBXTR(IBUF,IBKNMA,ILCODMA(ILPOS),IMARK(IPOS))
*
                    INELM =ITBL(2,IBKNMA)
                    INVM  =ITBL(3,IBKNMA)
                    INTM  =ITBL(4,IBKNMA)
                    IER   =MRBDCL(ILCODMA(ILPOS),ILSTM(ILPOS),INELM)
                    ICHECK=
     +              IABS(INELE-INELM)+IABS(INVAL-INVM)+IABS(I3D-INTM)
                    DO JJ=ILPOS,ILPOS+INELE-1
                       ICHECK=ICHECK+IABS((ILSTM(JJ)-200000-ILIST(JJ)))
                    END DO
                    LLMA= (ICHECK .EQ. 0 )
                   llma=.true.
*-----------------------------------------------------------------------
*                   TRANSFER REJECT FLAGS BETWEEN WIND DIRECTION AND SPEED
*-----------------------------------------------------------------------
                    CALL FLAGWND(IMARK(IPOS)
     +                   ,ILSTM(ILPOS),INELM,INVM,INTM
     +                   ,CLSTNID,IDBURP,ILAT,ILON)
*-----------------------------------------------------------------------
                 ENDIF
*-----------------------------------------------------------------------
*                 CONVERT F-D WIND TO U-V COMPONENTS
*-------------------------------------------------------------------

                 if ( ibknat .eq. 0 .and. cdtype .eq. 'UA') then
                    nvcordtyp=1
                    LLSURF = .TRUE.
                 endif

                 if ( ibknat .eq. 4 .and. cdtype .eq. 'UA')nvcordtyp=2

                 if  ( cdtype == 'SF' .OR. cdtype == 'SC'
     &                 .OR. LLSURF ) then
                    CALL VCORDADJ(IDBURP,ZVAL(IPOS),IMARK(IPOS)
     +                   ,ILIST(ILPOS),INELE,INVAL,I3D,ISCRAP)
                 endif

                 CALL FDTOUV(ZVAL(IPOS),IMARK(IPOS),ILIST(ILPOS),INELE,
     +           INVAL,I3D,INELEFD)
                 ILISTNELE(JK)=INELEfd
                 INELE=ILISTNELE(JK)
                    CALL FLAGFDTOUV(IMARK(IPOS)
     +                   ,ILIST(ILPOS),INELE,INVAL,I3D
     +                   ,CLSTNID,IDBURP,ILAT,ILON)

*-----------------------------------------------------------------------
*                 CONVERT ES TO HU
*-------------------------------------------------------------------
                 CALL ESTOHU(ZVAL(IPOS),IMARK(IPOS),ILIST(ILPOS),INELE,
     +                       INVAL,I3D,INELEFD)
                 ILISTNELE(JK)=INELEfd
                 INELE=ILISTNELE(JK)

*-------------------------------------------------------------------
                 ILPOS=INELE + ILPOS
                 IPOS =INELE*INVAL*I3D + IPOS
                 IKOUNT=IKOUNT + INELE*INVAL*I3D
              ENDIF
           END DO
*
************************************************************************
*    INSERT DATA INTO CMA FILE
************************************************************************
*
           DO J3D=1,I3D
              IPOS=1
              ILPOS=1
              INBON=0
              IND=0
              DO 3 JK=1,inblks
                 LLSURF=.FALSE.

                 IBTYP=ITBL(7,JK)
                 IER=MRBTYP(IBKNAT,IBKTYP,IBKSTP,IBTYP)
                 IF( LCHECNAT(IBKNAT) .AND. LCHECTYP(IBKTYP)
     +             .AND.  LCHECSTP(IBKSTP) ) THEN
                      if ( ibknat .eq. 0 .and. cdtype .eq. 'UA') then
                         nvcordtyp=1
                         LLSURF = .TRUE.
                      endif

                      if ( ibknat .eq. 4 .and. cdtype .eq. 'UA')
     +                    nvcordtyp=2

                      INELE =ITBL(2,JK)
                      INELE =ilistnele(jk)
                      INVAL =ITBL(3,JK)
                      CALL GETELE(NVCORD,J3D,ILIST(ILPOS),ZVAL(IPOS),
     +                     ZPROF,INELE,INVAL,I3D,IIND)
                      if  ( cdtype == 'SF' .OR. cdtype == 'SC'
     &                      .OR. LLSURF ) then
                         iind=1
                         zprof(1)=REAL(IALT-400)
                      endif

*
*   FOR GB-GPS DATA, USE STATION HEIGHT FOR ZPROF
*----------------------------------------------------------------------
                      if  (  cdtype .eq. 'GP'  ) then
                         iind=1
                         zprof(1)=REAL(IALT-400)
                      endif

*
*   FOR PROFILER DATA, ADD STATION HEIGHT TO ZPROF
*   FOR USE IN NCMPPP
*----------------------------------------------------------------------
*

                      if  (  cdtype .eq. 'PR' ) then
                         DO jj=1,INVAL
                            zprof(JJ)=REAL(IALT-400) + zprof(JJ)
                         END DO
                      endif
*
*   FOR HUMSAT DATA GET THE OBSERVATION ERROR IS
*   CONTAINED IN THE REPORT DATA BLOCK
*----------------------------------------------------------------------
*
                    IF ( CDTYPE .EQ. 'HU' ) THEN
                       CALL GETELE(12230,J3D,ILIST(ILPOS),ZVAL(IPOS),
     +                 ZEXTRA,INELE,INVAL,I3D,IIND)
                       LLERROR=.TRUE.
                    ELSE
                       LLERROR=.FALSE.
                    ENDIF
*
*   FOR GOES OR AIRS DATA GET THE SURFACE EMISSIVITY WHICH IS
*   CONTAINED IN THE REPORT DATA BLOCK
*----------------------------------------------------------------------
*
                    IF ( CDTYPE .EQ. 'GO' ) THEN
                       CALL GETELE(55043,J3D,ILIST(ILPOS),ZVAL(IPOS),
     +                 ZEXTRA,INELE,INVAL,I3D,IIND)
                       LLGO=.TRUE.
                    ELSE
                       LLGO=.FALSE.
                    ENDIF

                    IF ( CLSTNID(1:5) .EQ. '^AQUA' .AND. IDBURP .EQ. 183 ) THEN
                       IF ( NCONF .NE. 101 ) THEN
                          CALL GETELE(55043,J3D,ILIST(ILPOS),ZVAL(IPOS),
     +                    ZEXTRA,INELE,INVAL,I3D,IIND)
                          LLAIRS=.TRUE.
                       ELSE
                          LLAIRS=.FALSE.
                       END IF
                    ELSE
                       LLAIRS=.FALSE.
                    ENDIF

                    IF ( CLSTNID(1:6) .EQ. '^METOP' .AND. IDBURP .EQ. 186 ) THEN
                       IF ( NCONF .NE. 101 ) THEN
                          CALL GETELE(55043,J3D,ILIST(ILPOS),ZVAL(IPOS),
     +                    ZEXTRA,INELE,INVAL,I3D,IIND)
                          LLIASI=.TRUE.
                       ELSE
                          LLIASI=.FALSE.
                       END IF
                    ELSE
                       LLIASI=.FALSE.
                    ENDIF



*
*----------------------------------------------------------------------
*
*  FOR SATEMS REFERENCE PRESSSURE IS CONTAINED IN THE REPORT DATA BLOCK
*----------------------------------------------------------------------
*
                    IF ( CDTYPE .EQ. 'ST' ) THEN
                       CALL GETELE(07193,J3D,ILIST(ILPOS),ZVAL(IPOS),
     +                 ZEXTRA,INELE,INVAL,I3D,IIND)
                       LLSAT=.TRUE.
                    ELSE
                       LLSAT=.FALSE.
                    ENDIF
*----------------------------------------------------------------------
*
                    IF ( IIND .GT. 0 ) THEN
                       IF (CDTYPE .EQ. 'MI' ) THEN
                          CALL CMABDY(ZVAL(IPOS),ILIST(ILPOS),IMARK(ipos),
     +                    LLMA,ZEXTRA,LLERROR,LLSAT,LLGO,LLAIRS,LLIASI,INELE,INVAL,I3D,IND,
     +                    -1 ,ZPROF,J3D,IDBURP)
                       ELSE
                          CALL CMABDY(ZVAL(IPOS),ILIST(ILPOS),IMARK(ipos),
     +                    LLMA,ZEXTRA,LLERROR,LLSAT,LLGO,LLAIRS,LLIASI,INELE,INVAL,I3D,IND,
     +                    NVCORD,ZPROF,J3D,IDBURP)
                       ENDIF
                    ELSE
                       IF (CDTYPE .NE. 'TO') THEN
                          write(nulout,*)'for station:',clstnid
     +                       ,' vertical coordinate not found:',NVCORD
                       ENDIF
                       IND =0
                    ENDIF
                    ILPOS=INELE + ILPOS
                    IPOS =INELE*INVAL*I3D + IPOS
                    INBON =INBON  + IND
                 ENDIF
    3         CONTINUE

              IF ( INBON .GT. 0 ) THEN
*
************************************************************************
* for grouped data: get date time  latitude and longitude
* from 3d description block
************************************************************************
*
              IF (LLGROUP ) THEN
                 CALL IGETELE
     +           (55200,J3D,ILIST3D,ITBL3D,IFLGS,INELE3D,1,I3D,IIND)
                 CALL IGETELE
     +           (4196,J3D,ILIST3D,ITBL3D,IDATE,INELE3D,1,I3D,IIND)
                 IF ( IIND .EQ. -1)
     +              CALL IGETELE
     +              (4208,J3D,ILIST3D,ITBL3D,IDATE,INELE3D,1,I3D,IIND)
                 CALL IGETELE
     +           (4197,J3D,ILIST3D,ITBL3D,ITIME,INELE3D,1,I3D,IIND)
*
                 CALL GETELE(5002,J3D,ILIST3D,ZVAL3D,
     +                       XLAT,INELE3D,1,I3D,IIND)
                 CALL GETELE(6002,J3D,ILIST3D,ZVAL3D,
     +                       XLON,INELE3D,1,I3D,IIND)
*
** convert from burp units:
**            latitude : [-90.00, +90.00], longitude : [-180.00,+180.00],
**         to cma units:
**            latitude : [     0,  18000], longitude : [      0,  36000].
*
                 ILAT = 9000 + NINT(XLAT*100.)
                 ILON = NINT(XLON*100.)
                 IF ( ILON .LT. 0 ) ILON = 36000 + ILON
*
                 CALL IGETELE
     +           (4016,J3D,ILIST3D,ITBL3D,IDLT,INELE3D,1,I3D,IIND)

              ENDIF
*
*
************************************************************************
*  for tovs data: get retrieval technique satellite, satellite number,
*                 land/sea mask, scan position, satellite zenith angle,
*                 terrain type and satellite sensor indicator/instrument
*                 from info block
************************************************************************
*
              IF ( CDTYPE .EQ. 'TO' ) THEN
*
               CALL IGETELE
     +         (2022,J3D,ILISTIN,ITBLINF,ITECH,INELEIN,1,I3D,IIND)
***************use bit #'s 3,4 and 5; set other bits to zero.
***************correct for NESDIS BUFR coding error of cloudy path. Correction is:
***************if clear path bit off or if element not found, then it is assumed cloudy.
               IF ( IIND .NE. -1 ) THEN
                  ITECH = AND(ITECH,56)
                  IF (ITECH .EQ. 0 ) THEN
                     ITECH = 8
                  ENDIF
               ELSE
                 IF ( IDBURP .EQ. 185 ) then
                  ITECH = 32
                 ELSE
                  ITECH = 8
                 ENDIF
               ENDIF
*
               CALL IGETELE
     +         (1007,J3D,ILISTIN,ITBLINF,ISAT,INELEIN,1,I3D,IIND)
*
               CALL IGETELE
     +         (8012,J3D,ILISTIN,ITBLINF,IMASK,INELEIN,1,I3D,IIND)
*
**             terrain type
               CALL IGETELE
     +         (13039,J3D,ILISTIN,ITBLINF,ITERRAIN,INELEIN,1,I3D,IIND)
*
*              Is terrain type sea ice (iterrain=0)?, If so, sert imask=2.
               IF ( IIND     .NE. -1 .AND.
     +              ITERRAIN .EQ.  0       ) THEN
                  IMASK = 2
               ENDIF
*
**             satellite sensor indicator (element #2048) or
**             satellite instrument (element #2019).
**             If element #2048 is present, map into element #2019.
               CALL IGETELE
     +         (2048,J3D,ILISTIN,ITBLINF,ISENSOR,INELEIN,1,I3D,IIND)
               IF ( IIND .EQ. -1 .OR. ISENSOR .EQ. -1 ) THEN
                  CALL IGETELE
     +            (2019,J3D,ILISTIN,ITBLINF,INSTRUM,INELEIN,1,I3D,IIND)
                  IF ( IIND .EQ. -1 ) THEN
                     INSTRUM = 0
                  ENDIF
               ELSE
                  CALL CVT_BURP_INSTRUM(ISENSOR,INSTRUM)
               ENDIF
*
*              Define ISAT for AIRS which has no element #1007
               IF ( INSTRUM == 420 ) ISAT = 784
*
               ISATZEN = 9000
*
*              METOP-2 element 1007=4
*
               IF ( ISAT .GE. 54 .OR. ISAT .EQ. 4 ) THEN
*                satellite zenith angle
                 CALL IGETELE
     +           (7024,J3D,ILISTIN,ITBLINF,ISATZEN,INELEIN,1,I3D,IIND)
*                satellite azimuth angle
                 CALL IGETELE
     +           (5021,J3D,ILISTIN,ITBLINF,ISATAZIM,INELEIN,1,I3D,IIND)
               ENDIF

* cas provisoire AIRS
               IF ( ISAT == 784 .AND. IDBURP == 183 ) THEN               
*                sun zenith angle
                 CALL IGETELE
     +           (7025,J3D,ILISTIN,ITBLINF,ISUNZA,INELEIN,1,I3D,IIND)
*                cloud fraction
                 CALL IGETELE
     +           (20010,J3D,ILISTIN,ITBLINF,ICLFR,INELEIN,1,I3D,IIND)
               ENDIF

* cas provisoire IASI
               IF ( ISAT == 4 .AND. IDBURP == 186 ) THEN
*                sun zenith angle
                 CALL IGETELE
     +           (7025,J3D,ILISTIN,ITBLINF,ISUNZA,INELEIN,1,I3D,IIND)
*                sun azimuth angle
                 CALL IGETELE
     +           (5022,J3D,ILISTIN,ITBLINF,ISUNAZIM,INELEIN,1,I3D,IIND)

*                cloud fraction
                 ICLFR=0
* GQISFLAGQUAL :
* The usability of a IASI measurement is indicated by the boolean flag GQisFlagQual.
* (0=okay,1=bad)
                 CALL IGETELE
     +           (33060,J3D,ILISTIN,ITBLINF,IGQISFLAGQUAL,INELEIN,1,
     +            I3D,IIND)
* GQISQUALINDEXLOC : 
* The performance of the co-registration between IASI and AVHRR
* measurements is given by GQisQualIndexLoc. This value is the
* semi-major axis of the ellipse error in AVHRR pixel units
* (estimated by the Level 1 processing for each individual
* field of regards). GQisQualIndexLoc indicates the
* co-registration error and therefore small values indicate
* good quality.
                 CALL IGETELE
     +           (33062,J3D,ILISTIN,ITBLINF,IGQISQUALINDEXLOC,INELEIN,1,
     +            I3D,IIND)


               ENDIF

              ELSE IF ( CDTYPE .EQ. 'ST' ) THEN
                 IF ( LLUNI) THEN
                    CALL IGETELE
     +              (2022,J3D,ILISTIN,ITBLINF,ITECH,INELEIN,1,I3D,IIND)
                 ELSE
                    ITECH=0
                 ENDIF
                 IMASK=0
                 INSTRUM=0
                 ISAT =0
                 ISATZEN  =0
*
************************************************************************
*  for goes data: get retrieval technique satellite, satellite number,
*                 land/sea mask, satellite zenith angle from info block
************************************************************************
*
              ELSE IF ( CDTYPE .EQ. 'GO' ) THEN
*
*              satellite processing technique n/a for goes data atm
               ITECH = 8
*
**             satellite instrument (element #2019).
c               CALL IGETELE
c     +         (2019,J3D,ILISTIN,ITBLINF,INSTRUM,INELEIN,1,I3D,IIND)
c               IF ( IIND .EQ. -1 ) THEN
                  INSTRUM = 0
c               ENDIF
*
*              satellite identifier number
               CALL IGETELE
     +         (1007,J3D,ILISTIN,ITBLINF,ISAT,INELEIN,1,I3D,IIND)
*
*              land/sea mask
               CALL IGETELE
     +         (8012,J3D,ILISTIN,ITBLINF,IMASK,INELEIN,1,I3D,IIND)
*
*              satellite zenith angle
               CALL IGETELE
     +         (7024,J3D,ILISTIN,ITBLINF,ISATZEN,INELEIN,1,I3D,IIND)
*
              ELSE
                 ITECH=0
                 IMASK=0
                 INSTRUM=0
                 ISAT =0
                 ISATZEN  =0
                 ISATAZIM  =0
                 ISUNZA = 0
                 ICLFR = 0
              ENDIF
*
************************************************************************
*      IF VALID DATA WAS FOUND GENERATE THE CMA HEADER
*      AND INCREMENT NOBTOT
************************************************************************
*
               IF  ( NOBTOT .LT. NMXOBS) THEN
                NOBTOT=NOBTOT + 1
                csid14=CLSTNID(1:4)
                csid58=CLSTNID(5:8)
                csid99=CLSTNID(9:9)
                READ(csid14,'(a4)')ISTNID14
                READ(csid58,'(a4)')ISTNID58
                READ(csid99,'(a1)')ISTNID99
                CSTNID(NOBTOT)=CLSTNID
                ROBHDR(NCMLON,NOBTOT) = (REAL(ILON)*0.01)*ZTORAD
                ROBHDR(NCMLAT,NOBTOT) = (REAL(ILAT)*0.01-90.)*ZTORAD
                ROBHDR(NCMALT,NOBTOT) = (REAL(IALT)-400)
                ROBHDR(NCMTLO,NOBTOT) = (REAL(ILON)*0.01)*ZTORAD
                ROBHDR(NCMTLA,NOBTOT) = (REAL(ILAT)*0.01-90.)*ZTORAD
                MOBHDR(NCMNLV,NOBTOT) = INBON
*
                IF ( NOBTOT .EQ. 1) THEN
                   MOBHDR(NCMRLN,1)=1
                ELSE
                   MOBHDR(NCMRLN,NOBTOT) = MOBHDR(NCMRLN,NOBTOT-1)
     +                              + MOBHDR(NCMNLV,NOBTOT-1)
                ENDIF
*
************************************************************************
*              REMAINDER OF HEADER
************************************************************************
*
*
                MOBHDR(NCMONM,NOBTOT) = NOBTOT
* Modification S. Heilliette pour traiter le cas ou l'angle
* est manquant (ISATZEN=-1) pour les donnees AIRS et IASI
* le 14/07/2011
* Alain Beaulne, extension pour toutes les radiances (enlever check sur IDBURP)
                IF (ISATZEN .LT. 0) THEN 
* 19000 correspond a un angle de 100 degres impossible
                   ISATZEN = 19000
                ENDIF
* Fin modif
                MOBHDR(NCMBOX,NOBTOT) = INSTRUM + ISATZEN*10000
                MOBHDR(NCMOTP,NOBTOT) = NVTYP
                MOBHDR(NCMITY,NOBTOT) = IDBURP+ 1000*ISAT+ 1000000*ITECH
                MOBHDR(NCMDAT,NOBTOT) = IDATE
                MOBHDR(NCMETM,NOBTOT) = ITIME
                MOBHDR(NCMSID,NOBTOT) = ISTNID14
                MOBHDR(NCMSI2,NOBTOT) = ISTNID58
                MOBHDR(NCMSI3,NOBTOT) = ISTNID99
                !!bhe MOBHDR(NCMOEC,NOBTOT) = 999
                MOBHDR(NCMOEC,NOBTOT) = IfamID
                MOBHDR(NCMOFL,NOBTOT) = IMASK
                MOBHDR(NCMST1,NOBTOT) = IFLGS
                MOBHDR(NCMAZA,NOBTOT) = ISATAZIM
                MOBHDR(NCMSUN,NOBTOT) = ISUNZA
                MOBHDR(NCMCLF,NOBTOT) = ICLFR
                
                IF (IDBURP==186) call index_cma_iasi(NOBTOT,IGQISFLAGQUAL,
     +           IGQISQUALINDEXLOC,ISUNAZIM)
                
               ENDIF

            ELSE
              WRITE(NULOUT,*)' Warning 3DV:brpacma: NO VALID DATA'
     &             ,' OBS ',CLSTNID,' TYPE ',IDBURP,' LAT ', ILAT,
     &             ' LON ', ILON
            ENDIF
         IF ( NDATA .GE. NDATAMX .OR. NOBTOT .GE. NMXOBS ) THEN
            CALL HPDEALLC(PXVAL    ,IER,1)
            CALL HPDEALLC(PXVAL3D  ,IER,1)
            CALL HPDEALLC(PXTABL   ,IER,1)
            CALL HPDEALLC(PXTABL3D ,IER,1)
            CALL HPDEALLC(PXTABLINF,IER,1)
            CALL HPDEALLC(PXmark   ,IER,1)
            CALL HPDEALLC(PXBUF    ,IER,1)
*
*-----------------------------------------------------------------------
            WRITE(NULOUT,*)' ******************************************'
            WRITE(NULOUT,*)' *    ATTN  ATTN  ATTN  ATTN  ATTN  ATTN  *'
            WRITE(NULOUT,*)' *    ATTN  ATTN  ATTN  ATTN  ATTN  ATTN  *'
            WRITE(NULOUT,*)' *                                        *'
            WRITE(NULOUT,*)' *    CMA FILE FULL: NO MORE DATA READ    *'
            WRITE(NULOUT,*)' *    ABORT WHEN LABORTFULL = .TRUE.      *'
            WRITE(NULOUT,*)' *                                        *'
            WRITE(NULOUT,*)' *    CHECK   NMXOBS, NDATAMX IN NAMELIST *'
            WRITE(NULOUT,*)' *                                        *'
            WRITE(NULOUT,*)' *    LABORTFULL = .TRUE.  ==> CALL ABORT *'
            WRITE(NULOUT,*)' *    LABORTFULL = .FALSE. ===> CONTINUE  *'
            WRITE(NULOUT,*)' *                                        *'
            WRITE(NULOUT,*)' ******************************************'
*
            WRITE(NULOUT,*)'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
            WRITE(NULOUT,*)' Warning 3DV:brpacma: CMA FILE FULL'
            WRITE(NULOUT,*)'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
*
            WRITE(NULOUT,'(1x,"NDATA = ",I10," NDATAMX",I10)')
     &                    NDATA, NDATAMX
            WRITE(NULOUT,'(1x,"NOBTOT= ",I10," NMXOBS = ",I10)')
     &                    NOBTOT, NMXOBS
            WRITE(NULOUT,*)' LABORTFULL = ', LABORTFULL
*
            CALL PRNTBRP(NOBTOT,IKOUNT,NDATA)
*
            IF (LABORTFULL) THEN
              WRITE(NULOUT,*)' BRPACMA: CMA FILE FULL - CALL ABORT3D '
              call abort3d(nulout,'BRPACMA')
            ELSE
              WRITE(NULOUT,*)' BRPACMA: CMA FILE FULL - CONTINUE '
            ENDIF
*
            WRITE(NULOUT,*)' ------------------------------------------'
            WRITE(NULOUT,*)' ------      END  BRPACMA     -------------'
            WRITE(NULOUT,*)' ------------------------------------------'
            RETURN
         ENDIF
    5 END DO
      ENDIF
    1 CONTINUE


      CALL HPDEALLC(PXVAL    ,IER,1)
      CALL HPDEALLC(PXVAL3D  ,IER,1)
      CALL HPDEALLC(PXTABL   ,IER,1)
      CALL HPDEALLC(PXTABL3D ,IER,1)
      CALL HPDEALLC(PXTABLINF,IER,1)
      CALL HPDEALLC(PXmark   ,IER,1)
      CALL HPDEALLC(PXBUF    ,IER,1)
*
*-----------------------------------------------------------------------
      CALL PRNTBRP(NOBTOT,IKOUNT,NDATA)
*
      WRITE(NULOUT,*)' ------------------------------------------'
      WRITE(NULOUT,*)' ------      END  BRPACMA     -------------'
      WRITE(NULOUT,*)' ------------------------------------------'
*
      RETURN
      END