!-------------------------------------------------------------------------
!    NOAA/NCEP, National Centers for Environmental Prediction GSI        !
!-------------------------------------------------------------------------
!BOP
!
! !MODULE:  blacklist --- Setup blacklist information
!
! !INTERFACE:
!

module blacklist 

! !USES:

  use kinds, only: i_kind
  implicit none
!
! !DESCRIPTION:  This module contains variables and routines related
!                 to the assimilation of conventional observations 
!
! !REVISION HISTORY:
!
!   2006-12-01  todling  - original code - blacklist merge (based on convinfo)
!
! Subroutines Included:
!   sub blacklist_read    - allocate arrays for and read in blacklist file
!   sub blacklist_destroy - destroy blacklist arrays
!
! Variable Definitions:
!   def iblktbl        - 
!
! attributes:
!   language: f90
!   machine:  ibm RS/6000 SP
!
! !AUTHOR:
!   todling           org: gsfc                date: 2006-12-01
!
!EOP
!-------------------------------------------------------------------------

! set default to private
  private
! set subroutines to public
  public :: blacklist_read
  public :: blacklist_destroy
! set passed variables to public
  public :: ibcnt,blkkx,blkstns

  integer(i_kind) ibcnt,ilcnt
  character(len=8),allocatable,dimension(:) :: blkstns
  integer(i_kind), allocatable,dimension(:) :: blkkx
  logical, save :: blacklist_initialized=.false.

contains

!-------------------------------------------------------------------------
! NOAA/NCEP, National Centers for Environmental Prediction GSI        !
!-------------------------------------------------------------------------
!BOP
!
! !IROUTINE: blacklist_read - read in blacklist file and store info in mem
!
! !INTERFACE:
!
  subroutine blacklist_read(obstype)

! !USES:

    implicit none

! !DESCRIPTION:  This routine reads the conventional information file
!
! !REVISION HISTORY:
!   2006-02-08  todling - brought sienkiewicz's code into this routine
!   2007-02-15  todling - arbitrary lengh for obstype
!   2009-12-03  todling - check to see if initialized already
!
! !INPUT PARAMETERS:

    character(len=*),  intent(in   ) :: obstype ! observation type

! !OUTPUT PARAMETERS:
!
! attributes:
!   language: f90
!   machine:  ibm rs/6000 sp
!
! !AUTHOR:
!     prgmmr:    todling    org: gsfc                date: 2006-12-01
!EOP
!-------------------------------------------------------------------------
    

    character(len=1)cflg
    character(len=7) iotype
    character(len=120) crecord
    integer(i_kind) i
    integer(i_kind) iblktbl,ier,ios,ikx
    character(len=8) stnid
    logical eof

    if (blacklist_initialized) return
    iblktbl = 19
    open(iblktbl,file='blacklist',form='formatted')
    rewind iblktbl
    ibcnt = 0
    ilcnt = 0
    eof = .false.
    do while (.not. eof)     ! get number of applicable entries in table
       read(iblktbl,fmt='(a1,a7)',iostat=ios)cflg,iotype
       if (ios /= 0) then
          eof = .true.
          cycle
       endif
       ilcnt = ilcnt + 1
       if (cflg == '!') cycle
       if (iotype/=obstype)cycle
       ibcnt = ibcnt + 1
    end do
    if (ibcnt > 0) then     ! allocate and read in table
        allocate(blkstns(ibcnt),blkkx(ibcnt),stat=ier)
        if (ier /=0) then
           write(6,*)'***READ_PREPBUFR ERROR*** Error allocating ',&
                'memory; blacklist will not be applied'
           ibcnt = 0
        else
           blacklist_initialized=.true.
           rewind iblktbl
           ibcnt = 0
           do i = 1, ilcnt
              read(iblktbl,fmt='(a1,a7,1x,a120)',iostat=ios) &
                   cflg,iotype,crecord
              if (ios /=0) exit
              if (cflg == '!') cycle
              if (iotype == obstype) then
                 read(crecord,'(i3,1x,a8)') ikx,stnid
                 ibcnt = ibcnt + 1
                 blkstns(ibcnt) = stnid
                 blkkx(ibcnt) = ikx
              endif
           enddo
        endif
    endif
    close(iblktbl)
    
    return
  end subroutine blacklist_read

!-------------------------------------------------------------------------
! NOAA/NCEP, National Centers for Environmental Prediction GSI        !
!-------------------------------------------------------------------------
!BOP
!
! !IROUTINE: blacklist_destroy - release memory of arrays in blacklist
!
! !INTERFACE:

  subroutine blacklist_destroy
!
! !DESCRIPTION:  This routine destroys arrays from convinfo file
!
! !INPUT PARAMETERS:
!
! !OUTPUT PARAMETERS:
!
! !REVISION HISTORY:
!
!   2006-12-01  todling - initial code 
!
! attributes:
!   language: f90
!   machine:  ibm rs/6000 sp
!
! !AUTHOR:
!     prgmmr:    todling    org: np2                date: 2006-12-01
!EOP
!-------------------------------------------------------------------------
    implicit none
    integer(i_kind) ier

    deallocate(blkstns,blkkx,stat=ier)

    return
  end subroutine blacklist_destroy
  
end module blacklist