!--------------------------------------- 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 --------------------------------------

#include "maincompileswitch.inc"
#include "compileswitches.inc"

module  burp_read 2

use burp_module
use ObsSpaceData_mod
use MathPhysConstants_mod
use earthconstants_mod
implicit none
save
private

! public variables (parameters)
public             :: PPMIS
! public procedures
public             :: READBURP,UPDATE_BURP


! MODULE CONSTANTS ...
!
!   These variables are set during object initialization (variational_init) and
!   are not changed thereafter.
! bits to verify in Quality Control Flag:

REAL*4,   PARAMETER  :: PPMIS=-999.

INTEGER*4              :: NELEMS,NELEMS_SFC,BLISTELEMENTS(20),BLISTELEMENTS_SFC(20)
INTEGER*4              :: BN_ITEMS
CHARACTER *3           :: BITEMLIST(20)
CHARACTER *7           :: TYPE_RESUME

INTEGER*4              :: BNBITSOFF,BNBITSON,BBITOFF(15),BBITON(15)
LOGICAL                :: ENFORCE_CLASSIC_SONDES


CONTAINS


  SUBROUTINE UPDATE_BURP(obsdat,familytype,brp_file,FILENUMB) 1,47

    !******************************************************************************** 
    !
    !**ID UPDATE_BURP -- UPDATE VARIABLES RELATIVE TO ASSIMILATION IN BURP FILES
    !
    !       AUTHOR:   P. KOCLAS (CMDA/SMC) Feb 2013
    !
    !       REVISION:
    !                 S. MACPHERSON (ARMA) Oct 2013
    !                  -- add 'GP' family (ground-based GPS) as type "SFC"
    !                 P. KOCLAS (CMDA/SMC)) Aug 2014
    !                  -- Fix for the Burp 24 bit header markers of the UA4D
    !                 P. KOCLAS (CMDA/SMC)) Oct 2014
    !                  -- CHANGE ADDSIZE FOR SW ( GROUPED SATWINDS)
    !
    !       OBJECT: UPDATE CMC BURP FILE 
    !
    !          WHEN SEARCHING FOR A SPECIFIC BLOCK BY ITS BTYP, VALUES OF
    !          BIT 0 TO 3 ARE IRRELEVANT WHILE BIT 4 IS 0 FOR GLOBAL AND 1
    !          FOR REGIONAL MODEL. HERE, WE SEARCH BLOCK BY THEIR FIRST
    !          10 BITS (BIT 5 TO 14).
    !
    !       ARGUMENTS:
    !               INPUT:
    !                  -OBSDAT    : instance of obsspace_data module object
    !                  -FAMILYTYPE: TYPE of family ('UA' ,'SF','AI,''SW','TO')...
    !                  -BRP_FILE  : FILENAME OF BURP FILE 
    !
    !
    !****************************************************************************

    IMPLICIT NONE
    INTEGER,  PARAMETER    :: NBLOC_LIST=6
    CHARACTER(LEN=128)     :: BRP_FILE
    CHARACTER *2           :: FAMILYTYPE
    INTEGER                :: FILENUMB,LNMX
    type (struct_obs), intent(inout) :: obsdat

    TYPE(BURP_FILE)        :: FILE_IN
    TYPE(BURP_RPT)         :: RPT_IN,CP_RPT
    TYPE(BURP_BLOCK)       :: BLOCK_IN,BLOCK_OMA,BLOCK_OMP,BLOCK_OER,BLOCK_FGE,BLOCK_FLG
    TYPE(BURP_BLOCK)       :: BLOCK_OMA_SFC,BLOCK_OMP_SFC,BLOCK_OER_SFC,BLOCK_FGE_SFC,BLOCK_FLG_SFC
    TYPE(BURP_BLOCK)       :: Block_FLG_CP,BLOCK_OBS_MUL_CP,BLOCK_MAR_MUL_CP,BLOCK_OBS_SFC_CP,BLOCK_MAR_SFC_CP

    CHARACTER(LEN=5)       :: FAMILYTYPE2
    CHARACTER(LEN=9)       :: OPT_MISSING
    INTEGER                :: BTYP,BFAM,BTYP10,BTYP10_uni,BTYP10FLG_uni,BTYP10obs_uni 
    INTEGER                :: BTYP10DES,BTYP10INF,BTYP10OBS,BTYP10FLG

    INTEGER                :: NB_RPTS,REF_RPT,REF_BLK,COUNT
    INTEGER, ALLOCATABLE   :: ADDRESS(:)
    REAL                   :: VCOORD

    INTEGER                :: NBELE,NVALE,NTE
    INTEGER                :: I,J,JJ,K,KK,KI,IL,Jo,ERROR,OBSN,KOBSN,ITEM,IER
    INTEGER                :: info_elepos,IND_ELE,IND_VCOORD,IND_VCOORD2,IND_QCFLAG
    INTEGER                :: IND_ELE_MAR,IND_ELEU,IND_ELEF,IND_ELE_stat
    INTEGER                :: IND_LAT,IND_LON,IND_TIME

    INTEGER                :: vcord_type,vcord_type2,FLAG,SUM
    REAL                   :: RELEV,ELEVFACT
    REAL                   :: XLAT,XLON,XTIME
    INTEGER                :: status ,idtyp,lati,long,dx,dy,elev, &
                              drnd,date_h,hhmm_h,oars,runn,YMD_DATE,HM
    INTEGER                :: IND055200,IND5002, IND6002,IND4208,IND4197

    INTEGER                :: iele,NELE,NELE_SFC,NVAL,NT,NELE_INFO,LN
    INTEGER                :: bit_alt,btyp_offset,btyp_offset_uni
    INTEGER                :: BKNAT,BKTYP,BKSTP
    character(len = 5)     :: BURP_TYP
    CHARACTER(LEN=9)       :: STNID,STN_RESUME,STID
    LOGICAL                :: HIRES
    INTEGER                :: NDATA,NDATA_SF
    INTEGER                :: IFLAG,BITSflagoff

    INTEGER                :: OBS_START,SAVE_OBS,OBS_HIRES,ASSIM
    INTEGER                :: IL_INDEX,IRLN,INLV,LK,VNM
    REAL                   :: PPP,OBS,OMA,OMP,OER,FGE,OBSVA,CONVFACT
    INTEGER                :: FLG,TIME,ILEMU,ILEMV,ILEMD,VCOORD_POS

    INTEGER                :: BLOCK_LIST(NBLOC_LIST),bl

    INTEGER                :: new_bktyp,post_bit,STATUS_HIRES,BIT_STATUS,FILEN
    LOGICAL                :: REGRUP,WINDS,OMA_SFC_EXIST,OMA_ALT_EXIST

    INTEGER                :: LISTE_INFO(16),LISTE_ELE(15),LISTE_ELE_SFC(15),is_in_list
    INTEGER                :: ADDSIZE,SIZE_DATA_BK


    DATA LISTE_INFO  &
       /1007,002019,007024,007025 ,005021, 005022, 008012, 013039,020010,2048,2022,33060,33062,33039,10035,10036/

    FAMILYTYPE2= 'SCRAP'
    vcord_type2=-1
    NELE_INFO=1
    NELE_SFC=0
    NELE=0
    ILEMU=11003
    ILEMV=11004
    ILEMD=11001
    ELEVFACT=0.
    BNBITSOFF=0
    BNBITSON=0
    ENFORCE_CLASSIC_SONDES=.false.
    ADDSIZE=100000
    LNMX=100000
    SELECT CASE(trim(FAMILYTYPE))
      CASE('UA')
        BURP_TYP='multi'
        vcord_type=7004

        LISTE_ELE_SFC = (/12004,11011,11012,10051,10004,12203,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE_SFC=6
        CALL BRPACMA_NML('namburp_sfc')
        NELE_SFC=NELEMS_SFC

        FAMILYTYPE2= 'UA'
        LISTE_ELE = (/12001,11001,11002,12192,10194,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=5
        ENFORCE_CLASSIC_SONDES=.false.
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
        WINDS=.TRUE.
        ADDSIZE=10000
      CASE('AI')
        BURP_TYP='uni'
        vcord_type=7004

        LISTE_ELE = (/12001,12192,11001,11002,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=4
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
        WINDS=.TRUE.
        ADDSIZE=5000
      CASE('SW')
        BURP_TYP='uni'
        vcord_type=7004

        LISTE_ELE = (/11001,11002,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
        WINDS=.TRUE.
        vcord_type2=-1
!       ADDSIZE=5000
!       ' AMVS-> ADDSIZE 600000 oct 2014 pik'
        ADDSIZE=600000
      CASE('SF','GP')
        BURP_TYP='uni'
        vcord_type=0
        NELE_SFC=7
        LISTE_ELE_SFC = (/12004,11011,11012,10051,10004,12203,15031,-1,-1,-1,-1,-1,-1,-1,-1/)

        CALL BRPACMA_NML('namburp_sfc')
        NELE_SFC=NELEMS_SFC

        FAMILYTYPE2= 'SFC'
        WINDS=.TRUE.
        IF (trim(FAMILYTYPE) == 'GP') WINDS=.FALSE.
        ILEMU=11215
        ILEMV=11216
        ILEMD=11011
        ADDSIZE=5000
      CASE('SC')
        BURP_TYP='uni'
        LISTE_ELE_SFC = (/11012,11011,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS

        FAMILYTYPE2='SCAT'
        WINDS=.TRUE.
        ILEMU=11215
        ILEMV=11216
        ILEMD=11011
        ADDSIZE=5000
      CASE('PR')
        BURP_TYP='multi'
        vcord_type=7006
        ELEVFACT=1.

        LISTE_ELE = (/11001,11002,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2

        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
        WINDS=.TRUE.
        ADDSIZE=10000
      CASE('RO')
        BURP_TYP='multi'
        vcord_type=7007
        vcord_type2=7040

        LISTE_ELE = (/15036,15037,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2

        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
        WINDS=.FALSE.
        !================GPS-RO CANNOT BE FILTERED=======
        BNBITSOFF=0
        BNBITSON=0
        !================GPS-RO CANNOT BE FILTERED=======
        NELE_INFO=16
      CASE('GO','MI','TO')
        BURP_TYP='multi'
        vcord_type=5042
        vcord_type2=2150

        LISTE_ELE = (/12163,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=1

        CALL BRPACMA_NML('namburp_tovs')
        NELE=NELEMS

        NELE_INFO=16
        WINDS=.FALSE.
        ADDSIZE=600000
    END SELECT
    LISTE_ELE    (1:NELE    )=BLISTELEMENTS(1:NELE)
    LISTE_ELE_SFC(1:NELE_SFC)=BLISTELEMENTS_SFC(1:NELE_SFC)
    if(NELE     .gt. 0)write(*,*)  ' LISTE_ELE =',LISTE_ELE
    if(NELE_SFC .gt. 0)write(*,*)  ' LISTE_ELE_SFC =',LISTE_ELE_SFC
    if(BNBITSOFF .gt. 0 .or. BNBITSON .gt.0)write(*,*)  ' BNBITSON BNBITSOFF SIZE OF CP_RPT   =',BNBITSON,BNBITSOFF,LNMX*8


    TYPE_RESUME='POSTALT'
    BN_ITEMS=1
    BITEMLIST(1)='OMA'
    CALL BRPACMA_NML('namburp_update')
    WRITE(*,*)  ' BN_ITEMS   =',BN_ITEMS
    WRITE(*,'(a12,x)') ' ITEMS TO ADD IN BURP FILE REPORTS =', BITEMLIST(1:BN_ITEMS)
    WRITE(*,'(x,a9)' ) ' BTYP OF UPDATED BURP FILE=', TYPE_RESUME

    SELECT CASE( trim(TYPE_RESUME))
      CASE("BGCKALT", "POSTALT")
        BIT_STATUS = 12 
      CASE("DERIALT")
        BIT_STATUS = 11 
    END SELECT 

    if (trim(BURP_TYP) .eq. 'uni') then
      btyp_offset=256
    else
      btyp_offset=0
    endif

    if ( TRIM(FAMILYTYPE2) .eq. 'SCAT') then
      btyp_offset= 0
      btyp_offset_uni= 256 +0
    elseif ( TRIM(FAMILYTYPE2) .eq. 'SFC') then
      btyp_offset= 0
      btyp_offset_uni= 256 +32
    elseif ( TRIM(FAMILYTYPE2) .eq. 'UA') then
      btyp_offset_uni= 256 +32
    else 
      btyp_offset_uni= -999 !set to -999 when not used
    endif


    WRITE(*,*) '----------------------------------------------------'
    WRITE(*,*) '-----------     BEGIN UPDATE_BURP     ------------'
    WRITE(*,*) 'FAMILYTYPE   =',FAMILYTYPE
    WRITE(*,*) 'BURP_TYP btyp_offset    =',BURP_TYP, btyp_offset
    WRITE(*,*) 'BURP_TYP btyp_offset_uni=',BURP_TYP, btyp_offset_uni
    WRITE(*,*) '----------------------------------------------------'


    ! initialisation

    SUM=0
    opt_missing = 'MISSING'


    Call BURP_Set_Options( &
       & REAL_OPTNAME       = opt_missing, &
       & REAL_OPTNAME_VALUE = PPMIS, &
       & CHAR_OPTNAME       = 'MSGLVL', &
       & CHAR_OPTNAME_VALUE = 'FATAL', &
       & IOSTAT             = error )

    Call BURP_Init(File_in      ,IOSTAT=error)
    !Call BURP_Init(Rpt_in,IOSTAT=error)
    Call BURP_Init(Rpt_in,CP_RPT,IOSTAT=error)
    Call BURP_Init(Block_in     ,IOSTAT=error)

    Call BURP_Init(BLOCK_OMA    ,IOSTAT=error)
    Call BURP_Init(BLOCK_OMP    ,IOSTAT=error)
    Call BURP_Init(BLOCK_OER    ,IOSTAT=error)
    Call BURP_Init(BLOCK_FGE    ,IOSTAT=error)
    Call BURP_Init(BLOCK_OMA_SFC,IOSTAT=error)
    Call BURP_Init(BLOCK_OMP_SFC,IOSTAT=error)
    Call BURP_Init(BLOCK_OER_SFC,IOSTAT=error)
    Call BURP_Init(BLOCK_FGE_SFC,IOSTAT=error)
    Call BURP_Init(BLOCK_FLG_SFC,IOSTAT=error)

    Call BURP_Init(BLOCK_FLG    ,IOSTAT=error)
    Call BURP_Init(Block_FLG_CP ,IOSTAT=error)

    Call BURP_Init(BLOCK_OBS_MUL_CP ,IOSTAT=error)
    Call BURP_Init(BLOCK_MAR_MUL_CP ,IOSTAT=error)

    Call BURP_Init(BLOCK_OBS_SFC_CP ,IOSTAT=error)
    Call BURP_Init(BLOCK_MAR_SFC_CP ,IOSTAT=error)

    ! opening file
    ! ------------
    write(*,*) 'OPENING BURP FILE FOR UPDATE = ', trim(brp_file)

    Call BURP_New(File_in, FILENAME = brp_file, &
                   & MODE    = FILE_ACC_APPEND, &
                   & IOSTAT  = error )

    ! obtain input burp file number of reports
    ! ----------------------------------------
    Call BURP_Get_Property(File_in, NRPTS=nb_rpts)
    Call BURP_Init(Rpt_in,IOSTAT=error)

    WRITE(*,*) '-----------------------------------------'
    WRITE(*,*) 'IOSTAT    =',error
    WRITE(*,*) 'NUMBER OF REPORTS IN FILE  = ',nb_rpts
    WRITE(*,*) '-----------------------------------------'

    ! scan input burp file to get all reports address
    ! -----------------------------------------------

    Allocate(address(nb_rpts))
    address(:) = 0
    count      = 0
    ref_rpt    = 0

    do
      ref_rpt = BURP_Find_Report(File_in, &
                 & REPORT      = Rpt_in, &
                 & SEARCH_FROM = ref_rpt, &
                 & IOSTAT      = error)
      Call burp_get_property(Rpt_in, STNID = stnid )
      IF ( stnid(1:2) == ">>" ) then
        STN_RESUME=stnid
        SELECT CASE(stnid)
          CASE(">>BGCKALT", ">>POSTALT")
            bit_alt=1
          CASE(">>DERIALT")
            bit_alt=2
        END SELECT 
      ENDIF

      if (ref_rpt < 0) Exit
      if (count .eq. nb_rpts) then
        write(*,*) 'UPDATE_BURP: ERROR: count = nb_rpts:',count,nb_rpts
        exit
      endif
      count = count + 1
      address(count) = ref_rpt
    end do
    write(*,'(a9,1x,a16,1x,i2)' )STN_RESUME,' bit_alt==== >  ',bit_alt

    BTYP10obs     = 291 -btyp_offset
    BTYP10obs_uni = 291 -btyp_offset_uni
    if (bit_alt .eq. 2) btyp10obs     =  BTYP10obs - 2
    if (bit_alt .eq. 2) btyp10obs_uni =  BTYP10obs_uni - 2

    BTYP10flg = 483 -btyp_offset
    BTYP10flg_uni = 483 -btyp_offset_uni
    if (bit_alt .eq. 2) BTYP10flg =  BTYP10flg  - 2
    if (bit_alt .eq. 2) BTYP10flg_uni =  BTYP10flg_uni  - 2
    BTYP10des = 160

    BTYP10inf = 96

    write(*, *)  ' NUMBER OF VALID REPORTS IN FILE = ',count
    write(*, *)  ' BTYP10obs BTYP10obs_uni         = ',BTYP10obs,BTYP10obs_uni
    BITSflagoff=0
    DO J = 1, Bnbitsoff
      BITSflagoff = IBSET ( BITSflagoff, 13-BBITOFF(J) )
    END DO

    if ( count > 0 ) then

      OBS_START=1
      SAVE_OBS=1
      DO Jo=1,obs_numHeader(obsdat)
        filen= obs_headElem_i(obsdat,OBS_OTP,Jo)
        if ( filen .eq. filenumb) then
          OBS_START=Jo
          SAVE_OBS=Jo
          exit
        endif
      END DO
      write(*, *)  '  FILE = ',trim(brp_file),' OBS_START= ',OBS_START

      ! create a new report
      Call BURP_New(Cp_rpt, ALLOC_SPACE=10*LNMX, IOSTAT=error)

      ! LOOP ON REPORTS
      REPORTS: do kk = 1, count
            

        Call BURP_Get_Report(File_in, &
                & REPORT    = Rpt_in, &
                & REF       = address(kk), &
                & IOSTAT    = error) 
        Call burp_get_property(Rpt_in, &
               STNID = stnid ,TEMPS =hhmm_h,FLGS = status ,IDTYP =idtyp,LATI = lati &
               ,LONG = long ,DX = dx ,DY = dy,ELEV=elev,DRND =drnd,DATE =date_h &
               ,OARS =oars,RUNN=runn ,IOSTAT=error)

        IF ( stnid(1:2) == ">>" ) THEN
          Call BURP_Set_Property(Rpt_in ,STNID =">>"//TYPE_RESUME)
          Call BURP_Write_Report(File_in,Rpt_in,UPDATE =.TRUE.,IOSTAT= error)
          write(*,*)  ' RESUME RECORD POSITION IN BURP FILE =',stnid,kk
          Call BURP_Copy_Header(TO=Cp_rpt,FROM=Rpt_in)
          Call BURP_Init_Report_Write(File_in,Cp_Rpt, IOSTAT=error)
          Call BURP_Delete_Report(File_in,Rpt_in, IOSTAT=error)
          Call BURP_Write_Report(File_in,Cp_rpt, IOSTAT=error)

          cycle REPORTS
        ELSE
          !write(*,*) ' UPDATING STN IN BURP FILE =',  TRIM(FAMILYTYPE),KK,stnid,lati,LONG,dx,DY,elev,idtyp
        ENDIF
        Call BURP_Copy_Header(TO=Cp_rpt,FROM=Rpt_in)
        Call BURP_Init_Report_Write(File_in,Cp_Rpt, IOSTAT=error)


        ! FIRST LOOP ON BLOCKS

        ref_blk = 0

        HIRES=.FALSE.
        REGRUP=.false.
        NDATA_SF=-1
        !WRITE(*,*)'  record number =',kk,' obs_start =',obs_start
        BLOCK_LIST(1:6)=-1
        BLOCKS0: do
          ref_blk = BURP_Find_Block(Rpt_in, &
                     & BLOCK       = Block_in, &
                     & SEARCH_FROM = ref_blk, &
                     & IOSTAT      = error)

          if (ref_blk < 0) EXIT BLOCKS0

          Call BURP_Get_Property(Block_in, &
                                 & NELE   = nbele, &
                                 & NVAL   = nvale, &
                                 & NT     = nte, &
                                 & BFAM   = bfam, &
                                 & BTYP   = btyp, &
                                 & BKTYP  = bktyp, &
                                 & BKNAT  = BKNAT, &
                                 & BKSTP  = BKSTP, &
                                 & IOSTAT = error)
          btyp10    = ishft(btyp,-5)
          if ( btyp10 - BTYP10des == 0 ) then
            Block_FLG_CP=BLOCK_IN
            BLOCK_LIST(1)=BTYP
            REGRUP=.TRUE.
          elseif ( btyp10 - btyp10obs_uni == 0 .and. bkstp <= 4 ) then
            BLOCK_OBS_SFC_CP=BLOCK_IN
            BLOCK_LIST(2)=BTYP
            NDATA_SF=0
          elseif ( btyp10 - btyp10flg_uni == 0 .and. bkstp <= 4) then
            BLOCK_MAR_SFC_CP=BLOCK_IN
            BLOCK_LIST(3)=BTYP
          elseif ( btyp10 - btyp10obs == 0 .and. bfam == 0 ) then
            BLOCK_LIST(4)=BTYP
            BLOCK_OBS_MUL_CP=BLOCK_IN
          elseif ( btyp10 - btyp10flg == 0 ) then
            BLOCK_LIST(5)=BTYP
            BLOCK_MAR_MUL_CP=BLOCK_IN
          elseif ( (btyp10 - btyp10inf == 0) .or. (btyp10 - btyp10inf == 1) ) then
            BLOCK_LIST(6)=BTYP
          else
            !WRITE(*, *)' POUR STATION bloc NON CONNU: ',STNID,ref_blk,bfam,familytype
          endif
        end do BLOCKS0
        if ( TYPE_RESUME == 'POSTALT' .or. TYPE_RESUME == 'BGCKALT') THEN
          post_bit=2
        else
          post_bit=0
        endif

        BLOCKS1: do bl=1,NBLOC_LIST

          if( BLOCK_LIST(bl) .lt. 0 )cycle
          ref_blk = BURP_Find_Block(Rpt_in, &
                               & BLOCK       = Block_in, &
                               & BTYP = BLOCK_LIST(bl), &
                               & IOSTAT      = error)

          if (ref_blk < 0) cycle BLOCKS1

          Call BURP_Get_Property(Block_in, &
                           & NELE   = nbele, &
                           & NVAL   = nvale, &
                           & NT     = nte, &
                           & BFAM   = bfam, &
                           & BTYP   = btyp, &
                           & BKTYP  = bktyp, &
                           & BKNAT  = BKNAT, &
                           & IOSTAT = error)


          ! observation block (btyp = 0100 100011X XXXX)
          !======================================================
          btyp10    = ishft(btyp,-5)
          !======================================================

          OBS_START=SAVE_OBS

          !if ( btyp10 - btyp10obs_uni == 0 .and. bfam == 0 ) then
          if ( bl .eq. 2 ) then

            NDATA_SF=0
            new_bktyp=bktyp
            if ( post_bit .gt. 0 ) then
              new_bktyp=IBSET(bktyp,post_bit)
              Call BURP_Set_Property(BLOCK_OBS_SFC_CP ,BKTYP =new_bktyp)
              Call BURP_Set_Property(BLOCK_MAR_SFC_CP ,BKTYP =new_bktyp)
            endif

            il_index=1
            KOBSN=0
            IND_eleu  = BURP_Find_Element(Block_in, ELEMENT=11215, IOSTAT=error)
            IND_elef  = BURP_Find_Element(Block_in, ELEMENT=11011, IOSTAT=error)
            !Call BURP_Delete_BLOCK(Rpt_in,BLOCK=Block_in)

            Call BURP_New(BLOCK_OMA_SFC,NELE =NBELE+2,NVAL=nvale,NT=NTE,bfam=12,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=10 &
					           ,IOSTAT = error) 
            Call BURP_New(BLOCK_OMP_SFC,NELE =NBELE+2,NVAL =nvale,NT=NTE,bfam=14,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=10 &
					           ,IOSTAT = error) 
            Call BURP_New(BLOCK_OER_SFC, NELE =NBELE+2, NVAL =nvale,NT=NTE,bfam=10,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=14 &
					           ,IOSTAT = error) 
            Call BURP_New(BLOCK_FGE_SFC, NELE =NBELE+2, NVAL =nvale,NT=NTE,bfam=10,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=15 &
					           ,IOSTAT = error) 
            OMA_SFC_EXIST=.true.
            ILEMU=11215
            ILEMV=11216
            call BURP_Set_Element( BLOCK_OMA_SFC,NELE_IND = 1,ElEMENT=ILEMU,IOSTAT=error) 
            call BURP_Set_Element( BLOCK_OMA_SFC,NELE_IND = 2,ElEMENT=ILEMV,IOSTAT=error) 

            call BURP_Set_Element( BLOCK_OMP_SFC,NELE_IND = 1,ElEMENT=ILEMU,IOSTAT=error) 
            call BURP_Set_Element( BLOCK_OMP_SFC,NELE_IND = 2,ElEMENT=ILEMV,IOSTAT=error) 

            call BURP_Set_Element( BLOCK_OER_SFC,NELE_IND = 1,ElEMENT=ILEMU,IOSTAT=error) 
            call BURP_Set_Element( BLOCK_OER_SFC,NELE_IND = 2,ElEMENT=ILEMV,IOSTAT=error) 

            call BURP_Set_Element( BLOCK_FGE_SFC,NELE_IND = 1,ElEMENT=ILEMU,IOSTAT=error) 
            call BURP_Set_Element( BLOCK_FGE_SFC,NELE_IND = 2,ElEMENT=ILEMV,IOSTAT=error) 
            do k =1,nte
              Call BURP_Set_Rval(Block_OMA_SFC,NELE_IND =1,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              Call BURP_Set_Rval(Block_OMA_SFC,NELE_IND =2,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              Call BURP_Set_Rval(Block_OMP_SFC,NELE_IND =1,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              Call BURP_Set_Rval(Block_OMP_SFC,NELE_IND =2,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              Call BURP_Set_Rval(Block_OER_SFC,NELE_IND =1,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              Call BURP_Set_Rval(Block_OER_SFC,NELE_IND =2,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              Call BURP_Set_Rval(Block_FGE_SFC,NELE_IND =1,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              Call BURP_Set_Rval(Block_FGE_SFC,NELE_IND =2,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
            end do
            il_index=2

            IF (WINDS .and. IND_eleu .lt. 0 .and. IND_elef .gt. 0) THEN
              Call BURP_RESIZE_BLOCK(BLOCK_OBS_SFC_CP,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OBS_SFC_CP,NELE_IND = nbele+1,ElEMENT=ILEMU,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OBS_SFC_CP,NELE_IND = nbele+2,ElEMENT=ILEMV,IOSTAT=error) 
              do k =1,nte
                Call BURP_Set_Rval(Block_OBS_SFC_CP,NELE_IND =nbele+1,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
                Call BURP_Set_Rval(Block_OBS_SFC_CP,NELE_IND =nbele+2,NVAL_IND =1,NT_IND = k,RVAL = PPMIS ) 
              end do

              Call BURP_RESIZE_BLOCK(BLOCK_MAR_SFC_CP,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_MAR_SFC_CP,NELE_IND = nbele+1,ElEMENT=ILEMU+200000,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_MAR_SFC_CP,NELE_IND = nbele+2,ElEMENT=ILEMV+200000,IOSTAT=error) 
              do k =1,nte
                Call BURP_Set_tblval(Block_MAR_SFC_CP,NELE_IND =nbele+1,NVAL_IND =1,NT_IND = k,tblval = 0 ) 
                Call BURP_Set_tblval(Block_MAR_SFC_CP,NELE_IND =nbele+2,NVAL_IND =1,NT_IND = k,tblval = 0 ) 
              end do
              il_index=2
              nbele=nbele +2
            endif


            elems_sfc: do IL = 1, NBELE  

              iele=-1
              iele=BURP_Get_Element(BLOCK_OBS_SFC_CP,INDEX =il,IOSTAT= error) 

              IND_ELE_MAR= BURP_Find_Element(Block_MAR_SFC_CP, ELEMENT=iele+200000, IOSTAT=error)
              if (IND_ele_mar .le. 0 ) cycle

              IND_ele  = BURP_Find_Element(BLOCK_OBS_SFC_CP, ELEMENT=iele, IOSTAT=error)

              if( OMA_SFC_EXIST .eqv.  .true.   ) then
                if (iele .ne. ILEMU .and. iele .ne. ILEMV) then
                  il_index=il_index +1
                  call BURP_Set_Element (BLOCK_OMA_SFC,NELE_IND= il_index,ElEMENT=iele,IOSTAT=error)
                  Call BURP_Set_Element (BLOCK_OMP_SFC,NELE_IND= il_index,ElEMENT=iele,IOSTAT=error)
                  Call BURP_Set_Element (BLOCK_OER_SFC,NELE_IND= il_index,ElEMENT=iele,IOSTAT=error)
                  Call BURP_Set_Element (BLOCK_FGE_SFC,NELE_IND= il_index,ElEMENT=iele,IOSTAT=error)
                endif
              endif
              k=1
              is_in_list=-1
              is_in_list=FIND_INDEX(LISTE_ELE_SFC,iele)
              if (is_in_list .lt. 0   .and. iele  .ne. ILEMU .and. iele .ne. ILEMV) cycle ELEMS_SFC
!pikk         do k=1,nte
              IND_ele_stat  = BURP_Find_Element(BLOCK_OMA_SFC, ELEMENT=iele, IOSTAT=error)
              Call BURP_Set_Rval(Block_OMA_SFC, NELE_IND =IND_ELE_stat ,NVAL_IND =1 , NT_IND  = k , RVAL = PPMIS)
              Call BURP_Set_Rval(Block_OMP_SFC, NELE_IND =IND_ELE_stat ,NVAL_IND =1 , NT_IND  = k , RVAL = PPMIS)
              Call BURP_Set_Rval(Block_OER_SFC, NELE_IND =IND_ELE_stat ,NVAL_IND =1 , NT_IND  = k , RVAL = PPMIS)
              Call BURP_Set_Rval(Block_FGE_SFC, NELE_IND =IND_ELE_stat ,NVAL_IND =1 , NT_IND  = k , RVAL = PPMIS) 

              IFLAG =  BURP_Get_Tblval(Block_MAR_SFC_CP,NELE_IND = IND_ele_mar,NVAL_IND = 1, NT_IND = k)
              OBSVA =  BURP_Get_Rval  (Block_OBS_SFC_CP,NELE_IND = IND_ele    ,NVAL_IND = 1, NT_IND = k)
              if (OBSVA .eq. PPMIS .and. iele .ne. ILEMU  .and. iele .ne. ILEMV ) cycle
              if(iand(iflag,BITSflagoff) .ne.0) cycle

              if (OBS_START .gt. obs_numHeader(obsdat) ) write(*,*)  ' debordement  surface OBS_START=',OBS_START
              if (OBS_START .gt. obs_numHeader(obsdat))  cycle

              IRLN=obs_headElem_i(obsdat,OBS_RLN,OBS_START )
              INLV=obs_headElem_i(obsdat,OBS_NLV,OBS_START )

              IND_ELE_stat  = BURP_Find_Element(BLOCK_OMA_SFC, ELEMENT=iele, IOSTAT=error)
              STID=obs_elem_c(obsdat,'STID',obs_start)
              if ( STID .ne. stnid ) cycle

              OBSDATA: do LK=IRLN,IRLN+INLV-1

                VNM=obs_bodyElem_i(obsdat,OBS_VNM ,LK)
                ASSIM=obs_bodyElem_i(obsdat,OBS_ASS,LK)
                if(  VNM .eq. iele ) then 
                  OBS=obs_bodyElem_r(obsdat,OBS_VAR,LK)
                  OMA=obs_bodyElem_r(obsdat,OBS_OMA ,LK)
                  OMP=obs_bodyElem_r(obsdat,OBS_OMP ,LK)
                  OER=obs_bodyElem_r(obsdat,OBS_OER ,LK)
                  FGE=obs_bodyElem_r(obsdat,OBS_HPHT,LK)
                  FLG=obs_bodyElem_i(obsdat,OBS_FLG ,LK)
                  KOBSN= KOBSN + 1
                  SUM=SUM +1
                  Call BURP_Set_Rval( Block_OER_SFC, NELE_IND =IND_ele_stat ,NVAL_IND =1,NT_IND = k , RVAL = OER   ) 
                  Call BURP_Set_Rval( Block_FGE_SFC, NELE_IND =IND_ele_stat ,NVAL_IND =1,NT_IND = k , RVAL = FGE  ) 

                  IND_ELE_stat  = BURP_Find_Element(BLOCK_OMA_SFC, ELEMENT=iele, IOSTAT=error)
                  Call BURP_Set_Rval( Block_OMA_SFC, NELE_IND =IND_ele_stat ,NVAL_IND =1,NT_IND = k , RVAL = OMA)

                  IND_ELE_stat  = BURP_Find_Element(BLOCK_OMP_SFC, ELEMENT=iele, IOSTAT=error)
                  Call BURP_Set_Rval( Block_OMP_SFC, NELE_IND =IND_ele_stat ,NVAL_IND =1,NT_IND = k , RVAL = OMP)

                  Call BURP_Set_tblval(Block_MAR_SFC_CP,NELE_IND =IND_ele_mar,NVAL_IND =1,NT_IND = k ,TBLVAL= FLG) 

                  OBS=obs_bodyElem_r(obsdat,OBS_VAR,LK)
                  IND_ele  = BURP_Find_Element(BLOCK_OBS_SFC_CP, ELEMENT=iele, IOSTAT=error)
                  Call BURP_Set_Rval(Block_OBS_SFC_CP,NELE_IND =IND_ele,NVAL_IND =1,NT_IND = k,RVAL = OBS ) 

                  exit
                endif

              end do  OBSDATA

!pikk         end do

            end do  elems_sfc


            do item=1,BN_ITEMS

              if ( BITEMLIST(item) .eq. 'OMA') then
                Call BURP_Reduce_Block(BLOCK_OMA_SFC, NEW_NELE =il_index )
                Call BURP_Write_Block( CP_RPT, BLOCK_OMA_SFC,&
                ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
                cycle
              endif
              if ( BITEMLIST(item) .eq. 'OMP') then
                Call BURP_Reduce_Block(BLOCK_OMP_SFC, NEW_NELE =il_index )
                Call BURP_Write_Block( CP_RPT, BLOCK_OMP_SFC,&
                ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
                cycle
              endif
              if ( BITEMLIST(item) .eq. 'OER') then
                Call BURP_Reduce_Block(BLOCK_OER_SFC, NEW_NELE =il_index )
                Call BURP_Write_Block( CP_RPT, BLOCK_OER_SFC,&
                ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
                cycle
              endif
              if ( BITEMLIST(item) .eq. 'FGE') then
                Call BURP_Reduce_Block(BLOCK_FGE_SFC, NEW_NELE =il_index )
                Call BURP_Write_Block( CP_RPT, BLOCK_FGE_SFC,&
                ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
                cycle
              endif

            end do

            Call BURP_Set_Property(BLOCK_OBS_SFC_CP ,BFAM =0)
            Call BURP_Set_Property(BLOCK_MAR_SFC_CP ,BFAM =0)

            Call BURP_Write_Block( CP_RPT, BLOCK_OBS_SFC_CP,&
                                   ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
            Call BURP_Write_Block( CP_RPT, BLOCK_MAR_SFC_CP,&
                                   ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .FALSE., IOSTAT= error) 
            IF ( KOBSN .gt. 0 ) THEN
              STATUS=obs_headElem_i(obsdat,OBS_ST1,OBS_START)
              STATUS=IBSET(STATUS,BIT_STATUS)
              Call BURP_Set_Property(CP_RPT ,FLGS =STATUS)
            ENDIF

            SAVE_OBS=OBS_START
            NDATA_SF=KOBSN
            if (BLOCK_LIST(4) .eq. -1 .and.  KOBSN .gt. 0 ) THEN
              SAVE_OBS=SAVE_OBS+1
              OBS_START=OBS_START+1
            endif

          endif  ! bl.eq.2


          !if ( btyp10 - btyp10obs == 0 .and. bfam == 0 ) then
          if ( bl .eq. 4 ) then

            ILEMU=11003
            ILEMV=11004
            new_bktyp=bktyp
            if ( post_bit .gt.0 ) then
              new_bktyp=IBSET(bktyp,post_bit)
              Call BURP_Set_Property(BLOCK_OBS_MUL_CP ,BKTYP =new_bktyp)
              Call BURP_Set_Property(BLOCK_MAR_MUL_CP ,BKTYP =new_bktyp)
            endif
            OBSN=OBS_START
            !if( idtyp .eq. 168) print *, ' bobossmi donnees OBS_START save obs=',OBS_START,SAVE_OBS
            NVAL=NVALE ;  NT=NTE

            il_index=1
            Call BURP_New(BLOCK_OMA, NELE =1, NVAL =nvale,NT=NTE,bfam=12,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=10 &
                  ,IOSTAT = error) 
            Call BURP_New(BLOCK_OMP, NELE =1, NVAL =nvale,NT=NTE,bfam=14,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=10 &
                  ,IOSTAT = error) 
            Call BURP_New(BLOCK_OER, NELE =1, NVAL =nvale,NT=NTE,bfam=10,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=14 &
                  ,IOSTAT = error) 
            Call BURP_New(BLOCK_FGE, NELE =1, NVAL =nvale,NT=NTE,bfam=10,BKNAT=BKNAT,BKTYP=new_bktyp,BKSTP=15 &
                  ,IOSTAT = error) 

            VCOORD_POS=0
            IND_VCOORD  = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=vcord_type,   IOSTAT=error)
            IF ( IND_VCOORD .gt. 0 ) then
              call BURP_Set_Element(BLOCK_OMA,NELE_IND= 1,ElEMENT=vcord_type,IOSTAT=error) 
              call BURP_Set_Element(BLOCK_OMP,NELE_IND= 1,ElEMENT=vcord_type,IOSTAT=error) 
              call BURP_Set_Element(BLOCK_OER,NELE_IND= 1,ElEMENT=vcord_type,IOSTAT=error) 
              call BURP_Set_Element(BLOCK_FGE,NELE_IND= 1,ElEMENT=vcord_type,IOSTAT=error) 
              VCOORD_POS=1
            ENDIF
            IND_VCOORD2  = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=vcord_type2,   IOSTAT=error)
            IF ( IND_VCOORD2 .gt. 0 ) then
              call BURP_Set_Element(BLOCK_OMA,NELE_IND= 1,ElEMENT=vcord_type2,IOSTAT=error) 
              call BURP_Set_Element(BLOCK_OMP,NELE_IND= 1,ElEMENT=vcord_type2,IOSTAT=error) 
              call BURP_Set_Element(BLOCK_OER,NELE_IND= 1,ElEMENT=vcord_type2,IOSTAT=error) 
              call BURP_Set_Element(BLOCK_FGE,NELE_IND= 1,ElEMENT=vcord_type2,IOSTAT=error) 
              VCOORD_POS=1
              IND_VCOORD=IND_VCOORD2
            ENDIF
            if (IND_VCOORD == -1 .and. IND_VCOORD2 == -1) then
              !WRITE(*,*) '  PAS DE COORDONNEE VERTICALE famille ',trim(FAMILYTYPE)
              il_index=0
            endif
            VCOORD = -999.

            IND_eleu  = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=ILEMU, IOSTAT=error)
            IND_elef  = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=ILEMD, IOSTAT=error)

            OMA_ALT_EXIST=.false.
            if(WINDS .and. IND_eleu .lt. 0 .and. IND_elef .gt. 0) then
              Call BURP_RESIZE_BLOCK(BLOCK_OMA,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OMA,NELE_IND = VCOORD_POS+1,ElEMENT=ILEMU,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OMA,NELE_IND = VCOORD_POS+2,ElEMENT=ILEMV,IOSTAT=error) 
              OMA_ALT_EXIST=.true.

              Call BURP_RESIZE_BLOCK(BLOCK_OMP,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OMP,NELE_IND = VCOORD_POS+1,ElEMENT=ILEMU,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OMP,NELE_IND = VCOORD_POS+2,ElEMENT=ILEMV,IOSTAT=error) 

              Call BURP_RESIZE_BLOCK(BLOCK_OER,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OER,NELE_IND = VCOORD_POS+1,ElEMENT=ILEMU,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OER,NELE_IND = VCOORD_POS+2,ElEMENT=ILEMV,IOSTAT=error) 

              Call BURP_RESIZE_BLOCK(BLOCK_FGE,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_FGE,NELE_IND = VCOORD_POS+1,ElEMENT=ILEMU,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_FGE,NELE_IND = VCOORD_POS+2,ElEMENT=ILEMV,IOSTAT=error) 

              Call BURP_RESIZE_BLOCK(BLOCK_OBS_MUL_CP,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OBS_MUL_CP,NELE_IND = nbele+1,ElEMENT=ILEMU,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_OBS_MUL_CP,NELE_IND = nbele+2,ElEMENT=ILEMV,IOSTAT=error) 

              Call BURP_RESIZE_BLOCK(BLOCK_MAR_MUL_CP,ADD_NELE = 2 ,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_MAR_MUL_CP,NELE_IND = nbele+1,ElEMENT=ILEMU+200000,IOSTAT=error) 
              call BURP_Set_Element( BLOCK_MAR_MUL_CP,NELE_IND = nbele+2,ElEMENT=ILEMV+200000,IOSTAT=error) 

              do k=1,nte
                do jj=1,nvale
                  Call BURP_Set_Rval( Block_OMA,  NELE_IND =VCOORD_POS+1 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 
                  Call BURP_Set_Rval( Block_OMA,  NELE_IND =VCOORD_POS+2 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 
                  Call BURP_Set_Rval( Block_OMP,  NELE_IND =VCOORD_POS+1 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 
                  Call BURP_Set_Rval( Block_OMP,  NELE_IND =VCOORD_POS+2 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 
                  Call BURP_Set_Rval( Block_OER,  NELE_IND =VCOORD_POS+1 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 
                  Call BURP_Set_Rval( Block_OER,  NELE_IND =VCOORD_POS+2 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 
                  Call BURP_Set_Rval( Block_FGE,  NELE_IND =VCOORD_POS+1 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 
                  Call BURP_Set_Rval( Block_FGE,  NELE_IND =VCOORD_POS+2 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS  ) 

                  Call BURP_Set_Rval(  BLOCK_OBS_MUL_CP, NELE_IND =nbele+1 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS) 
                  Call BURP_Set_Rval(  BLOCK_OBS_MUL_CP, NELE_IND =nbele+2 ,NVAL_IND =jj , NT_IND  = k , RVAL = PPMIS) 
                  Call BURP_Set_tblval(BLOCK_MAR_MUL_CP, NELE_IND =nbele+1 ,NVAL_IND =jj , NT_IND  = k , TBLVAL = 0  ) 
                  Call BURP_Set_tblval(BLOCK_MAR_MUL_CP, NELE_IND =nbele+2 ,NVAL_IND =jj , NT_IND  = k , TBLVAL = 0  ) 
                end do
              end do
              nbele=nbele+2

              il_index=il_index+2
            endif
            !Call BURP_Delete_BLOCK(Rpt_in,BLOCK=Block_in)

            ! LAT LON TIME IN DATA BLOCK
            IND_LAT   = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=5001, IOSTAT=error)
            IND_LON   = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=6001, IOSTAT=error)
            IND_TIME  = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=4015, IOSTAT=error)
            if (IND_LAT .gt. 0 .and. IND_LON .gt. 0 .and. IND_TIME .gt. 0 ) HIRES=.true.
            if(ENFORCE_CLASSIC_SONDES .eqv. .true.) hires=.false.

            !print * , ' hires =true ? ndata_sf ',stnid,hires,NDATA_SF

            if ( HIRES .AND. NDATA_SF .gt.0 ) OBS_START =OBS_START +1
            OBSN=OBS_START
            STATUS_HIRES=obs_headElem_i(obsdat,OBS_ST1,OBS_START )

            regrup_LOOP: do k=1,nte
              KOBSN=0

              levels: do j=1,nvale

                !pikpik
                if(HIRES)KOBSN=0
                !pikpik

                elems: do IL = 1, NBELE  

                  iele=-1
                  iele=BURP_Get_Element(BLOCK_OBS_MUL_CP,INDEX =il,IOSTAT= error) 

                  IND_ELE_MAR= BURP_Find_Element(Block_MAR_MUL_CP, ELEMENT=iele+200000, IOSTAT=error)
                  if (IND_ele_mar .lt.  0 ) cycle

                  IND_ele       = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=iele, IOSTAT=error)
                  if (IND_ele .eq. IND_LAT  .and. hires ) cycle
                  if (IND_ele .eq. IND_LON  .and. hires ) cycle
                  if (IND_ele .eq. IND_TIME .and. hires ) cycle
                  IND_ELE_STAT=-1
                  IND_ele_STAT  = BURP_Find_Element(BLOCK_OMA, ELEMENT=iele, IOSTAT=error)

                  if(j .eq. 1 .and. il .ne. ind_vcoord .and. IND_ELE_STAT .lt. 1  ) then
                  il_index=il_index +1
                  Call BURP_RESIZE_BLOCK(BLOCK_OMA,ADD_NELE = 1 ,IOSTAT=error) 
                  call BURP_Set_Element (BLOCK_OMA,NELE_IND = il_index,ElEMENT=iele,IOSTAT=error)

                  Call BURP_RESIZE_BLOCK(BLOCK_OMP,ADD_NELE = 1 ,IOSTAT=error) 
                  call BURP_Set_Element (BLOCK_OMP,NELE_IND = il_index,ElEMENT=iele,IOSTAT=error)

                  Call BURP_RESIZE_BLOCK(BLOCK_OER,ADD_NELE = 1 ,IOSTAT=error) 
                  call BURP_Set_Element (BLOCK_OER,NELE_IND = il_index,ElEMENT=iele,IOSTAT=error)

                  Call BURP_RESIZE_BLOCK(BLOCK_FGE,ADD_NELE = 1 ,IOSTAT=error) 
                  call BURP_Set_Element (BLOCK_FGE,NELE_IND = il_index,ElEMENT=iele,IOSTAT=error)

                  do ki=1,nte
                    do jj=1,nvale
                      Call BURP_Set_Rval( Block_OMA, NELE_IND =il_index ,NVAL_IND =jj , NT_IND  = ki, RVAL = PPMIS ) 
                      Call BURP_Set_Rval( Block_OMP, NELE_IND =il_index ,NVAL_IND =jj , NT_IND  = ki, RVAL = PPMIS ) 
                      Call BURP_Set_Rval( Block_OER, NELE_IND =il_index ,NVAL_IND =jj , NT_IND  = ki, RVAL = PPMIS ) 
                      Call BURP_Set_Rval( Block_FGE, NELE_IND =il_index ,NVAL_IND =jj , NT_IND  = ki, RVAL = PPMIS ) 
                    end do
                  end do
                endif
                VCOORD =  BURP_Get_Rval(BLOCK_OBS_MUL_CP, &
                                      &   NELE_IND = IND_VCOORD, &
                                      &   NVAL_IND = j, &
                                      &   NT_IND   = k)
                IF (il .eq. IND_VCOORD) THEN
                  Call BURP_Set_Rval( Block_OMA, NELE_IND =1 ,NVAL_IND =j , NT_IND  = k , RVAL = VCOORD  ) 
                  Call BURP_Set_Rval( Block_OMP, NELE_IND =1 ,NVAL_IND =j , NT_IND  = k , RVAL = VCOORD  ) 
                  Call BURP_Set_Rval( Block_OER, NELE_IND =1 ,NVAL_IND =j , NT_IND  = k , RVAL = VCOORD  ) 
                  Call BURP_Set_Rval( Block_FGE, NELE_IND =1 ,NVAL_IND =j , NT_IND  = k , RVAL = VCOORD  ) 
                ENDIF

                IND_ele       = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=iele, IOSTAT=error)
                !if ( kk .lt. obs_headElem_i(obsdat,OBS_IDO,OBSN) ) print *, ' kk OBS_IDO cycle =',kk, obs_headElem_i(obsdat,OBS_IDO,OBSN)
                !if ( kk .lt. obs_headElem_i(obsdat,OBS_IDO,OBSN) ) cycle elems

                is_in_list=-1
                is_in_list=FIND_INDEX(LISTE_ELE,iele)
                if (is_in_list .lt. 0   .and. iele  .ne. ILEMU .and. iele .ne. ILEMV)cycle

                  IFLAG =  BURP_Get_Tblval(Block_MAR_MUL_CP,NELE_IND = IND_ELE_MAR,NVAL_IND = J, NT_IND = k)
                  OBSVA =  BURP_Get_Rval  (Block_OBS_MUL_CP,NELE_IND = IND_ele    ,NVAL_IND = J, NT_IND = k)
                  !if( idtyp .eq. 168) print * ,' bobossmi avant obsva iflag iele stnid =', IND_ele,j,k,iele,stnid,obsva,iflag,BITSflagoff,iand(iflag,BITSflagoff)
                  if(iand(iflag,BITSflagoff) .ne.0) CYCLE ELEMS     

                  OBSVA =  BURP_Get_Rval  (Block_OBS_MUL_CP,NELE_IND = IND_ele    ,NVAL_IND = J, NT_IND = k)
                  !if( idtyp .eq. 168) print * , ' bobossmi avant vcoord obsva    stnid =',  VCOORD,OBSVA,stnid

                  if (VCOORD .eq. PPMIS ) CYCLE ELEMS
                  if (OBSVA .eq. PPMIS .and. iele .ne. ILEMU  .and. iele .ne. ILEMV ) CYCLE ELEMS      

                  if (OBSN .gt. obs_numHeader(obsdat)) write(*,*) ' debordement  altitude OBSN=',OBSN
                  if (OBSN .gt. obs_numHeader(obsdat))  cycle
                  IRLN=obs_headElem_i(obsdat,OBS_RLN,OBSN)
                  INLV=obs_headElem_i(obsdat,OBS_NLV,OBSN)
                  TIME=obs_headElem_i(obsdat,OBS_ETM,OBSN)
                  STID=obs_elem_c(obsdat,'STID',OBSN)
                  if ( STID .ne. stnid ) cycle

                  IND_ELE_stat  = BURP_Find_Element(BLOCK_OMA, ELEMENT=iele, IOSTAT=error)
                  IND_ELE       = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=iele, IOSTAT=error)
                  IND_eleu      = BURP_Find_Element(BLOCK_OBS_MUL_CP, ELEMENT=ILEMU, IOSTAT=error)
                  convfact=1.
                  if (iele .eq. 10194) convfact=1./RG
                  do LK=IRLN,IRLN+INLV-1
                    ASSIM=obs_bodyElem_i(obsdat,OBS_ASS,LK)
                    VNM  =obs_bodyElem_i(obsdat,OBS_VNM,LK)
                    PPP  =obs_bodyElem_r(obsdat,OBS_PPP,LK) - (ELEV-400.)*ELEVFACT
                    if( abs( VCOORD -  PPP) .lt. .01  .and.  VNM .eq. iele  ) then 
                      OBS=obs_bodyElem_r(obsdat,OBS_VAR,LK)*convfact
                      OMA=obs_bodyElem_r(obsdat,OBS_OMA,LK)
                      OMP=obs_bodyElem_r(obsdat,OBS_OMP,LK)
                      OER=obs_bodyElem_r(obsdat,OBS_OER,LK)
                      FGE=obs_bodyElem_r(obsdat,OBS_HPHT,LK)
                      FLG=obs_bodyElem_i(obsdat,OBS_FLG,LK)
                      KOBSN= KOBSN + 1
                      IND_ELE_stat  = BURP_Find_Element(BLOCK_OMA, ELEMENT=iele, IOSTAT=error)
                      if  ( OMA .ne. PPMIS ) then
                        OMA=OMA*convfact
                      endif
                      Call BURP_Set_Rval(Block_OMA,  NELE_IND =IND_ele_stat ,NVAL_IND =j , NT_IND  = k , RVAL = OMA )

                      !if(trim(familytype) .eq. 'TO' )print *,' bingo  stnid kk vnm ppp flg omp ',stnid,kk,vnm,ppp,flg,omp,oma
                      SUM=SUM +1
                      IND_ELE_stat  = BURP_Find_Element(BLOCK_OMP, ELEMENT=iele, IOSTAT=error)
                      if  ( OMP .ne. PPMIS ) then
                        OMP=OMP*convfact
                      endif
                      Call BURP_Set_Rval(  Block_OMP,  NELE_IND =IND_ele_stat ,NVAL_IND =j , NT_IND  = k , RVAL = OMP)

                      Call BURP_Set_Rval(  Block_OER,  NELE_IND =IND_ele_stat ,NVAL_IND =j , NT_IND  = k , RVAL = OER  ) 

                      Call BURP_Set_Rval(  Block_FGE,  NELE_IND =IND_ele_stat ,NVAL_IND =j , NT_IND  = k , RVAL = FGE ) 

                      IND_ele_mar  = BURP_Find_Element(Block_MAR_MUL_CP, ELEMENT=iele+200000, IOSTAT=error)
                      Call BURP_Set_tblval(Block_MAR_MUL_CP,NELE_IND =IND_ELE_MAR ,NVAL_IND =j  , NT_IND  = k,TBLVAL = FLG )
                      IND_ele  = BURP_Find_Element(Block_OBS_MUL_CP, ELEMENT=iele, IOSTAT=error)
                      Call BURP_Set_Rval(Block_OBS_MUL_CP,NELE_IND =IND_ele,NVAL_IND =j,NT_IND = k,RVAL = OBS) 

                      EXIT

                    endif
                  end do 

                  IF (HIRES .and. KOBSN .gt. 0 ) THEN
                    STATUS=obs_headElem_i(obsdat,OBS_ST1,OBSN )
                    STATUS_HIRES=ior(STATUS_HIRES,STATUS)
                  ENDIF

                end do ELEMS

                IF (HIRES .and. KOBSN .gt. 0 ) OBSN=OBSN +1

              end do LEVELS

              if ( REGRUP .and. KOBSN .gt. 0   )  then
                STATUS=obs_headElem_i(obsdat,OBS_ST1,OBS_START )
                STATUS=IBSET(STATUS,BIT_STATUS)
                ind055200 = BURP_Find_Element(Block_FLG_CP, ELEMENT=055200, IOSTAT=error)
                Call BURP_Set_tblval( Block_FLG_CP, NELE_IND =ind055200,NVAL_IND =1,NT_IND = k ,TBLVAL = STATUS ) 
                OBSN=OBSN +1
                OBS_START=OBS_START +1
              endif

            end do regrup_LOOP

            IF (HIRES .and. KOBSN .gt. 0 .and. .not. regrup ) THEN
              STATUS=obs_headElem_i(obsdat,OBS_ST1,OBS_START)
!pik 8-2014   STATUS=IBSET(STATUS,BIT_STATUS)
              STATUS_HIRES=IBSET(STATUS_HIRES,BIT_STATUS)
              Call BURP_Set_Property(CP_RPT ,FLGS =STATUS_HIRES)
            ENDIF
            IF (HIRES )OBS_START=OBSN
            IF (HIRES )SAVE_OBS=OBS_START
            IF (REGRUP)OBS_START=OBSN

            IF ( .not. HIRES .and. .not. regrup .and. KOBSN .gt. 0 ) THEN
              STATUS=obs_headElem_i(obsdat,OBS_ST1,OBS_START)
              STATUS=IBSET(STATUS,BIT_STATUS)
              OBS_START=OBSN +1
              OBSN=OBSN +1
              Call BURP_Set_Property(CP_RPT ,FLGS =STATUS)
            ENDIF
            IF ( .not. HIRES .and. .not. regrup .and. KOBSN .eq. 0 ) THEN
              write(*,*) ' KOBSN=0  stnid',stnid
            ENDIF
            IF ( .not. HIRES .and.  regrup .and. KOBSN .eq. 0 ) THEN
              write(*,*)' KOBSN=0 regrup stnid',kk,stnid,obsn,obs_numHeader(obsdat)
            ENDIF

            IF (REGRUP) SAVE_OBS=OBS_START

            Call BURP_Reduce_Block(BLOCK_OMA, NEW_NELE =il_index )
            Call BURP_Reduce_Block(BLOCK_OMP, NEW_NELE =il_index )
            Call BURP_Reduce_Block(BLOCK_OER, NEW_NELE =il_index )
            Call BURP_Reduce_Block(BLOCK_FGE, NEW_NELE =il_index )

            Call BURP_Set_Property(BLOCK_OBS_MUL_CP ,BFAM =0)
            Call BURP_Set_Property(BLOCK_MAR_MUL_CP ,BFAM =0)
            Call BURP_Write_Block( CP_RPT, BLOCK_OBS_MUL_CP,&
                      ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
            Call BURP_Write_Block( CP_RPT, BLOCK_MAR_MUL_CP,&
                      ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .FALSE., IOSTAT= error) 

            do item=1,BN_ITEMS

              if ( BITEMLIST(item) .eq. 'OMA') then
                Call BURP_Write_Block( CP_RPT, BLOCK_OMA,&
                          ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
              endif
              if ( BITEMLIST(item) .eq. 'OMP') then
                Call BURP_Write_Block( CP_RPT, BLOCK_OMP,&
                          ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
              endif
              if ( BITEMLIST(item) .eq. 'OER') then
                Call BURP_Write_Block( CP_RPT, BLOCK_OER,&
                          ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
              endif
              if ( BITEMLIST(item) .eq. 'FGE') then
                Call BURP_Write_Block( CP_RPT, BLOCK_FGE,&
                          ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .TRUE., IOSTAT= error) 
              endif

            end do

            if (regrup )    OBS_START=OBSN
            if( .not. hires)SAVE_OBS=OBS_START

          end if  ! bl.eq.4

          if ( bl .eq. 6 ) then
            Call BURP_Write_Block( CP_RPT, BLOCK_in, ENCODE_BLOCK = .FALSE., CONVERT_BLOCK = .FALSE., IOSTAT= error) 
          endif

          ! descriptor block (btyp = 0010 100000X XXXX) 

          BTYP10des = 160

          !if ( BTYP10 - BTYP10des == 0 ) then
          if (  bl .eq. 1 ) then
            OBS_START=SAVE_OBS
          end if

          !==================== IASI  SPECIAL BLOCK==================
          if ( (BTYP .eq. 9217 .or. BTYP .eq. 15361) .and.  IDTYP .eq. 186   ) then
            Call BURP_Write_Block( CP_RPT, BLOCK_in, ENCODE_BLOCK = .FALSE., CONVERT_BLOCK = .FALSE., IOSTAT= error) 
          endif
          !==================== IASI  SPECIAL BLOCK==================

        end do BLOCKS1

        if (  REGRUP )  then
          Call BURP_Write_Block( CP_RPT, Block_FLG_CP, ENCODE_BLOCK = .TRUE., CONVERT_BLOCK = .FALSE.)
        endif

        Call BURP_Delete_Report(File_in,Rpt_in, IOSTAT=error)
        Call BURP_Write_Report(File_in,CP_RPT,IOSTAT= error) 

      end do REPORTS

    end if

    Deallocate(address)

    Call BURP_Free(Rpt_in,CP_RPT,IOSTAT=error)
    Call BURP_Free(Block_in,     IOSTAT=error)
    Call BURP_Free(Block_OMA,    IOSTAT=error)
    Call BURP_Free(Block_OMP,    IOSTAT=error)
    Call BURP_Free(Block_OER,    IOSTAT=error)
    Call BURP_Free(Block_FGE,    IOSTAT=error)
    Call BURP_Free(Block_OMA_SFC,IOSTAT=error)
    Call BURP_Free(Block_OMP_SFC,IOSTAT=error)
    Call BURP_Free(Block_OER_SFC,IOSTAT=error)
    Call BURP_Free(Block_FGE_SFC,IOSTAT=error)
    Call BURP_Free(Block_FLG_SFC,IOSTAT=error)
    Call BURP_Free(Block_FLG    ,IOSTAT=error)
    Call BURP_Free(Block_FLG_CP ,IOSTAT=error)
    Call BURP_Free(Block_MAR_MUL_CP ,IOSTAT=error)
    Call BURP_Free(Block_MAR_SFC_CP ,IOSTAT=error)
    Call BURP_Free(Block_OBS_MUL_CP ,IOSTAT=error)
    Call BURP_Free(Block_OBS_SFC_CP ,IOSTAT=error)
    Call BURP_Free(File_in,      IOSTAT=error)

    write(*,*) ' BURPFILE  UPDATED SUM = ',trim(brp_file),SUM

  END SUBROUTINE UPDATE_BURP



  SUBROUTINE BRPACMA_NML(NML_SECTION) 19

    INTEGER*4          :: NULNAM,IER,FNOM,FCLOS
    CHARACTER *256     :: NAMFILE
    CHARACTER(len = *) :: NML_SECTION

    NAMELIST /NAMBURP_FILTER_CONV/NELEMS,    BLISTELEMENTS,    BNBITSOFF,BBITOFF,BNBITSON,BBITON,ENFORCE_CLASSIC_SONDES
    NAMELIST /NAMBURP_FILTER_SFC/ NELEMS_SFC,BLISTELEMENTS_SFC,BNBITSOFF,BBITOFF,BNBITSON,BBITON
    NAMELIST /NAMBURP_FILTER_TOVS/NELEMS,BLISTELEMENTS,BNBITSOFF,BBITOFF,BNBITSON,BBITON
    NAMELIST /NAMBURP_UPDATE/BN_ITEMS, BITEMLIST,TYPE_RESUME


    NAMFILE=trim("flnml")
    nulnam=0
    IER=FNOM(NULNAM,NAMFILE,'R/O',0)
    WRITE(*,*) ' READ NML_SECTION =',trim(NML_SECTION)

    SELECT CASE(trim(NML_SECTION))
      CASE( 'namburp_sfc')
        READ(NULNAM,NML=NAMBURP_FILTER_SFC)
      CASE( 'namburp_conv')
        READ(NULNAM,NML=NAMBURP_FILTER_CONV)
      CASE( 'namburp_tovs')
        READ(NULNAM,NML=NAMBURP_FILTER_TOVS)
      CASE( 'namburp_update')
        READ(NULNAM,NML=NAMBURP_UPDATE)
    END SELECT

    ier=FCLOS(NULNAM)
  END SUBROUTINE BRPACMA_NML



  SUBROUTINE READBURP(obsdat,familytype,brp_file,FILENUMB) 1,57

    !***********************************************************************
    !
    !**ID READBURP -- SELECT VARIABLES RELATIVE TO AIRS IN BURP FILE
    !
    !       AUTHOR:   P. KOCLAS (CMDA/SMC) May 2011
    !
    !       REVISION:
    !                 S. MACPHERSON (ARMA) Oct 2013
    !                  -- add 'GP' family (ground-based GPS)
    !                 P. KOCLAS (CMDA) Oct 2014
    !                  -- Changed VCOORD Dimensions 
    !                  -- add VCORD array  to allow grouped SW or AI
    !
    !       OBJECT: READ CMC BURP FILE 
    !
    !          WHEN SEARCHING FOR A SPECIFIC BLOCK BY ITS BTYP, VALUES OF
    !          BIT 0 TO 3 ARE IRRELEVANT WHILE BIT 4 IS 0 FOR GLOBAL AND 1
    !          FOR REGIONAL MODEL. HERE, WE SEARCH BLOCK BY THEIR FIRST
    !          10 BITS (BIT 5 TO 14).
    !
    !       ARGUMENTS:
    !               INPUT:
    !                      -BRP_FILE  : NAME OF BURP FILE
    !
    !
    !***********************************************************************

    IMPLICIT NONE
    CHARACTER(LEN=128)     :: BRP_FILE
    INTEGER                :: FILENUMB
    CHARACTER *2           :: FAMILYTYPE
    
    type (struct_obs), intent(inout) :: obsdat
    
    TYPE(BURP_FILE)        :: FILE_IN
    TYPE(BURP_RPT)         :: RPT_IN
    TYPE(BURP_BLOCK)       :: BLOCK_IN
    
    CHARACTER(LEN=5)       :: FAMILYTYPE2
    CHARACTER(LEN=9)       :: OPT_MISSING
    INTEGER                :: BTYP,BFAM,BKSTP,BTYP10,BTYP10_uni,BTYP10FLG_uni,BTYP10obs_uni 
    INTEGER                :: BTYP10DES,BTYP10INF,BTYP10OBS,BTYP10FLG

    INTEGER                :: NB_RPTS,REF_RPT,REF_BLK,COUNT
    INTEGER, ALLOCATABLE   :: ADDRESS(:)

    REAL   , ALLOCATABLE   :: OBSVALUE(:,:,:),OBSVALUE_SFC(:,:,:)
    REAL   , ALLOCATABLE   :: OBSERV  (:,:),    OBSERV_SFC(:,:)

    INTEGER, ALLOCATABLE   :: QCFLAG  (:,:,:),  QCFLAG_SFC(:,:,:)
    INTEGER, ALLOCATABLE   :: QCFLAGS (:,:),   QCFLAGS_SFC(:,:)

    REAL   , ALLOCATABLE   :: VCOORD  (:,:),  VCOORD_SFC(:)
    REAL   , ALLOCATABLE   :: VCORD   (:)

    INTEGER, ALLOCATABLE   :: LAT(:),LON(:),HHMM(:),DATE(:),GLBFLAG(:)
    REAL   , ALLOCATABLE   :: HLAT(:,:),  HLON(:,:),  HTIME(:,:)
    REAL   , ALLOCATABLE   :: HLAT_SFC(:),HLON_SFC(:),HTIME_SFC(:)

    REAL   , ALLOCATABLE   :: RINFO(:,:)
    REAL   , ALLOCATABLE   :: TRINFO(:)

    REAL   , ALLOCATABLE   :: EMIS(:,:),SURF_EMIS(:)

    INTEGER, ALLOCATABLE   :: CFRAC(:,:)

    REAL(OBS_REAL), ALLOCATABLE :: RADMOY(:,:,:)
    REAL(OBS_REAL), ALLOCATABLE :: radstd(:,:,:)
    INTEGER                :: LISTE_INFO(16),LISTE_ELE(15),LISTE_ELE_SFC(15)

    INTEGER                :: NBELE,NVALE,NTE
    INTEGER                :: I,J,JJ,K,KK,KL,IL,ERROR,OBSN
    INTEGER                :: info_elepos,IND_ELE,IND_VCOORD,IND_QCFLAG
    INTEGER                :: IND055200,IND4208,ind4197,IND5002,IND6002
    INTEGER                :: IND_LAT,IND_LON,IND_TIME,IND_EMIS
    INTEGER                :: FLAG_PASSAGE1,FLAG_PASSAGE2,FLAG_PASSAGE3,FLAG_PASSAGE4

    INTEGER                :: vcord_type,vcord_type2,FLAG,SUM
    REAL(OBS_REAL)         :: RELEV,XLAT,XLON
    REAL                   :: XTIME,SECONDS
    INTEGER                :: status ,idtyp,lati,long,dx,dy,elev, &
                               drnd,date_h,hhmm_h,oars,runn,YMD_DATE,HM,kstamp,kstamp2,HM_SFC,YMD_DATE_SFC

    INTEGER                :: iele,NELE,NELE_SFC,NVAL,NT,NELE_INFO,LN
    INTEGER                :: bit_alt,btyp_offset,btyp_offset_uni
    character(len = 5)     :: BURP_TYP
    CHARACTER(LEN=9)       :: STNID,STN_RESUME
    LOGICAL                :: HIRES,HIRES_SFC
    INTEGER                :: NDATA,NDATA_SF
    INTEGER                :: IER,date2,DATE3,time2,time_sonde,NEWDATE
    REAL                   :: RAD_MOY,RAD_STD
    INTEGER                :: iclass,NCHANAVHRR,NCLASSAVHRR,ichan,iobs,inorm
    INTEGER                :: infot

    DATA LISTE_INFO  &
       /1007,002019,007024,007025 ,005021, 005022, 008012, &
        013039,020010,2048,2022,33060,33062,33039,10035,10036/

    FAMILYTYPE2= 'SCRAP'
    vcord_type2=-1
    NELE_INFO=1
    NELE_SFC=0
    NELE=0
    BNBITSOFF=0
    BNBITSON=0
    ENFORCE_CLASSIC_SONDES=.false.
    SELECT CASE(trim(FAMILYTYPE))
      CASE('UA')
        BURP_TYP='multi'
        vcord_type=7004

        LISTE_ELE_SFC = (/12004,11011,11012,10051,10004,12203,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE_SFC=6
        CALL BRPACMA_NML('namburp_sfc')
        NELE_SFC=NELEMS_SFC

        FAMILYTYPE2= 'UA'
        LISTE_ELE = (/12001,11001,11002,12192,10194,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=5
        ENFORCE_CLASSIC_SONDES=.false.
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
      CASE('AI')
        BURP_TYP='uni'
        vcord_type=7004

        LISTE_ELE = (/12001,12192,11001,11002,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=4
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
      CASE('SW')
        BURP_TYP='uni'
        vcord_type=7004

        LISTE_ELE = (/11001,11002,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
      CASE('SF','GP')
        BURP_TYP='uni'
        vcord_type=0
        NELE_SFC=7
        LISTE_ELE_SFC = (/12004,11011,11012,10051,10004,12203,15031,-1,-1,-1,-1,-1,-1,-1,-1/)

        CALL BRPACMA_NML('namburp_sfc')
        NELE_SFC=NELEMS_SFC

        FAMILYTYPE2= 'SFC'
      CASE('SC')
        vcord_type=0
        BURP_TYP='uni'
        LISTE_ELE_SFC = (/11012,11011,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2
        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS

        FAMILYTYPE2= 'UASFC2'
      CASE('PR')
        BURP_TYP='multi'
        vcord_type=7006

        LISTE_ELE = (/11001,11002,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2

        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
      CASE('RO')
        BURP_TYP='multi'
        vcord_type=7007
        vcord_type2=7040

        LISTE_ELE = (/15036,15037,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=2

        CALL BRPACMA_NML('namburp_conv')
        NELE=NELEMS
        !================GPS-RO CANNOT BE FILTERED=======
        BNBITSOFF=0
        BNBITSON=0
        !================GPS-RO CANNOT BE FILTERED=======
        NELE_INFO=16
      CASE('GO','MI','TO')
        BURP_TYP='multi'
        vcord_type=5042
        vcord_type2=2150

        LISTE_ELE = (/12163,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/)
        NELE=1

        CALL BRPACMA_NML('namburp_tovs')
        NELE=NELEMS

        NELE_INFO=16
    END SELECT
    LISTE_ELE    (1:NELE    )=BLISTELEMENTS(1:NELE)
    LISTE_ELE_SFC(1:NELE_SFC)=BLISTELEMENTS_SFC(1:NELE_SFC)
    write(*,*) ' NELE NELEMS LISTE_ELE  =',NELE,NELEMS,LISTE_ELE
    write(*,*) ' NELE_SFC LISTE_ELE_SFC =',NELE_SFC,LISTE_ELE_SFC(1:NELE_SFC)
    write(*,*) ' BNBITSON BNBITSOFF     =',BNBITSON,BNBITSOFF

    btyp_offset_uni=-999
    btyp_offset=-999
    if (trim(BURP_TYP) .eq. 'uni') then
      btyp_offset=256
    else
      btyp_offset=0
    endif

    if (TRIM(FAMILYTYPE2) .eq. 'SFC') then
      btyp_offset= btyp_offset+32
      btyp_offset_uni= 256 +32
    elseif ( TRIM(FAMILYTYPE2) .eq. 'UA') then
      btyp_offset_uni= 256 +32
    else
      btyp_offset_uni= -999 ! set to -999 when not used
    endif

    WRITE(*,*) '-----------------------------------------------'
    WRITE(*,*) '-----------     BEGIN READBURP     ------------'
    WRITE(*,*) 'FAMILYTYPE vcord_type   =',FAMILYTYPE,vcord_type
    WRITE(*,*) 'BURP_TYP btyp_offset    =',BURP_TYP, btyp_offset
    WRITE(*,*) '-----------------------------------------------'


    ! initialisation
    ! --------------
    SUM=0
    flag_passage1 = 0
    flag_passage2 = 0
    flag_passage3 = 0
    flag_passage4 = 0


    opt_missing = 'MISSING'


    Call BURP_Set_Options( &
       & REAL_OPTNAME       = opt_missing, &
       & REAL_OPTNAME_VALUE = PPMIS, &
       & CHAR_OPTNAME       = 'MSGLVL', &
       & CHAR_OPTNAME_VALUE = 'FATAL', &
       & IOSTAT             = error )

    Call BURP_Init(File_in      ,IOSTAT=error)
    Call BURP_Init(Rpt_in       ,IOSTAT=error)
    Call BURP_Init(Block_in     ,IOSTAT=error)


    ! opening file
    write(*,*) 'OPENING BURP FILE FOR READING = ', trim(brp_file)

    Call BURP_New(File_in, FILENAME = brp_file, &
                   & MODE    = FILE_ACC_READ, &
                   & IOSTAT  = error )


    ! obtain input burp file number of reports

    Call BURP_Get_Property(File_in, NRPTS=nb_rpts)

    WRITE(*,*) '-----------------------------------------'
    WRITE(*,*) 'IOSTAT    =',error
    WRITE(*,*) 'NUMBER OF REPORTS IN FILE  = ',nb_rpts
    WRITE(*,*) '-----------------------------------------'


    ! scan input burp file to get all reports address

    Allocate(address(nb_rpts))
    address(:) = 0
    count = 0
    ref_rpt = 0

    do
      ref_rpt = BURP_Find_Report(File_in, &
                    & REPORT      = Rpt_in,  &
                    & SEARCH_FROM = ref_rpt, &
                    & IOSTAT      = error)
      Call burp_get_property(Rpt_in, STNID = stnid )
      IF ( stnid(1:2) == ">>" ) then
        STN_RESUME=stnid
        TYPE_RESUME=STN_RESUME(3:9)
        SELECT CASE(stnid)
          CASE(">>BGCKALT", ">>POSTALT")
            bit_alt=1
          CASE(">>DERIALT")
            bit_alt=2
        END SELECT 
      ENDIF

      if (ref_rpt < 0) Exit

      if (count .eq. nb_rpts) then
        write(*,*) 'READBURP: ERROR: count = nb_rpts:',count,nb_rpts
        exit
      endif

      count = count + 1
      address(count) = ref_rpt
    end do

    !pik  write(*,'(a9,1x,a16,1x,i2)' )STN_RESUME,' bit_alt==== >  ',bit_alt
    write(*, *)STN_RESUME,' bit_alt==== >  ',bit_alt

    BTYP10obs     = 291 -btyp_offset
    BTYP10obs_uni = 291 -btyp_offset_uni
    if (bit_alt .eq. 2) btyp10obs =  BTYP10obs - 2
    if (bit_alt .eq. 2) btyp10obs_uni =  BTYP10obs_uni - 2

    BTYP10flg     = 483 -btyp_offset
    BTYP10flg_uni = 483 -btyp_offset_uni
    if (bit_alt .eq. 2) BTYP10flg =  BTYP10flg  - 2
    if (bit_alt .eq. 2) BTYP10flg_uni =  BTYP10flg_uni  - 2

    write(*, *)  ' NUMBER OF VALID REPORTS IN FILE = ',count
    write(*, *)  ' BTYP10obs BTYP10obs_uni         = ',BTYP10obs,BTYP10obs_uni

    if ( count > 0 ) then

      ! LOOP ON REPORTS
      REPORTS: do kk = 1, count
            

        Call BURP_Get_Report(File_in, &
                      & REPORT    = Rpt_in, &
                      & REF       = address(kk), &
                      & IOSTAT    = error) 
        Call burp_get_property(Rpt_in, &
               STNID = stnid ,TEMPS =hhmm_h,FLGS = status ,IDTYP =idtyp,LATI = lati &
               ,LONG = long ,DX = dx ,DY = dy,ELEV=elev,DRND =drnd,DATE =date_h &
               ,OARS =oars,RUNN=runn ,IOSTAT=error)
        IF ( stnid(1:2) == ">>" ) cycle


        !  LOOP ON BLOCKS

        ref_blk = 0

        HIRES=.FALSE.
        HIRES_SFC=.FALSE.
        BLOCKS1: do

          ref_blk = BURP_Find_Block(Rpt_in, &
                    & BLOCK       = Block_in, &
                    & SEARCH_FROM = ref_blk, &
                    & IOSTAT      = error)

          if (ref_blk < 0) EXIT BLOCKS1

          Call BURP_Get_Property(Block_in, &
                      & NELE   = nbele, &
                      & NVAL   = nvale, &
                      & NT     = nte, &
                      & BFAM   = bfam, &
                      & BTYP   = btyp, &
                      & BKSTP  = BKSTP, &
                      & IOSTAT = error)


          ! observation block (btyp = 0100 100011X XXXX)
          btyp10    = ishft(btyp,-5)
          if ( btyp10 - btyp10obs_uni == 0 .and. bkstp <= 4 ) then

            ALLOCATE(obsvalue_sfc(NELE_SFC,1,nte))
            ALLOCATE(  OBSERV_SFC(NELE_SFC,1) )

            ALLOCATE( vcoord_sfc(1))

            vcoord_SFC(:)       = 0
            obsvalue_sfc(:,:,:) = PPMIS
            IND_LAT   = BURP_Find_Element(Block_in, ELEMENT=5001, IOSTAT=error)
            IND_LON   = BURP_Find_Element(Block_in, ELEMENT=6001, IOSTAT=error)
            IND_TIME  = BURP_Find_Element(Block_in, ELEMENT=4015, IOSTAT=error)
            if (IND_LAT .gt. 0 .and. IND_LON .gt. 0 .and. IND_TIME .gt. 0 ) HIRES_SFC=.true.
            if(HIRES_SFC) ALLOCATE(HLAT_SFC(nte),HLON_SFC(nte),HTIME_SFC(nte) )
            IF (HIRES_SFC) THEN
              do k=1,nte
                HLAT_SFC(k) =BURP_Get_Rval(Block_in, &
                                         & NELE_IND = IND_LAT, &
                                         & NVAL_IND = 1, &
                                         & NT_IND   = k)
                HLON_SFC(k) =BURP_Get_Rval(Block_in, &
                                         & NELE_IND = IND_LON, &
                                         & NVAL_IND = 1, &
                                         & NT_IND   = k)
                HTIME_SFC(k)=BURP_Get_Rval(Block_in, &
                                         & NELE_IND = IND_TIME, &
                                         & NVAL_IND = 1, &
                                         & NT_IND   = k)
              end do
            ENDIF

            do IL = 1, NELE_SFC

              iele=LISTE_ELE_SFC(IL)
              IND_ele  = BURP_Find_Element(Block_in, ELEMENT=iele, IOSTAT=error)
              if (IND_ele .lt. 0 ) cycle

              do k=1,nte
                obsvalue_sfc(IL,1,k) =  BURP_Get_Rval(Block_in, &
                                         & NELE_IND = IND_ele, &
                                         & NVAL_IND = 1, &
                                         & NT_IND   = k)
              end do

            end do

          endif

          if ( btyp10 - btyp10flg_uni == 0 .and. bkstp <= 4 ) then

            ALLOCATE( qcflag_sfc (NELE_SFC,1,nte))
            ALLOCATE( qcflags_SFC(NELE_SFC,1) )
            QCFLAGS_SFC(:,:)=0

            do IL = 1, NELE_SFC
              iele=LISTE_ELE_SFC(IL) + 200000
              IND_QCFLAG  = BURP_Find_Element(Block_in, ELEMENT=iele, IOSTAT=error)
              if (IND_QCFLAG .lt. 0 ) cycle
              DO k=1,nte
                QCFLAG_sfc(IL,1,k) =  BURP_Get_Tblval(Block_in, &
                                         & NELE_IND = IND_QCFLAG, &
                                         & NVAL_IND = 1, &
                                         & NT_IND   = k)
                SUM = SUM +1
              END DO
            end do
          endif

          if ( btyp10 - btyp10obs == 0 .and. bfam == 0 ) then

            flag_passage3 = 1

            NVAL=NVALE ;  NT=NTE
            ALLOCATE(obsvalue(NELE,nvale,nte),VCOORD(nvale,nte))
            ALLOCATE(  OBSERV(NELE,nvale)    )
            ALLOCATE(   VCORD(nvale)    )
                           
            obsvalue(:,:,:) = PPMIS
            OBSERV  (:,:)   = PPMIS
            VCOORD  (:,:)   = 0.
            VCORD   (:)     = 0.

            IND_VCOORD  = BURP_Find_Element(Block_in, ELEMENT=vcord_type,   IOSTAT=error)
            if (IND_VCOORD <= 0)IND_VCOORD  = BURP_Find_Element(Block_in, ELEMENT=vcord_type2, IOSTAT=error)
            !if (IND_VCOORD == -1)write(*,*) 'PAS DE COORDONNEE VERTICALE STNID=',STNID,trim(FAMILYTYPE)

            ! LAT LON TIME IN DATA BLOCK
            IND_LAT   = BURP_Find_Element(Block_in, ELEMENT=5001, IOSTAT=error)
            IND_LON   = BURP_Find_Element(Block_in, ELEMENT=6001, IOSTAT=error)
            IND_TIME  = BURP_Find_Element(Block_in, ELEMENT=4015, IOSTAT=error)
            IND_EMIS  = BURP_Find_Element(Block_in, ELEMENT=55043,IOSTAT=error)
            if (IND_LAT .gt. 0 .and. IND_LON .gt. 0 .and. IND_TIME .gt. 0 ) HIRES=.true.

            if(HIRES) ALLOCATE(HLAT(nvale,nte),HLON(nvale,nte),HTIME(nvale,nte) )

            ALLOCATE(EMIS(nvale,nte))
            ALLOCATE(SURF_EMIS(nvale))
            EMIS(:,:)       = PPMIS
            OBSVALUE(:,:,:) = PPMIS

            do IL = 1, NELE

              iele=LISTE_ELE(IL)
              IND_ele  = BURP_Find_Element(Block_in, ELEMENT=iele, IOSTAT=error)
              if (IND_ele .lt. 0 ) cycle

              do k=1,nte
                do j=1,nvale
                  obsvalue(IL,j,k) =  BURP_Get_Rval(Block_in, &
                                       & NELE_IND = IND_ele, &
                                       & NVAL_IND = j, &
                                       & NT_IND   = k)
                  IF (HIRES) THEN
                    HLAT(j,k) =BURP_Get_Rval(Block_in, &
                                           & NELE_IND = IND_LAT, &
                                           & NVAL_IND = j, &
                                           & NT_IND   = k)
                    HLON(j,k) =BURP_Get_Rval(Block_in, &
                                           & NELE_IND = IND_LON, &
                                           & NVAL_IND = j, &
                                           & NT_IND   = k)
                    HTIME(j,k)=BURP_Get_Rval(Block_in, &
                                           & NELE_IND = IND_TIME, &
                                           & NVAL_IND = j, &
                                           & NT_IND   = k)
                  ENDIF

                  IF (IND_EMIS > 0) THEN
                    EMIS(j,k) =BURP_Get_Rval(Block_in, &
                                           & NELE_IND = IND_EMIS, &
                                           & NVAL_IND = j, &
                                           & NT_IND   = k)
                  ENDIF

                  if (IND_VCOORD <= 0) cycle
                    VCOORD(j,k) =  BURP_Get_Rval(Block_in, &
                              &   NELE_IND = IND_VCOORD, &
                              &   NVAL_IND = j, &
                              &   NT_IND   = k)
                end do
              end do

            end do

          end if


          ! flag block (btyp = 0111 100011X XXXX)
          if ( btyp10 - btyp10flg == 0 ) then

            flag_passage4 = 1
            ALLOCATE(qcflag( NELE,nvale,nte))
            ALLOCATE(qcflags(NELE,nvale) )
            QCFLAG (:,:,:)  = 0
            QCFLAGS(:,:)    = 0

            do IL = 1, NELE

              iele=LISTE_ELE(IL)

              IND_QCFLAG  = BURP_Find_Element(Block_in, ELEMENT=200000+iele, IOSTAT=error)
              if (IND_QCFLAG .le. 0 ) cycle
              do k = 1, nte
                do j = 1, nvale
                  QCFLAG(IL,j,k)= BURP_Get_Tblval(Block_in, &
                                  &   NELE_IND = IND_QCFLAG, &
                                  &   NVAL_IND = j, &
                                  &   NT_IND   = k, &
                                  &   IOSTAT   = error)
                  SUM = SUM +1
                end do
              end do

            end do

          end if

          ! info block (btyp = 0001 100000X XXXX) 
          BTYP10inf = 96

          if ( (btyp10 - btyp10inf == 0) .or. (btyp10 - btyp10inf == 1) ) then

            ALLOCATE( RINFO(NELE_INFO,nte))
            ALLOCATE(TRINFO(NELE_INFO))

            flag_passage2 = 1

            do kl=1,NELE_INFO
              info_elepos = BURP_Find_Element(Block_in, &
                                 & ELEMENT  = LISTE_INFO(kl), &
                                 & IOSTAT   = error)
              if (  info_elepos .ge.  0 )then

                do k =1 , nte
                  RINFO(kl,k)= BURP_Get_rval(Block_in, &
                              &   NELE_IND = info_elepos, &
                              &   NVAL_IND = 1, &
                              &   NT_IND   = k, &
                              &   IOSTAT   = error)
                  if  (RINFO(kl,k) .eq. PPMIS)  THEN    
                    infot= BURP_Get_tblval(Block_in, &
                            &   NELE_IND = info_elepos, &
                            &   NVAL_IND = 1, &
                            &   NT_IND   = k, &
                            &   IOSTAT   = error)
                    if (infot .ne. -1) RINFO(kl,k) =real(infot)
                  ENDIF

                end do

              else
                RINFO(kl,1:nte)=PPMIS
            endif

            end do

          endif


          ! descriptor block (btyp = 0010 100000X XXXX) 
          BTYP10des = 160

          if ( BTYP10 - BTYP10des == 0 ) then

            flag_passage1 = 1

            ALLOCATE(GLBFLAG(nte))
            ALLOCATE(    lat(nte))
            ALLOCATE(    lon(nte))
            ALLOCATE(   date(nte))
            ALLOCATE(   hhmm(nte))

            ! DATE  004208  HHMM 004197  STATUS 055200  LAT 005002  LON 006002  DELAY 004195
            ind055200 = BURP_Find_Element(Block_in, ELEMENT=055200, IOSTAT=error)
            ind5002   = BURP_Find_Element(Block_in, ELEMENT=5002  , IOSTAT=error)
            ind6002   = BURP_Find_Element(Block_in, ELEMENT=6002  , IOSTAT=error)
            ind4208   = BURP_Find_Element(Block_in, ELEMENT=4208  , IOSTAT=error)
            ind4197   = BURP_Find_Element(Block_in, ELEMENT=4197  , IOSTAT=error)

            do k = 1, nte
              LAT(k) =  BURP_Get_Tblval(Block_in, &
                         &   NELE_IND = ind5002, &
                         &   NVAL_IND = 1, &
                         &   NT_IND   = k)
              LON(k) =  BURP_Get_Tblval(Block_in, &
                         &   NELE_IND = ind6002, &
                         &   NVAL_IND = 1, &
                         &   NT_IND   = k)
              HHMM(k) =  BURP_Get_Tblval(Block_in, &
                          &   NELE_IND = ind4197, &
                          &   NVAL_IND = 1, &
                          &   NT_IND   = k)
              DATE(k) =  BURP_Get_Tblval(Block_in, &
                          &   NELE_IND = ind4208, &
                          &   NVAL_IND = 1, &
                          &   NT_IND   = k)
              GLBFLAG(k) =  BURP_Get_Tblval(Block_in, &
                             &   NELE_IND = ind055200, &
                             &   NVAL_IND = 1, &
                             &   NT_IND   = k)
            end do

          end if

          !==================== IASI  SPECIAL BLOCK==================
          if ( BTYP .eq. 9217 .and.  IDTYP .eq. 186   ) then
            NCLASSAVHRR=obs_getNclassAvhrr()
            NCHANAVHRR=obs_getNchanAvhrr()
            if (.not. allocated(CFRAC) ) allocate( CFRAC(NCLASSAVHRR,nte) )
            if (.not. allocated(RADMOY)) allocate(RADMOY(NCLASSAVHRR,NCHANAVHRR,nte))
            if (.not. allocated(radstd)) allocate(radstd(NCLASSAVHRR,NCHANAVHRR,nte))

            RADMOY(:,:,:)=PPMIS
            RADSTD(:,:,:)=PPMIS
            CFRAC(:,:)=-999

            IASIQUAL: DO k = 1, nte
              iclass=1

              NVALS :do j=1,nvale
                DO  il=1,nbele
                  iele=BURP_Get_Element(Block_in,INDEX =il,IOSTAT= error) 
                  SELECT CASE(iele)
                    CASE(25085)
                      CFRAC(iclass,k)= BURP_Get_RVAL(Block_in,NELE_IND = il, NVAL_IND = j, NT_IND = k, IOSTAT = error)
                    CASE(5042)
                      !ICHAN= BURP_Get_TBLVAL(Block_in,NELE_IND = il, NVAL_IND = j, NT_IND = k, IOSTAT = error)
                      ICHAN= BURP_Get_RVAL(Block_in,NELE_IND = il, NVAL_IND = j, NT_IND = k, IOSTAT = error)
                    CASE(25142)
                      !INORM= BURP_Get_TBLVAL(Block_in,NELE_IND = il, NVAL_IND = j, NT_IND = k, IOSTAT = error)
                      INORM= BURP_Get_RVAL(Block_in,NELE_IND = il, NVAL_IND = j, NT_IND = k, IOSTAT = error)
                    CASE(14047)
                      RAD_MOY=BURP_Get_RVAL(Block_in,NELE_IND = il, NVAL_IND = j, NT_IND = k, IOSTAT = error)
                      RADMOY(iclass,ICHAN,k)=RAD_MOY * 10.d0**(-1.d0 * INORM ) * 100000.d0
                    CASE(14048)
                      RAD_STD=BURP_Get_RVAL(Block_in,NELE_IND = il, NVAL_IND = j, NT_IND = k, IOSTAT = error)
                      RADSTD(iclass,ICHAN,k)= RAD_STD * 10.d0**(-1.d0 * INORM ) * 100000.d0
                      IF (ICHAN==NCHANAVHRR) iclass=iclass+1
                      IF ( iclass==(NCLASSAVHRR+1) ) EXIT NVALS
                  END SELECT
                ENDDO
              enddo NVALS

            ENDDO IASIQUAL

          endif

        end do BLOCKS1


        do k = 1, nte

          IF (  allocated(lat) ) then

            XLON    = (lon(k)*1.-18000.)*.01
            XLAT    = (lat(k)*1.- 9000.)*.01
            IF ( xlon  .LT. 0. ) xlon  = 360. + xlon
            XLON    = XLON*MPC_RADIANS_PER_DEGREE_R8
            XLAT    = XLAT*MPC_RADIANS_PER_DEGREE_R8
            YMD_DATE=date(k)
            HM      =hhmm(k)
            STATUS  =GLBFLAG(K)
            RELEV   =REAL(ELEV) - 400.
          ELSE
            XLON    =.01*LONG
            XLAT    =LATI*.01 -90.
            XLON    = XLON*MPC_RADIANS_PER_DEGREE_R8
            XLAT    = XLAT*MPC_RADIANS_PER_DEGREE_R8
            YMD_DATE=date_h
            HM      =hhmm_h
            RELEV   =REAL(ELEV,OBS_REAL) - 400.
          ENDIF

          if (allocated(RINFO))      TRINFO(1:NELE_INFO)     =RINFO       (1:NELE_INFO,k)


          if(ENFORCE_CLASSIC_SONDES .eqv. .true.) hires=.false.

          IF  (HIRES ) THEN

            if (allocated(EMIS))     SURF_EMIS(1:NVAL)    =EMIS      (1:NVAL,k)

            IF ( allocated(obsvalue_sfc) ) THEN
              OBSERV_SFC(1:NELE_SFC,1:1)=obsvalue_sfc(1:NELE_SFC,1:1,k)
              QCFLAGS_sfc(1:NELE_SFC,1:1)=qcflag_sfc  (1:NELE_SFC,1:1,k)
              IF ( HIRES_SFC) THEN
                XLAT=HLAT_SFC(k);XLON=HLON_SFC(k);XTIME=HTIME_SFC(k)
                IF ( XLON  .LT. 0. ) XLON  = 360. + XLON
                ier= NEWDATE(kstamp2,YMD_DATE,HM*10000,3)
       	        XLAT=XLAT*MPC_RADIANS_PER_DEGREE_R8
       	        XLON=XLON*MPC_RADIANS_PER_DEGREE_R8

       	        CALL INCDATR(kstamp, kstamp2, XTIME/60.d0  )
       	        IER=newdate(kstamp,date2,time_sonde,-3)
                time2=time_sonde/10000
                YMD_DATE_SFC=date2
                HM_SFC=time2
              ENDIF

              NDATA_SF= WRITE_BODY(obsdat,'SF',RELEV,vcoord_sfc ,OBSERV_sfc,qcflags_sfc,NELE_SFC,1,LISTE_ELE_SFC)
              IF ( NDATA_SF .GT. 0) THEN
                call WRITE_HEADER(obsdat,STNID,XLAT,XLON,YMD_DATE_SFC,HM_SFC,idtyp,STATUS,RELEV,FILENUMB)
                OBSN=obs_numHeader(obsdat)
                call obs_setFamily(obsdat,trim(FAMILYTYPE),  OBSN )
                call obs_headSet_i(obsdat,OBS_NLV,OBSN,NDATA_SF)
                IF (OBSN .GT. 1 ) THEN
                  LN= obs_headElem_i(obsdat,OBS_RLN,OBSN-1) + obs_headElem_i(obsdat,OBS_NLV,OBSN-1)
                  call obs_headSet_i(obsdat,OBS_RLN,OBSN,LN)
                ELSE
                  call obs_headSet_i(obsdat,OBS_RLN,OBSN,1)
                ENDIF
              ENDIF

            ENDIF

            IF ( allocated(obsvalue) ) THEN

              ier= NEWDATE(kstamp2,YMD_DATE,HM*10000,3)
              do  JJ =1,nval
                OBSERV(1:NELE,1:1)  =obsvalue  (1:NELE,jj:jj,k)
                if (allocated(qcflag))     QCFLAGS(1:NELE,1:1)    =qcflag  (1:NELE,jj:jj,k)
                XLAT=HLAT(jj,k);XLON=HLON(jj,k);XTIME=HTIME(jj,k)
                IF ( XLON  .LT. 0. ) XLON  = 360. + XLON

                XLAT=XLAT*MPC_RADIANS_PER_DEGREE_R8
                XLON=XLON*MPC_RADIANS_PER_DEGREE_R8

                CALL INCDATR(kstamp, kstamp2, XTIME/60.d0  )
                IER=newdate(kstamp,date2,time_sonde,-3)

                time2=time_sonde/10000

		VCORD(1)=VCOORD(jj,k)
                NDATA= WRITE_BODY(obsdat,familytype,RELEV,VCORD, OBSERV,qcflags,NELE,1,LISTE_ELE,SURF_EMIS)
                IF (NDATA .gt. 0) THEN
                  call WRITE_HEADER(obsdat,STNID,XLAT,XLON,date2,time2,idtyp,STATUS,RELEV,FILENUMB)
                  OBSN=obs_numHeader(obsdat)
                  call obs_setFamily(obsdat,trim(FAMILYTYPE), OBSN )
                  call obs_headSet_i(obsdat,OBS_NLV,OBSN,NDATA)
                  IF (OBSN .GT. 1 ) THEN
                    LN= obs_headElem_i(obsdat,OBS_RLN,OBSN-1) + obs_headElem_i(obsdat,OBS_NLV,OBSN-1)
                    call obs_headSet_i(obsdat,OBS_RLN,OBSN,LN)
                    !call obs_headSet_i(obsdat,OBS_IDO,OBSN,kk)
                  ELSE
                    call obs_headSet_i(obsdat,OBS_RLN,OBSN,1)
                    !call obs_headSet_i(obsdat,OBS_IDO,OBSN,kk)
                  ENDIF
                ENDIF

              end do

            ENDIF

          ELSE

            if (allocated(EMIS))      SURF_EMIS(1:NVAL)        =EMIS     (1:NVAL,k)

            NDATA   =0
            NDATA_SF=0
            IF ( allocated(obsvalue_sfc) ) THEN
       	      IF ( HIRES_SFC) THEN
                XLAT=HLAT_SFC(k);XLON=HLON_SFC(k);XTIME=HTIME_SFC(k)
                IF ( XLON  .LT. 0. ) XLON  = 360. + XLON
                ier= NEWDATE(kstamp2,YMD_DATE,HM*10000,3)
       	        XLAT=XLAT*MPC_RADIANS_PER_DEGREE_R8
       	        XLON=XLON*MPC_RADIANS_PER_DEGREE_R8

       	        CALL INCDATR(kstamp, kstamp2, XTIME/60.d0  )
       	        IER=newdate(kstamp,date2,time_sonde,-3)
                time2=time_sonde/10000
       	        YMD_DATE=date2
       	        HM=time2
       	      ENDIF

              OBSERV_SFC (1:NELE_SFC,1:1)=obsvalue_sfc(1:NELE_SFC,1:1,k)
              QCFLAGS_sfc(1:NELE_SFC,1:1)=qcflag_sfc  (1:NELE_SFC,1:1,k)
              NDATA_SF= WRITE_BODY(obsdat,'SF',RELEV,vcoord_sfc ,OBSERV_sfc,qcflags_sfc,NELE_SFC,1,LISTE_ELE_SFC)
              IF ( NDATA_SF .GT. 0) THEN
                call WRITE_HEADER(obsdat,STNID,XLAT,XLON,YMD_DATE,HM,idtyp,STATUS,RELEV,FILENUMB)
                OBSN=obs_numHeader(obsdat) 
                call obs_setFamily(obsdat,trim(FAMILYTYPE), OBSN )
                call obs_headSet_i(obsdat,OBS_NLV ,OBSN,NDATA_SF)
                IF (OBSN  .GT. 1 ) THEN
                  LN= obs_headElem_i(obsdat,OBS_RLN,OBSN-1) + obs_headElem_i(obsdat,OBS_NLV,OBSN-1)
                  call obs_headSet_i(obsdat,OBS_RLN,OBSN,LN)
                  !call obs_headSet_i(obsdat,OBS_IDO,OBSN,kk)
                ELSE
                  call obs_headSet_i(obsdat,OBS_RLN,OBSN,1)
                  !call obs_headSet_i(obsdat,OBS_IDO,OBSN,kk)
                ENDIF
              ENDIF
            ENDIF
          
            IF ( allocated(obsvalue) ) THEN
              OBSERV(1:NELE,1:NVAL)    =obsvalue(1:NELE,1:NVAL,k)
              QCFLAGS(1:NELE,1:NVAL)   =qcflag  (1:NELE,1:NVAL,k)
              VCORD(1:NVAL)            =VCOORD  (1:NVAL,k)
              NDATA= WRITE_BODY(obsdat,familytype,RELEV,VCORD,OBSERV,qcflags,NELE,NVAL,LISTE_ELE,SURF_EMIS)

              IF (NDATA .gt. 0) THEN

                IF (NDATA_SF .eq. 0) THEN
                  call WRITE_HEADER(obsdat,STNID,XLAT,XLON,YMD_DATE,HM,idtyp,STATUS,RELEV,FILENUMB)
       	          OBSN=obs_numHeader(obsdat) 
                  call obs_setFamily(obsdat,trim(FAMILYTYPE), OBSN )
                ENDIF
       	        OBSN=obs_numHeader(obsdat) 
                call obs_headSet_i(obsdat,OBS_NLV,OBSN,NDATA+NDATA_SF)
                IF (OBSN   .GT. 1 ) THEN
                  LN= obs_headElem_i(obsdat,OBS_RLN,OBSN-1) + obs_headElem_i(obsdat,OBS_NLV,OBSN-1)
                  call obs_headSet_i(obsdat,OBS_RLN,OBSN,LN)
                  !call obs_headSet_i(obsdat,OBS_IDO,OBSN,kk)
                ELSE
                  call obs_headSet_i(obsdat,OBS_RLN,OBSN,1)
                  !call obs_headSet_i(obsdat,OBS_IDO,OBSN,kk)
                ENDIF
			
              ENDIF

            ENDIF

            !============ IASI =====================================
            if ( allocated(RADMOY) .and. NDATA .gt. 0 ) then
              OBSN=obs_numHeader(obsdat)

              iclass=1
              do iobs=OBS_CF1,OBS_CF7
                if(obs_columnActive_IH(obsdat,iobs)) then
                  call obs_headSet_i(obsdat,iobs,OBSN,CFRAC(iclass,k))
                  iclass=iclass+1
                endif
              enddo

              iclass=1
              ichan=1
              do iobs=OBS_M1C1,OBS_M7C6
                if(obs_columnActive_RH(obsdat,iobs)) then
                  call obs_headSet_r(obsdat,iobs,OBSN,RADMOY(iclass,ichan,k))
                  ichan=ichan+1
                  if (ichan>obs_getNchanAvhrr()) then
                    ichan=1
                    iclass=iclass+1
                  endif
                endif
              enddo

              iclass=1
              ichan=1
              do iobs=OBS_S1C1,OBS_S7C6
                if(obs_columnActive_RH(obsdat,iobs)) then
                  call obs_headSet_r(obsdat,iobs,OBSN,radstd(iclass,ichan,k))
                  ichan=ichan+1
                  if (ichan>obs_getNchanAvhrr()) then
                    ichan=1
                    iclass=iclass+1
                  endif
                endif
              enddo

            endif
            !============ IASI =====================================

          ENDIF

          if (allocated(TRINFO))  then
            IF ( NDATA  .gt. 0 ) then
              call WRITE_INFO(obsdat,familytype, TRINFO,LISTE_INFO,NELE_INFO  )
            ENDIF
          endif

        end do

        !---------UPPER AIR---------------------------
        if ( allocated(obsvalue) ) then
          DEALLOCATE ( obsvalue,VCOORD,VCORD,observ)
        end if
        if ( allocated(qcflag) ) then
          DEALLOCATE (qcflag,qcflags)
        end if
        if ( allocated(EMIS) ) then
          DEALLOCATE (EMIS,SURF_EMIS)
        end if

	!---------SURFACE-----------------------------
        if ( allocated(obsvalue_sfc) ) then
          DEALLOCATE(obsvalue_sfc,vcoord_sfc,OBSERV_SFC)
        endif

        if ( allocated(qcflag_sfc) ) then
          DEALLOCATE(  qcflag_sfc, qcflags_SFC)
        endif

        !--------SURFACE------------------------------
        if (  allocated(lat) ) then
          DEALLOCATE (lat,lon,date,hhmm,glbflag)
        endif
        if (  allocated(hlat) ) then
          DEALLOCATE (hlat,hlon,htime)
        endif
        if (  allocated(hlat_sfc) ) then
          DEALLOCATE (hlat_sfc,hlon_sfc,htime_sfc)
        endif
        if ( allocated(rinfo) ) then
          DEALLOCATE (rinfo,trinfo)
        endif
        if ( allocated(RADMOY) ) then
          DEALLOCATE (RADMOY,CFRAC,radstd)
        endif


      end do REPORTS

    end if

    Deallocate(address)

    if ( flag_passage1 == 1 ) then
      write(*,*)
      write(*,*) ' descriptor block for grouped data present '
    end if
    if ( flag_passage2 == 1 ) then
      write(*,*)
      write(*,*) '- info block Present '
    end if
    if ( flag_passage3 == 0 ) then
      write(*,*)
      write(*,*) 'ERROR - observation block not seen ? Verify btyp'
    end if
    if ( flag_passage4 == 0 ) then
      write(*,*)
      write(*,*) 'ERROR - flag block not seen ? Verify btyp'
    end if


    Call BURP_Free(File_in,      IOSTAT=error)
    Call BURP_Free(Rpt_in,       IOSTAT=error)
    Call BURP_Free(Block_in,     IOSTAT=error)

    write(*,*)' file   Nobs SUM = ',trim(brp_file),obs_numHeader(obsdat),SUM
  END SUBROUTINE READBURP



  integer function cvt_burp_instrum2(sensor) 1
    !
    ! func CVT_BURP_INSTRUM : Map burp satellite sensor indicator (element #2048) to
    !                         the corresponding burp satellite instrument (element
    !                         #2019).
    !
    ! Author  : J. Halle CMDA/SMC May 2002
    ! Revision:
    !           J.W. Blezius ARMA Feb 2011 - converted from subroutine to a function
    !
    !     Purpose:  Map burp satellite sensor indicator (element #2048) to
    !               burp satellite instrument (element #2019). This is a more
    !               complete common element, allowing for future expansion.
    !
    !               Table of BURP satellite sensor indicator element #002048
    !               --------------------------------------------------------
    !               Satellite sensor     BURP satellite sensor indicator
    !               ----------------     -------------------------------
    !               HIRS                 0
    !               MSU                  1
    !               SSU                  2
    !               AMSUA                3
    !               AMSUB                4
    !               AVHRR                5
    !               SSMI                 6
    !               NSCAT                7
    !               SEAWINDS             8
    !               Reserved             9-14
    !               Missing value        15
    !

    implicit none
    integer :: sensor      ! BURP satellite sensor indicator (element #2048)
    integer :: instrument  ! BURP satellite instrument       (element #2019)

    select case (sensor)
      case (000);   instrument=606  ! HIRS
      case (001);   instrument=623  ! MSU
      case (002);   instrument=627  ! SSU
      case (003);   instrument=570  ! AMSUA
      case (004);   instrument=574  ! AMSUB
      case (005);   instrument=591  ! AVHRR
      case (006);   instrument=905  ! SSMI
      case (007);   instrument=312  ! NSCAT
      case (008);   instrument=313  ! SEAWINDS
      case (015);   instrument=2047 ! Missing value
      case default; instrument=2047 ! Unrecognized value
    end select

    cvt_burp_instrum2 = instrument
    return

  end function cvt_burp_instrum2



  FUNCTION WRITE_BODY(obsdat,FAMTYP, ELEV,VERTCOORD & 4,30
                             ,obsvalue,qcflag,NELE,NVAL,LISTE_ELE,SURF_EMIS)

    type (struct_obs), intent(inout) :: obsdat

    INTEGER ::  WRITE_BODY
    REAL   , allocatable          ::   OBSVALUE(:,:)
    REAL   , allocatable,optional ::   SURF_EMIS(:)
    INTEGER, allocatable          ::     QCFLAG(:,:)
    REAL   , allocatable          ::  VERTCOORD(:)

    CHARACTER*2 ::   FAMTYP
    REAL        ::   ELEVFACT,VCOORD,ZFACT,INFOV
    INTEGER     ::   NELE,NVAL
    integer     ::   LISTE_ELE(:)

    INTEGER     ::   ID_OBS,ID_DATA

    INTEGER     ::   NOBS
    INTEGER     ::   VARNO,IL,J,COUNT,NLV


    INTEGER     ::   IFLAG,LN,BITSflagoff,BITSflagon
    REAL(OBS_REAL) :: MISG,OBSV,ELEV,ELEV_R,REMIS
    INTEGER     ::   VCO
    INTEGER     ::   NONELEV
    REAL        ::   ZEMFACT
    LOGICAL     ::   L_EMISS

    if(present(SURF_EMIS)) then
      L_EMISS=.true.
    else
      L_EMISS=.false.
    endif

    NONELEV  =-1

    MISG=PPMIS
    ZEMFACT=0.01

    BITSflagoff=0
    DO J = 1, Bnbitsoff
      BITSflagoff = IBSET ( BITSflagoff, 13-BBITOFF(J) )
    END DO

    BITSflagon=0
    DO J = 1, Bnbitson
       BITSflagon = IBSET ( BITSflagon,  13-BBITON(J)  )
    END DO
    !write(*,*) ' write body BITSFLAGON= ',BITSFLAGON, ' BITSFLAGOFF= ',BITSFLAGOFF

    NOBS =obs_numHeader(obsdat) +1
    COUNT=obs_numBody (obsdat)

    NLV=0

    id_obs=NOBS


    if (  trim(FAMTYP) .eq. trim('PR') .OR. trim(FAMTYP) .eq. trim('SF') ) then
      ELEVFACT=1.
    else
      ELEVFACT=0.
    endif
    if (  trim(FAMTYP) .eq. trim('TO') ) then
      !ELEV=0.
    ENDIF

    SELECT CASE(FAMTYP)
      CASE ( 'UA' , 'SW' , 'AI')
        VCO=2 ! PRESSURE COORD
      CASE ( 'SF' , 'SC', 'PR', 'RO', 'GP' )
        VCO=1 ! HEIGHT COORD
      CASE ( 'TO'  )
        VCO=3 ! CHANNEL NUMBER
    END SELECT

    !-------------------SPECIAL CASES--------------
    DO il = 1, NELE
      varno=LISTE_ELE(il)
      DO j = 1, NVAL
        VCOORD=VERTCOORD(j)
        OBSV  =   obsvalue(il,j)
        if( L_EMISS .eqv. .true.)  then
          if( SURF_EMIS(j) .ne.  MISG)  then
            REMIS =  SURF_EMIS(j)*ZEMFACT
          else
            REMIS = MISG
          endif
        endif
        IFLAG = INT(qCflag(il,j))
        if(iand(iflag,BITSflagoff) .ne.0) cycle
        !burpmodule IFLAG = IBCLR(IFLAG,12)

        !if (VARNO .eq. .10194)OBSV=OBSV*RG
        if ( obsv .ne. PPMIS .and. VCOORD .ne. PPMIS   ) then
          count = count  + 1
          NLV= NLV +1
          ID_DATA=count
          IFLAG = IBCLR(IFLAG,12)
          call obs_bodySet_r(obsdat,OBS_VAR,count,OBSV)
          call obs_bodySet_i(obsdat,OBS_VNM,count,VARNO)
          call obs_bodySet_i(obsdat,OBS_VCO,count,VCO)
          ELEV_R=VCOORD + ELEV*ELEVFACT
          call obs_bodySet_r(obsdat,OBS_PPP,count, ELEV_R)
          call obs_bodySet_i(obsdat,OBS_VNM,count,VARNO)
          call obs_bodySet_i(obsdat,OBS_FLG,count,IFLAG)
          if ( REMIS .ne. PPMIS .and. FAMTYP .eq. 'TO') THEN
            call obs_bodySet_r(obsdat,OBS_SEM,count,REMIS)
          else
            call obs_bodySet_r(obsdat,OBS_SEM,count,MISG)
          endif
          !call obs_set_i(obsdat,'OBS',count,NOBS)

          call obs_bodySet_i(obsdat,OBS_VCO,count,VCO)
          !call obs_bodySet_i(obsdat,OBS_IDD,count,ID_DATA)
          !call obs_bodySet_i(obsdat,OBS_IDD,count,0)

          if ( varno .eq. 11001 .or. varno .eq. 11011) then
            call obs_bodySet_r(obsdat,OBS_VAR,count,OBSV)
            if ( varno .eq. 11001) then
              call obs_bodySet_i(obsdat,OBS_VNM,count+1,11003)
              call obs_bodySet_i(obsdat,OBS_FLG,count+1,0)
              !call obs_bodySet_i(obsdat,OBS_IDD,count+1,-1)
              ELEV_R=VCOORD + ELEV*ELEVFACT
              call obs_bodySet_r(obsdat,OBS_PPP,count+1,ELEV_R)
              call obs_bodySet_i(obsdat,OBS_VCO,count+1,VCO)

              call obs_bodySet_i(obsdat,OBS_VNM,count+2,11004)
              !call obs_set_i(obsdat,'OBS',count+2,NOBS)
              call obs_bodySet_i(obsdat,OBS_FLG,count+2,0)
              !call obs_bodySet_i(obsdat,OBS_IDD,count+2,-1)
              call obs_bodySet_r(obsdat,OBS_PPP,count+2,ELEV_R)
              call obs_bodySet_i(obsdat,OBS_VCO,count+2,VCO)
            else
              call obs_bodySet_i(obsdat,OBS_VNM,count+1,11215)
              call obs_bodySet_i(obsdat,OBS_FLG,count+1,0)
              !call obs_bodySet_i(obsdat,OBS_IDD,count+1,-1)
              ELEV_R=VCOORD + ELEV*ELEVFACT
              call obs_bodySet_r(obsdat,OBS_PPP,count+1,ELEV_R)
              call obs_bodySet_i(obsdat,OBS_VCO,count+1,VCO)

              call obs_bodySet_i(obsdat,OBS_VNM,count+2,11216)
              call obs_bodySet_i(obsdat,OBS_FLG,count+2,0)
              !call obs_bodySet_i(obsdat,OBS_IDD,count+2,-1)
              call obs_bodySet_r(obsdat,OBS_PPP,count+2,ELEV_R)
              call obs_bodySet_i(obsdat,OBS_VCO,count+2,VCO)
            endif

            call obs_bodySet_r(obsdat,OBS_VAR,count+1,MISG)
            call obs_bodySet_r(obsdat,OBS_VAR,count+2,MISG)

            count = count + 2
            NLV = NLV + 2
          endif

        endif

      END DO

    END DO


    WRITE_BODY=NLV

  END FUNCTION  WRITE_BODY



  subroutine GET_HEADER(obsdat, LAT,LON,DATE,TIME,CODTYP,STATUS,ELEV,NOBS,FILENUMB),9

    type (struct_obs), intent(inout) :: obsdat

    INTEGER     ::   DATE,TIME,CODTYP,STATUS,FILENUMB
    REAL(OBS_REAL)  :: ELEV,LAT,LON

    INTEGER     ::   LN,NOBS

    NOBS=obs_numHeader(obsdat) 

    LAT     = obs_headElem_r(obsdat,OBS_LAT,nobs)
    LON     = obs_headElem_r(obsdat,OBS_LON,nobs)
    DATE    = obs_headElem_i(obsdat,OBS_DAT,nobs)
    TIME    = obs_headElem_i(obsdat,OBS_ETM,nobs)
    CODTYP  = obs_headElem_i(obsdat,OBS_ITY,nobs)
    STATUS  = obs_headElem_i(obsdat,OBS_ST1,nobs)
    !NOBS    = obs_headElem_i(obsdat,OBS_IDO,nobs)
    FILENUMB= obs_headElem_i(obsdat,OBS_OTP,nobs)
    ELEV    = obs_headElem_r(obsdat,OBS_ALT,nobs)

    RETURN

  END SUBROUTINE  GET_HEADER



  SUBROUTINE WRITE_HEADER(obsdat, STNID,LAT,LON,DATE,TIME,CODTYP,STATUS,ELEV,FILENUMB) 4,11

    type (struct_obs), intent(inout) :: obsdat
    CHARACTER(LEN=9)       :: STNID

    INTEGER     ::    DATE,TIME,CODTYP,STATUS
    INTEGER     ::    FILENUMB
    REAL(OBS_REAL) :: ELEV,LAT,LON

    INTEGER     ::   LN,NOBS

    NOBS=obs_numHeader(obsdat)  +1

    call obs_headSet_i(obsdat,OBS_ONM,nobs,nobs)
    call obs_headSet_r(obsdat,OBS_LAT,nobs,LAT)
    call obs_headSet_r(obsdat,OBS_LON,nobs,LON)
    call obs_headSet_i(obsdat,OBS_DAT,nobs,DATE)
    call obs_headSet_i(obsdat,OBS_ETM,nobs,TIME)
    call obs_headSet_i(obsdat,OBS_ITY,nobs,CODTYP)
    call obs_headSet_i(obsdat,OBS_ST1,nobs,STATUS)
    !call obs_headSet_i(obsdat,OBS_IDO,nobs,NOBS)
    call obs_headSet_r(obsdat,OBS_ALT,nobs,ELEV)
    !call obs_headSet_i(obsdat,OBS_IDF,nobs,FILENUMB)
    call obs_headSet_i(obsdat,OBS_OTP,nobs,FILENUMB)
    call obs_set_c(obsdat,'STID',nobs,STNID )

  END SUBROUTINE  WRITE_HEADER



  subroutine WRITE_INFO(obsdat,FAMTYP, RINFO,LISTE_INFO,NELE_INFO  ) 1,16

    type (struct_obs), intent(inout) :: obsdat

    !REAL   , allocatable  ::      RINFO(:)
    REAL        ::      RINFO(NELE_INFO)

    CHARACTER*2 ::   FAMTYP
    REAL*4      ::   INFOV
    INTEGER     ::   NELE_INFO
    integer     ::   LISTE_INFO(NELE_INFO)

    INTEGER     ::   CODTYP

    INTEGER     ::   IL,J,NOBS
    INTEGER     ::   SENSOR,ID_SAT,INSTRUMENT,LAND_SEA
    INTEGER     ::   TERRAIN_TYPE,ZENITH,SOLAR_ZENITH,AZIMUTH,CLOUD_COVER,SOLAR_AZIMUTH
    INTEGER     ::   IGQISFLAGQUAL,IGQISQUALINDEXLOC,ITANGENT_RADIUS,IGEOID,IRO_QCFLAG

    REAL        ::   RSOLAR_ZENITH,RCLOUD_COVER,RZENITH,RAZIMUTH,RSOLAR_AZIMUTH
    REAL        ::   RIGQISFLAGQUAL,RIGQISQUALINDEXLOC
    REAL        ::   RTERRAIN_TYPE,RLAND_SEA,RID_SAT,RSENSOR,RINSTRUMENT,RRO_QCFLAG
    REAL(OBS_REAL)        ::   RTANGENT_RADIUS,RGEOID

    NOBS=obs_numHeader(obsdat)

    CODTYP=obs_headElem_i(obsdat,OBS_ITY,NOBS)
    !write(*,*)'  DEBUT WRITE_INFO NOBS CODTYP ----> ',NOBS,CODTYP,size(liste_info),size(RINFO),liste_info
    LAND_SEA  =0
    INSTRUMENT=0
    ID_SAT    =0
    ZENITH    =0
    SENSOR    =0
    AZIMUTH   =0

    SOLAR_AZIMUTH = 0
    SOLAR_ZENITH = 0
    RTANGENT_RADIUS=PPMIS
    RGEOID=PPMIS
    !CLOUD_COVER = 0

    !if ( allocated(rinfo) ) then

    do il=1,NELE_INFO
      INFOV=rinfo(il)
      SELECT CASE( liste_info(il) )
        CASE( 1007)
          RID_SAT=INFOV
          IF (RID_SAT .eq. PPMIS ) THEN 
            ID_SAT=0
          ELSE
            ID_SAT=NINT(RID_SAT)
          ENDIF
        CASE( 2048)
          RSENSOR=INFOV
          if (RSENSOR .eq. PPMIS ) THEN
            SENSOR=-99
          ELSE
            SENSOR=NINT(RSENSOR)
          ENDIF
        CASE( 2019)
          RINSTRUMENT=INFOV
          if (RINSTRUMENT .eq. PPMIS ) THEN
            INSTRUMENT=0
          ELSE
            INSTRUMENT=NINT(RINSTRUMENT)
          ENDIF
        CASE( 7024)
          RZENITH=INFOV
          if (RZENITH .eq. PPMIS ) THEN
            ZENITH=9000
          ELSE
            ZENITH=NINT ( (90.0 + RZENITH)*100 )
          ENDIF
        CASE( 7025)
          RSOLAR_ZENITH =INFOV
          if (RSOLAR_ZENITH .eq. PPMIS )  THEN 
            SOLAR_ZENITH=0
            SOLAR_ZENITH=-99
          ELSE
            SOLAR_ZENITH=NINT ( (90.0 + RSOLAR_ZENITH)*100 )
          ENDIF
        CASE( 5021)
          RAZIMUTH=INFOV
          if (RAZIMUTH .eq. PPMIS ) THEN
            AZIMUTH=0
          ELSE
            AZIMUTH=NINT ( (RAZIMUTH)*100 )
          ENDIF
        CASE( 33060)
          RIGQISFLAGQUAL=INFOV
          if (RIGQISFLAGQUAL .eq. PPMIS )  then
            IGQISFLAGQUAL=0
          ELSE
            IGQISFLAGQUAL=NINT ( RIGQISFLAGQUAL )
          ENDIF
        CASE( 33062)
          RIGQISQUALINDEXLOC=INFOV
          if (RIGQISQUALINDEXLOC .eq. PPMIS )  then
            IGQISQUALINDEXLOC=0
          ELSE
            IGQISQUALINDEXLOC=NINT ( RIGQISQUALINDEXLOC )
          ENDIF
        CASE( 5022)
          RSOLAR_AZIMUTH=INFOV
          if (RSOLAR_AZIMUTH .eq. PPMIS )  then
            SOLAR_AZIMUTH=0
            SOLAR_AZIMUTH=-99
          ELSE
            SOLAR_AZIMUTH=NINT ( (RSOLAR_AZIMUTH)*100 )
          ENDIF
        CASE( 8012)
          RLAND_SEA=INFOV
          if (RLAND_SEA .eq. PPMIS ) THEN
            LAND_SEA=99
          ELSE
            LAND_SEA=NINT ( RLAND_SEA )
          ENDIF
        CASE( 13039)
          RTERRAIN_TYPE=INFOV
          if (RTERRAIN_TYPE .eq. PPMIS ) THEN
            TERRAIN_TYPE=99
          ELSE
            TERRAIN_TYPE=NINT ( RTERRAIN_TYPE )
          ENDIF
        CASE( 20010)
          RCLOUD_COVER=INFOV
          if (RCLOUD_COVER .eq. PPMIS ) THEN
            CLOUD_COVER=0
          ELSE
            CLOUD_COVER=NINT ( RCLOUD_COVER )
          ENDIF
        CASE( 10035)
          RTANGENT_RADIUS=INFOV
        CASE( 10036)
          RGEOID=INFOV
        CASE( 33039)
          RRO_QCFLAG=INFOV
          if (RRO_QCFLAG .eq. PPMIS ) THEN
            IRO_QCFLAG=-99
          ELSE
            IRO_QCFLAG=NINT ( RRO_QCFLAG )
          ENDIF
      END SELECT
    end do

    !-------------------SPECIAL CASES--------------

    ! INSTRUMENT
    IF ( SENSOR .EQ. -99)then
      IF ( INSTRUMENT .EQ. -99)then
        INSTRUMENT=0
      ENDIF
    ELSE
      INSTRUMENT = cvt_burp_instrum2(sensor)
    ENDIF

    ! AIRS
    IF ( INSTRUMENT == 420 ) ID_SAT = 784

    if (  trim(FAMTYP) .eq. trim('GO') ) then
      LAND_SEA=0
      ZENITH=0
    ENDIF
   

    !-------------------SPECIAL CASES--------------

    ! Is terrain type sea ice (iterrain=0)?, If so, set imask=2.
    IF ( TERRAIN_TYPE .EQ.  0       ) THEN
      LAND_SEA = 2
    ENDIF

    call obs_headSet_i(obsdat,OBS_OFL,nobs,LAND_SEA)
    call obs_headSet_i(obsdat,OBS_INS,nobs,INSTRUMENT  )
    call obs_headSet_i(obsdat,OBS_SZA,nobs,ZENITH )
    call obs_headSet_i(obsdat,OBS_CLF,nobs,CLOUD_COVER )
    call obs_headSet_i(obsdat,OBS_AZA,nobs,AZIMUTH )
    call obs_headSet_i(obsdat,OBS_SUN,nobs,SOLAR_ZENITH )
    call obs_headSet_i(obsdat,OBS_SAZ,nobs,SOLAR_AZIMUTH )
    call obs_headSet_i(obsdat,OBS_SAT,nobs,ID_SAT)
    call obs_headSet_i(obsdat,OBS_GQF,nobs,IGQISFLAGQUAL)
    call obs_headSet_i(obsdat,OBS_GQL,nobs,IGQISQUALINDEXLOC)
    !if( trim(FAMTYP) .eq. trim('RO'))print *, 'geoid   QCFLAG TANGENT_RADIUS GEOID=',IRO_QCFLAG,RTANGENT_RADIUS,RGEOID
    call obs_headSet_i(obsdat,OBS_ROQF,nobs,IRO_QCFLAG)
    call obs_headSet_r(obsdat,OBS_TRAD,nobs,RTANGENT_RADIUS)
    call obs_headSet_r(obsdat,OBS_GEOI,nobs,RGEOID)


  END SUBROUTINE  WRITE_INFO



    INTEGER  FUNCTION FIND_INDEX(LIST,ELEMENT) 2
    INTEGER LIST(:)
    INTEGER I,ELEMENT
    FIND_INDEX=-1
    do I=1,size (LIST)
      if (list(i) .eq. element) THEN
        FIND_INDEX=i
        exit
      endif
    end do
    RETURN
  END FUNCTION FIND_INDEX


end module burp_read