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


module varNameList_mod 5,1
  use bufr
  implicit none
  save
  private

  ! public variables (parameters)
  public :: vnl_numvarmax3D,vnl_numvarmax2D,vnl_numvarmax,vnl_varNameList3D,vnl_varNameList2D,vnl_varNameList
  ! public procedures
  public :: vnl_varListIndex3d,vnl_varListIndex2d,vnl_varListIndex,vnl_varnameFromVarnum
  public :: vnl_vartypeFromVarname,vnl_vartypeFromVarnum


  integer, parameter          :: vnl_numvarmax3D=23,vnl_numvarmax2D=4

  character(len=4), parameter :: vnl_varNameList3D(vnl_numvarmax3D) = (/'UU  ','VV  ','GZ  ','TT  ','HU  ','LQ  ','ES  ','VT  ', &
                                 'PP  ','CC  ','UC  ','UT  ','TB  ','DW  ','O3  ','CH4 ','CO2 ','CO  ','NO2 ','N2O ','HCHO','SO2 ','NH3 ' /)

  character(len=2), parameter :: varTypeList3D(vnl_numvarmax3D) = (/'MM',  'MM',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH', &
                                 'MM',  'MM',  'MM',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH',  'TH'/)

  character(len=4), parameter :: vnl_varNameList2D(vnl_numvarmax2D) = (/'P0  ','TG  ','UP  ','PB  '/)

  character(len=2), parameter :: varTypeList2D(vnl_numvarmax2D) = (/'SF',  'SF',  'SF',  'SF'/)

  integer, parameter          :: vnl_numvarmax=vnl_numvarmax3D+vnl_numvarmax2D
  character(len=4), parameter :: vnl_varNameList(vnl_numvarmax) = (/ vnl_varNameList3D, vnl_varNameList2D /)
  character(len=2), parameter :: varTypeList(vnl_numvarmax) = (/ varTypeList3D, varTypeList2D /)

  contains


    function vnl_varListIndex3d(varName) result(listIndex),1
      implicit none
      character(len=*), intent(in) :: varName
      integer                      :: jvar,listIndex

      listIndex=-1
      do jvar=1,vnl_numvarmax3D
        if(varName.eq.vnl_varNameList3d(jvar)) then
          listIndex=jvar
          exit
        endif
      enddo

      if(listIndex.le.0) then
        call abort3d('vnl_varListIndex3D: Unknown variable name! ' // varName)
      endif

    end function vnl_varListIndex3d



    function vnl_varListIndex2d(varName) result(listIndex),1
      implicit none
      character(len=*), intent(in) :: varName
      integer                      :: jvar,listIndex

      listIndex=-1
      do jvar=1,vnl_numvarmax2D
        if(varName.eq.vnl_varNameList2d(jvar)) then 
          listIndex=jvar
          exit
        endif
      enddo

      if(listIndex.le.0) then
        call abort3d('vnl_varListIndex2D: Unknown variable name! ' // varName)
      endif

    end function vnl_varListIndex2d



    function vnl_varListIndex(varName) result(listIndex) 15,1
      implicit none
      character(len=*), intent(in) :: varName
      integer                      :: jvar,listIndex

      listIndex=-1
      do jvar=1,vnl_numvarmax
        if(varName.eq.vnl_varNameList(jvar)) then 
          listIndex=jvar
          exit
        endif
      enddo

      if(listIndex.le.0) then
        call abort3d('vnl_varListIndex: Unknown variable name! ' // varName)
      endif

    end function vnl_varListIndex



    function vnl_varnameFromVarnum(varNumber,varTrNumber) result(varName) 4,3
      implicit none
      integer, intent(in) :: varNumber
      integer, intent(in), optional :: varTrNumber
      character(len=4)    :: varName

      varName='    '
      select case (varNumber)
      case(BUFR_NEUU,BUFR_NEUS)
        varName='UU'
      case(BUFR_NEVV,BUFR_NEVS)
        varName='VV'
      case(BUFR_NETT,BUFR_NETS)
        varName='TT'
      case(BUFR_NEDZ,BUFR_NEGZ)
        varName='GZ'
      case(BUFR_NEHU,BUFR_NEHS,BUFR_NEES,BUFR_NESS)
        varName='HU'
      case(BUFR_NEPS,BUFR_NEPN)
        varName='P0'
      case(BUFR_NERF,BUFR_NEBD,BUFR_NEZD)
        varName='TT'   ! temporarily associate refractivity and ZTD with temperature
      case(BUFR_NEDW)
        varName='DW'
      case(BUFR_NETR)
        if (present(varTrNumber)) then      
           select case (varTrNumber)
           case(BUFR_NETR_O3)
              varname='O3'
           case(BUFR_NETR_H2O)
              varname='HU'
           case(BUFR_NETR_CH4)
              varname='CH4'
           case(BUFR_NETR_CO2)
              varname='CO2'
           case(BUFR_NETR_CO)
              varname='CO'
           case(BUFR_NETR_NO2)
              varname='NO2'
           case(BUFR_NETR_N2O)
              varname='N2O'
           case(BUFR_NETR_HCHO)
              varname='HCHO'
           case(BUFR_NETR_SO2)
              varname='SO2'
           case default
              write(*,*) 'vnl_varnameFromVarnum: Unknown TR variable number! ',varTrNumber
              call abort3d('aborting in vnl_varnameFromVarnum')
           end select
        else
           call abort3d('vnl_varnameFromVarnum: Missing TR variable number ')
        endif 
      case default
        write(*,*) 'vnl_varnameFromVarnum: Unknown variable number! ',varNumber
        call abort3d('aborting in vnl_varnameFromVarnum')
      end select

    end function vnl_varnameFromVarnum



    function vnl_vartypeFromVarname(varName) result(varType) 23,1
      implicit none

      character(len=*), intent(in)   :: varName
      character(len=2)               :: varType

      varType = varTypeList(vnl_varListIndex(varName))

    end function vnl_vartypeFromVarname



    function vnl_vartypeFromVarnum(varNumber,varTrNumber) result(varType) 19,3
      implicit none

      integer, intent(in)           :: varNumber
      integer, intent(in), optional :: varTrNumber
      character(len=2)              :: varType
      character(len=4)              :: varName

      if (present(varTrNumber)) then      
         varName = vnl_varnameFromVarnum(varNumber,varTrNumber)
      else 
         varName = vnl_varnameFromVarnum(varNumber)
      endif 
      varType = varTypeList(vnl_varListIndex(varName))

    end function vnl_vartypeFromVarnum


end module varNameList_mod