! 
!     Performs test of the I/O interface to HDF
!     Observational Data Stream files.
!
! !REVISION HISTORY: 
!     10May2000 C. Redder  Fixed subscript bug in call to ODS_Info
!                          by predefining n_kt2, n_kx2, and n_qcx2.
!
      implicit none
c      integer     ktmax
c      parameter ( ktmax      = 7 )
c      integer     kxmax
c      parameter ( kxmax      = 87 )

      include 'netcdf.inc'
      include 'ods_hdf.h'
      include 'ods_stdio.h'

c      integer     first_jday
c      parameter ( first_jday = 18000 )
      integer     str_len
      parameter ( str_len     = 50 )
      integer     mobs
      parameter ( mobs        = 65 )
      integer n_kt1,  n_kt2
      integer n_kx1,  n_kx2
      integer n_qcx1, n_qcx2

      character * (str_len) kt_names1  ( Dnkt  + 1 )
      character * (str_len) kt_units1  ( Dnkt  + 1 )
      character * (str_len) kx_names1  ( Dnkx  + 1 )
      character * (str_len) kx_meta1   ( Dnkx  + 1 )
      character * (str_len) qcx_names1 ( Dnqcx + 1 )
      character * (str_len) kt_names2  ( Dnkx  + 1 )
      character * (str_len) kt_units2  ( Dnkt  + 1 )
      character * (str_len) kx_names2  ( Dnkx  + 1 )
      character * (str_len) kx_meta2   ( Dnkx  + 1 )
      character * (str_len) qcx_names2 ( Dnqcx + 1 )
      character * (str_len) filename
      character * (str_len) version
      character * (str_len) mode
      character * (str_len) histag
      character * (str_len) type

      integer nobs1,   nobs2
      integer jday1,   jday2
      integer stime1,  stime2
      integer id1,     id2
      integer nc_id,   ktmaxid

      real    lat1     ( mobs ), lat2     ( mobs )
      real    lon1     ( mobs ), lon2     ( mobs )
      real    level1   ( mobs ), level2   ( mobs )
      integer kx1      ( mobs ), kx2      ( mobs )
      integer kt1      ( mobs ), kt2      ( mobs )
      real    xm1      ( mobs ), xm2      ( mobs )
      integer caldate1 ( mobs ), caldate2 ( mobs )
      integer caltime1 ( mobs ), caltime2 ( mobs )
      integer time1    ( mobs ), time2    ( mobs )
      real    obs1     ( mobs ), obs2     ( mobs )
      real    sigo1    ( mobs ), sigo2    ( mobs )
      integer qc_excl1 ( mobs ), qc_excl2 ( mobs )
      integer qc_hist1 ( mobs ), qc_hist2 ( mobs )

      integer nobs3,   nobs4
      integer jday3,   jday4
      integer stime3,  stime4
      integer id3,     id4

      real    lat3     ( mobs ), lat4     ( mobs )
      real    lon3     ( mobs ), lon4     ( mobs )
      real    level3   ( mobs ), level4   ( mobs )
      integer kx3      ( mobs ), kx4      ( mobs )
      integer kt3      ( mobs ), kt4      ( mobs )
      real    xm3      ( mobs ), xm4      ( mobs ), km4     ( mobs )
      integer caldate3 ( mobs ), caldate4 ( mobs )
      integer caltime3 ( mobs ), caltime4 ( mobs ), julian4 ( mobs )
      integer time3    ( mobs ), time4    ( mobs )
      real    obs3     ( mobs ), obs4     ( mobs )
      real    sigo3    ( mobs ), sigo4    ( mobs )
      integer qc_excl3 ( mobs ), qc_excl4 ( mobs )
      integer qc_hist3 ( mobs ), qc_hist4 ( mobs )

      integer first_jday, first_jday2
      integer first_date, first_date2
      integer ODS_Julian
      integer ODS_CalDat
      integer ODS_StrSize
      integer ODS_NGet
      integer len_str
      integer ierr
      integer ndim
      parameter ( ndim = 3 )

      integer nblocks, iblock 
      integer ibeg, iend
      integer start ( ndim ), count ( ndim )
      integer start_wsp ( ndim ), count_wsp ( ndim )
      integer latest_jday, latest__hour

      histag        = 'test'

      n_kt1  = Dnkt
      n_kx1  = Dnkx
      n_qcx1 = Dnqcx

      call SET_K1   ( n_kt1,  kt_names1, kt_units1,
     .                n_kx1,  kx_names1, kx_meta1,
     .                n_qcx1, qcx_names1 )

      first_date  = 19680523
      first_jday  = ODS_Julian ( first_date )
      first_date2 = ODS_CalDat ( first_jday )

      call ODS_Create ( id1, 'test1.nc','pre_anal', 
     .                  first_jday,
     .                  n_kt1,  kt_names1, kt_units1,
     .                  n_kx1,  kx_names1, kx_meta1,
     .                  n_qcx1, qcx_names1,
     .                  ierr )

      nobs1   = 20
      jday1   = first_jday
      stime1  = 0

      call Set_OBS1 ( nobs1,
     .                lat1, lon1, level1,
     .                jday1,   stime1,
     .                caldate1, caltime1,
     .                kx1, kt1, xm1,
     .                obs1, sigo1, qc_excl1, qc_hist1 )

      call ODS_Cal2Time ( id1, nobs1, caldate1, caltime1,
     .                                time1, ierr )

      call ODS_PutR ( id1,  'lat',     jday1, stime1,
     .                nobs1, lat1,     ierr )
      call ODS_PutR ( id1,  'lon',     jday1, stime1,
     .                nobs1, lon1,     ierr )
      call ODS_PutR ( id1,  'lev',     jday1, stime1,
     .                nobs1, level1,   ierr )
      call ODS_PutI ( id1,  'time',    jday1, stime1,
     .                nobs1, time1,    ierr )
      call ODS_PutI ( id1,  'kt',      jday1, stime1,
     .                nobs1, kt1,      ierr )
      call ODS_PutI ( id1,  'kx',      jday1, stime1,
     .                nobs1, kx1,      ierr )
      call ODS_PutR ( id1,  'xm',      jday1, stime1,
     .                nobs1, xm1,      ierr )
      call ODS_PutR ( id1,  'obs',     jday1, stime1,
     .                nobs1, obs1,     ierr )
c      call ODS_PutR ( id1,  'sigO',    jday1, stime1,
c     .                nobs1, sigo1,    ierr )
      call ODS_PutI ( id1,  'qcexcl',  jday1, stime1,
     .                nobs1, qc_excl1, ierr )
      call ODS_PutI ( id1,  'qchist',  jday1, stime1,
     .                nobs1, qc_hist1, ierr )

      write ( stdout, '(2x)')
      write ( stdout, 11 )
 11   format ( /' Obs set 1 written to file, test1.nc ' )
      write ( stdout, '(2x)')
      call  Print_OBS  ( n_kt1,  kt_names1, kt_units1,
     .                   n_kx1,  kx_names1, kx_meta1,
     .                   n_qcx1, qcx_names1,
     .                   nobs1,
     .                   lat1, lon1, level1,
     .                   caldate1, caltime1,
     .                   kx1, kt1, xm1,
     .                   obs1, sigo1, qc_excl1, qc_hist1 )

      nobs2   = 25
      call Set_OBS2 ( nobs2,
     .                lat2, lon2, level2,
     .                jday1,   stime1,
     .                caldate2, caltime2,
     .                kx2, kt2, xm2,
     .                obs2, sigo2, qc_excl2, qc_hist2 )

      call ODS_Cal2Time ( id1, nobs2, caldate2, caltime2,
     .                                time2, ierr )

      call ODS_Append ( id1, nobs2, ierr )

      call ODS_PutR ( id1,  'lat',     jday1, stime1,
     .                nobs2, lat2,     ierr )
      call ODS_PutR ( id1,  'lon',     jday1, stime1,
     .                nobs2, lon2,     ierr )
      call ODS_PutR ( id1,  'lev',     jday1, stime1,
     .                nobs2, level2,   ierr )
      call ODS_PutI ( id1,  'time',    jday1, stime1,
     .                nobs2, time2,    ierr )
      call ODS_PutI ( id1,  'kt',      jday1, stime1,
     .                nobs2, kt2,      ierr )
      call ODS_PutI ( id1,  'kx',      jday1, stime1,
     .                nobs2, kx2,      ierr )
      call ODS_PutR ( id1,  'xm',      jday1, stime1,
     .                nobs2, xm2,      ierr )
      call ODS_PutR ( id1,  'obs',     jday1, stime1,
     .                nobs2, obs2,     ierr )
c      call ODS_PutR ( id1,  'sigO',    jday1, stime2,
c     .                nobs2, sigo2,    ierr )
      call ODS_PutI ( id1,  'qcexcl',  jday1, stime1,
     .                nobs2, qc_excl2, ierr )
      call ODS_PutI ( id1,  'qchist',  jday1, stime1,
     .                nobs2, qc_hist2, ierr )

      id2     = id1
      jday2   = first_jday
      stime2  = 18

      call Set_OBS2 ( nobs2,
     .                lat2, lon2, level2,
     .                jday2,   stime2,
     .                caldate2, caltime2,
     .                kx2, kt2, xm2,
     .                obs2, sigo2, qc_excl2, qc_hist2 )

      call ODS_Cal2Time ( id2, nobs2, caldate2, caltime2,
     .                                time2, ierr )

      call ODS_PutR ( id2,  'lat',     jday2, stime2,
     .                nobs2, lat2,     ierr )
      call ODS_PutR ( id2,  'lon',     jday2, stime2,
     .                nobs2, lon2,     ierr )
      call ODS_PutR ( id2,  'lev',     jday2, stime2,
     .                nobs2, level2,   ierr )
      call ODS_PutI ( id2,  'time',    jday2, stime2,
     .                nobs2, time2,    ierr )
      call ODS_PutI ( id2,  'kt',      jday2, stime2,
     .                nobs2, kt2,      ierr )
      call ODS_PutI ( id2,  'kx',      jday2, stime2,
     .                nobs2, kx2,      ierr )
      call ODS_PutR ( id2,  'xm',      jday2, stime2,
     .                nobs2, xm2,      ierr )
      call ODS_PutR ( id2,  'obs',     jday2, stime2,
     .                nobs2, obs2,     ierr )
      call ODS_PutI ( id2,  'qcexcl',  jday2, stime2,
     .                nobs2, qc_excl2, ierr )
      call ODS_PutI ( id2,  'qchist',  jday2, stime2,
     .                nobs2, qc_hist2, ierr )

      call ODS_Append ( id2, nobs1, ierr )

      call ODS_PutR ( id2,  'lat',     jday2, stime2,
     .                nobs1, lat1,     ierr )
      call ODS_PutR ( id2,  'lon',     jday2, stime2,
     .                nobs1, lon1,     ierr )
      call ODS_PutR ( id2,  'lev',     jday2, stime2,
     .                nobs1, level1,   ierr )
      call ODS_PutI ( id2,  'time',    jday2, stime2,
     .                nobs1, time1,    ierr )
      call ODS_PutI ( id2,  'kt',      jday2, stime2,
     .                nobs1, kt1,      ierr )
      call ODS_PutI ( id2,  'kx',      jday2, stime2,
     .                nobs1, kx1,      ierr )
      call ODS_PutR ( id2,  'xm',      jday2, stime2,
     .                nobs1, xm1,      ierr )
      call ODS_PutR ( id2,  'obs',     jday2, stime2,
     .                nobs1, obs1,     ierr )
      call ODS_PutI ( id2,  'qcexcl',  jday2, stime2,
     .                nobs1, qc_excl1, ierr )
      call ODS_PutI ( id2,  'qchist',  jday2, stime2,
     .                nobs1, qc_hist1, ierr )

      write ( stdout, '(2x)')
      write ( stdout, 21 )
 21   format ( /' Obs set 2 written to file, test1.nc ' )
      write ( stdout, '(2x)')
      call  Print_OBS  ( n_kt1,  kt_names1, kt_units1,
     .                   n_kx1,  kx_names1, kx_meta1,
     .                   n_qcx1, qcx_names1,
     .                   nobs2,
     .                   lat2, lon2, level2,
     .                   caldate2, caltime2,
     .                   kx2, kt2, xm2,
     .                   obs2, sigo2, qc_excl2, qc_hist2 )

      id3     = id1
      nobs3   = 10
      jday3   = first_jday + 5
      stime3  = 18

      call Set_OBS3 ( nobs3,
     .                lat3, lon3, level3,
     .                jday3,   stime3,
     .                caldate3, caltime3,
     .                kx3, kt3, xm3,
     .                obs3, sigo3, qc_excl3, qc_hist3 )

      call ODS_Cal2Time ( id3, nobs3, caldate3, caltime3,
     .                                time3, ierr )

      call ODS_PutR ( id3,  'lat',     jday3, stime3,
     .                nobs3, lat3,     ierr )
      call ODS_PutR ( id3,  'lon',     jday3, stime3,
     .                nobs3, lon3,     ierr )
      call ODS_PutR ( id3,  'lev',     jday3, stime3,
     .                nobs3, level3,   ierr )
      call ODS_PutI ( id3,  'time',    jday3, stime3,
     .                nobs3, time3,    ierr )
      call ODS_PutI ( id3,  'kt',      jday3, stime3,
     .                nobs3, kt3,      ierr )
      call ODS_PutI ( id3,  'kx',      jday3, stime3,
     .                nobs3, kx3,      ierr )
      call ODS_PutR ( id3,  'xm',      jday3, stime3,
     .                nobs3, xm3,      ierr )
      call ODS_PutR ( id3,  'obs',     jday3, stime3,
     .                nobs3, obs3,     ierr )
      call ODS_PutI ( id3,  'qcexcl',  jday3, stime3,
     .                nobs3, qc_excl3, ierr )
      call ODS_PutI ( id3,  'qchist',  jday3, stime3,
     .                nobs3, qc_hist3, ierr )

      write ( stdout, '(2x)')
      write ( stdout, 31 )
 31   format ( /' Obs set 3 written to file, test1.nc ' )
      write ( stdout, '(2x)')
      call  Print_OBS  ( n_kt1,  kt_names1, kt_units1,
     .                   n_kx1,  kx_names1, kx_meta1,
     .                   n_qcx1, qcx_names1,
     .                   nobs3,
     .                   lat3, lon3, level3,
     .                   caldate3, caltime3,
     .                   kx3, kt3, xm3,
     .                   obs3, sigo3, qc_excl3, qc_hist3 )


      call ODS_Close ( id3, 'test1', ierr )

      call ODS_Open  ( id2, 'test1.nc', 'r', ierr )

      n_kt2  = Dnkt
      n_kx2  = Dnkx
      n_qcx2 = Dnqcx
      call ODS_Info  ( id2, filename, mode, version,
     .                 first_jday, latest_jday, latest__hour,
     .                 n_kt2,  kt_names2, kt_units2,
     .                 n_kx2,  kx_names2, kx_meta2,
     .                 n_qcx2, qcx_names2,
     .                 ierr )

      nobs4   = mobs
      jday3   = first_jday
      stime4  = 18

      call ODS_GetR ( id2,  'lat',     jday2, stime2,
     .                nobs4, lat4,     ierr )
      call ODS_GetR ( id2,  'lon',     jday2, stime2,
     .                nobs4, lon4,     ierr )
      call ODS_GetR ( id2,  'lev',     jday2, stime2,
     .                nobs4, level4,   ierr )
      call ODS_GetI ( id2,  'time',    jday2, stime2,
     .                nobs4, time4,    ierr )
      call ODS_GetI ( id2,  'kt',      jday2, stime2,
     .                nobs4, kt4,      ierr )
      call ODS_GetI ( id2,  'kx',      jday2, stime2,
     .                nobs4, kx4,      ierr )
      call ODS_GetR ( id2,  'xm',      jday2, stime2,
     .                nobs4, xm4,      ierr )
      call ODS_GetR ( id2,  'obs',     jday2, stime2,
     .                nobs4, obs4,     ierr )
c      call ODS_GetR ( id2,  'sigO',    jday2, stime2,
c     .                nobs4, sigo4,    ierr )
      call ODS_GetI ( id2,  'qcexcl',  jday2, stime2,
     .                nobs4, qc_excl4, ierr )
      call ODS_GetI ( id2,  'qchist',  jday2, stime2,
     .                nobs4, qc_hist4, ierr )

      call ODS_Time2Cal ( id2, nobs4, time4,
     .                                caldate4, caltime4, ierr )

      write ( stdout, '(2x)')
      write ( stdout, 41 )
 41   format ( /' Obs set 2 read form file, test1.nc ' )
      len_str = ODS_StrSize ( version )      
      write ( stdout, 42 ) version ( : len_str )
 42   format ( /'   ODS version: ', a )
      write ( stdout, '(2x)')
      call  Print_OBS  ( n_kt2,  kt_names2, kt_units2,
     .                   n_kx2,  kx_names2, kx_meta2,
     .                   n_qcx2, qcx_names2,
     .                   nobs4,
     .                   lat4, lon4, level4,
     .                   caldate4, caltime4,
     .                   kx4, kt4, xm4,
     .                   obs4, sigo4, qc_excl4, qc_hist4 )
      call ODS_CGet ( id2, ':type', type, ierr )
      len_str = ODS_StrSize ( type )
      write ( stdout, 43 ) type ( : len_str)
 43   format ( /'ODS file type is ', a )

      call ODS_Close ( id2, 'test2', ierr )

      call ODS_Open  ( id2, 'sample1.nc', 'r', ierr )

      n_kt2  = Dnkt
      n_kx2  = Dnkx
      n_qcx2 = Dnqcx
      call ODS_Info  ( id2, filename, mode, version,
     .                 first_jday, latest_jday, latest__hour,
     .                 n_kt2,  kt_names2, kt_units2,
     .                 n_kx2,  kx_names2, kx_meta2,
     .                 n_qcx2, qcx_names2,
     .                 ierr )

      nobs4   = mobs

      call ODS_GetR ( id2,  'lat',     jday2, stime2,
     .                nobs4, lat4,     ierr )
      call ODS_GetR ( id2,  'lon',     jday2, stime2,
     .                nobs4, lon4,     ierr )
      call ODS_GetR ( id2,  'lev',     jday2, stime2,
     .                nobs4, level4,   ierr )
      call ODS_GetI ( id2,  'time',    jday2, stime2,
     .                nobs4, time4,    ierr )
      call ODS_GetI ( id2,  'kt',      jday2, stime2,
     .                nobs4, kt4,      ierr )
      call ODS_GetI ( id2,  'kx',      jday2, stime2,
     .                nobs4, kx4,      ierr )
      call ODS_GetR ( id2,  'xm',      jday2, stime2,
     .                nobs4, xm4,      ierr )
      call ODS_GetR ( id2,  'obs',     jday2, stime2,
     .                nobs4, obs4,     ierr )
c      call ODS_GetR ( id2,  'sigO',    jday2, stime2,
c     .                nobs4, sigo4,    ierr )
      call ODS_GetI ( id2,  'qcexcl',  jday2, stime2,
     .                nobs4, qc_excl4, ierr )
      call ODS_GetI ( id2,  'qchist',  jday2, stime2,
     .                nobs4, qc_hist4, ierr )

      call ODS_Time2Cal ( id2, nobs4, time4,
     .                                caldate4, caltime4, ierr )

      write ( stdout, '(2x)')
      write ( stdout, 51 )
 51   format ( /' Obs set 2 read form file, test1_import.nc ' )
      len_str = ODS_StrSize ( version )      
      write ( stdout, 52 ) version ( : len_str )
 52   format ( /'   ODS version: ', a )
      write ( stdout, '(2x)')
      call  Print_OBS  ( n_kt2,  kt_names2, kt_units2,
     .                   n_kx2,  kx_names2, kx_meta2,
     .                   n_qcx2, qcx_names2,
     .                   nobs4,
     .                   lat4, lon4, level4,
     .                   caldate4, caltime4,
     .                   kx4, kt4, xm4,
     .                   obs4, sigo4, qc_excl4, qc_hist4 )

      call ODS_Close ( id2, 'test2', ierr )

      call ODS_Open  ( id2, 'sample2.nc', 'r', ierr )

      first_jday2  = first_jday
      first_jday   = 0
      n_kt2  = Dnkt
      n_kx2  = Dnkx
      n_qcx2 = Dnqcx
      call ODS_Info  ( id2, filename, mode, version,
     .                 first_jday, latest_jday, latest__hour,
     .                 n_kt2,  kt_names2, kt_units2,
     .                 n_kx2,  kx_names2, kx_meta2,
     .                 n_qcx2, qcx_names2,
     .                 ierr )

      nobs4   = 0
      jday2   = first_jday
      nobs4   = ODS_NGet ( id2, jday2, stime2, ierr )

c      call ODS_GetList ( id2, 'kx_meta', n_kx2, kx_meta2, ierr )
      call ClearList ( n_kx2,  kx_meta2 )
      call ClearList ( n_qcx2, qcx_names2 )
      call ClearRVal ( nobs4, xm4 )
      call ClearIVal ( nobs4, qc_hist4 )

      call ODS_GetR ( id2,  'lat',     jday2, stime2,
     .                nobs4, lat4,     ierr )
      call ODS_GetR ( id2,  'lon',     jday2, stime2,
     .                nobs4, lon4,     ierr )
      call ODS_GetR ( id2,  'level',   jday2, stime2,
     .                nobs4, level4,   ierr )
      call ODS_GetI ( id2,  'julian',  jday2, stime2,
     .                nobs4, julian4,  ierr )
      call ODS_GetI ( id2,  'time',    jday2, stime2,
     .                nobs4, time4,    ierr )
      call ODS_GetI ( id2,  'kt',      jday2, stime2,
     .                nobs4, kt4,      ierr )
      call ODS_GetI ( id2,  'kx',      jday2, stime2,
     .                nobs4, kx4,      ierr )
      call ODS_GetR ( id2,  'obs',     jday2, stime2,
     .                nobs4, obs4,     ierr )
      call ODS_GetI ( id2,  'qc_flag', jday2, stime2,
     .                nobs4, qc_excl4, ierr )

      call Time1toTime2 ( nobs4,   first_jday,
     .                    julian4, time4, time4 )
      julian_offset ( id2 ) = first_jday2 - 1
      call ODS_Time2Cal ( id2, nobs4, time4,
     .                    caldate4, caltime4, ierr )

      write ( stdout, '(2x)')
      write ( stdout, 61 )
 61   format ( /' Obs set 2 read form file, test1_v1_02.nc ' )
       len_str = ODS_StrSize ( version )      
       write ( stdout, 62 ) version ( : len_str )
  62   format ( /'   ODS version: ', a )
      write ( stdout, '(2x)')
      call  Print_OBS  ( n_kt2,  kt_names2, kt_units2,
     .                   n_kx2,  kx_names2, kx_meta2,
     .                   n_qcx2, qcx_names2,
     .                   nobs4,
     .                   lat4, lon4, level4,
     .                   caldate4, caltime4,
     .                   kx4, kt4, xm4,
     .                   obs4, sigo4, qc_excl4, qc_hist4 )

      call ODS_Close ( id2, 'test2', ierr )

      stop
      end

*...................................................................


      subroutine Time1toTime2 ( NVal, FirstJDay, 1
     .                          JDay, Time1, Time2 )

      implicit NONE

      integer  NVal
      integer  FirstJDay
      integer  JDay  ( NVal )
      integer  Time1 ( NVal )
      integer  Time2 ( NVal )

      integer  iVal

      do iVal = 1, NVal
         Time2 ( iVal ) =   Time1 ( iVal )
     .                  + ( JDay  ( iVal ) - FirstJDay ) * 1440

      end do

      return
      end

*...................................................................
 

      subroutine ClearList ( NList, List ) 2

      implicit NONE
      integer                    NList
      character * ( * ) List   ( NList )

      integer  iList

      do iList = 1, NList
         List ( iList ) = ' '

      end do

      return
      end
 
*...................................................................


      subroutine ClearIVal ( NVal, Val ) 1

      implicit   NONE
      integer    NVal
      integer    Val ( NVal )

      integer    iVal

      do iVal = 1, NVal
         Val ( iVal ) = 0

      end do

      return
      end
 
*...................................................................


      subroutine ClearRVal ( NVal, Val ) 1

      implicit   NONE
      integer    NVal
      real       Val ( NVal )

      integer    iVal

      do iVal = 1, NVal
         Val ( iVal ) = 0.0

      end do

      return
      end
 
*...................................................................



      subroutine Print_OBS  ( nkt, ktnames, ktunits, 6
     .                        nkx, kxnames, kxmeta,
     .                        nqcx, qcxnames,
     .                        nobs,
     .                        lat, lon, level,
     .                        caldate, caltime,
     .                        kx, kt, xm,
     .                        obs, sigo, qc_excl, qc_hist )


      implicit NONE

      integer                      nkt
      character * ( * ) ktnames  ( nkt )
      character * ( * ) ktunits  ( nkt )
      integer                      nkx
      character * ( * ) kxnames  ( nkx )
      character * ( * ) kxmeta   ( nkx )
      integer                      nqcx
      character * ( * ) qcxnames ( nqcx )
      integer                      nobs
      real              lat      ( nobs )
      real              lon      ( nobs )
      real              level    ( nobs )
      integer           caldate  ( nobs )
      integer           caltime  ( nobs )
      integer           kx       ( nobs )
      integer           kt       ( nobs )
      real              xm       ( nobs )
      real              obs      ( nobs )
      real              sigo     ( nobs )
      integer           qc_excl  ( nobs )
      integer           qc_hist  ( nobs )

      integer                      ikt
      integer                      ikx
      integer                      iqcx
      integer                      iob

      include 'ods_stdio.h'

      write ( stdout, 1 )
 1    format ( 2x )

      write ( stdout,  1 )
      write ( stdout, 11 )
      do 10, ikt = 1, nkt
         write ( stdout , 12 ) ikt, ktnames ( ikt ) ( 1 : 40 ),
     .                              ktunits ( ikt ) ( 1 : 10 )
 10   continue
 11   format ( 1x, 'ikt',
     .         2x, 'kt names', 32x,
     .         1x, 'kt units' )
 12   format ( 1x, i3,
     .         2x, a,
     .         1x, a )

      write ( stdout,  1 )
      write ( stdout, 21 )
      do 20, ikx = 1, nkx
         if ( kxnames ( ikx ) ( 1:1 ) .ne. ' ' )
     .   write ( stdout , 22 ) ikx, kxnames ( ikx ) ( 1 : 40 ),
     .                              kxmeta  ( ikx ) ( 1 : 40 )

 20   continue
 21   format ( 1x, 'ikx',
     .         2x, 'kx names', 31x,
     .         2x, 'kx meta' )
 22   format ( 1x, i3,
     .         2x, a,
     .         1x, a )

      write ( stdout,  1 )
      write ( stdout, 31 )
      do 30, iqcx = 1, nqcx
         if ( qcxnames ( iqcx ) ( 1:1 ) .ne. ' ' )
     .   write ( stdout , 32 ) iqcx, qcxnames ( iqcx ) ( 1 : 50 )

 30   continue
 31   format ( 1x, 'ikx',
     .         2x, 'qcx names' )
 32   format ( 1x, i3,
     .         2x, a )

      write ( stdout,  1 )
      write ( stdout, 41 )
      do 40, iob = 1, nobs
         write ( stdout, 42 )
     .                     iob,
     .           lat     ( iob ),
     .           lon     ( iob ),
     .           level   ( iob ),
     .           caldate ( iob ),
     .           caltime ( iob ),
     .           kx      ( iob ),
     .           kt      ( iob ),
     .           xm      ( iob ),
     .           obs     ( iob ),
     .           qc_excl ( iob ),
     .           qc_hist ( iob )
  
 40   continue
 41   format ( 1x,      'iob',
     .         1x, '     lat',
     .         1x, '     lon',
     .         1x, '   level',
     .         1x, '    date',
     .         1x,   '  time',
     .         1x,       'kx',
     .         1x,      ' kt',
     .         1x, '      xm',
     .         1x, '     obs',
     .         1x,  'QC excl',
     .         1x,  'QC hist')

 42   format ( 1x, i3,
     .         1x, f8.2,
     .         1x, f8.2,
     .         1x, f8.2,
     .         1x, i8,
     .         1x, i6,
     .         1x, i2,
     .         1x, i3,
     .         1x, f8.2,
     .         1x, f8.2,
     .         1x, i7,
     .         1x, i7 )
      return
      end

*...................................................................


      subroutine SET_K1 ( nkt,  ktnames, ktunits, 1
     .                    nkx,  kxnames, kxmeta,
     .                    nqcx, qcxnames )

      implicit NONE

      integer                      nkt
      character * ( * ) ktnames  ( nkt )
      character * ( * ) ktunits  ( nkt )
      integer                      nkx
      character * ( * ) kxnames  ( nkx )
      character * ( * ) kxmeta   ( nkx )
      integer                      nqcx
      character * ( * ) qcxnames ( nqcx )

      integer                      ikt
      integer                      ikx
      integer                      iqcx

      do 10, ikt = 1, nkt
         ktnames ( ikt ) = ' '
         ktunits ( ikt ) = ' '
 10   continue

      do 20, ikx = 1, nkx
         kxnames ( ikx ) = ' '
         kxmeta  ( ikx ) = ' '
 20   continue

      do 30, iqcx = 1, nqcx
         qcxnames ( iqcx ) = ' '
 30   continue

      ktnames   (1) = 'surface pressure $'
      ktunits   (1) = 'HPa $'
      ktnames   (2) = 'surface u-wind component $'
      ktunits   (2) = 'm/s $'
      ktnames   (3) = 'surface v-wind component $'
      ktunits   (3) = 'm/s $'
      ktnames   (4) = 'geopotential height $'
      ktunits   (4) = 'm $'
      ktnames   (5) = 'humidity (dew point) $'
      ktunits   (5) = 'K $'
      ktnames   (6) = 'u-wind component $'
      ktunits   (6) = 'm/s $'
      ktnames   (7) = 'v-wind component $'
      ktunits   (7) = 'm/s $'

      kxnames   (7) = 'rawindsonde $'
      kxmeta    (7) = 'oms_file:rawind.oms $'
      kxnames  (87) = 'tovC $'
      kxmeta   (87) = 'oms_file:tovC.oms $'

      qcxnames ( 1) = 'valid $'
      qcxnames ( 2) = 'warning $'
      qcxnames ( 3) = 'rejected by gross check $'
      qcxnames ( 4) = 'rejected by buddy check $'

      return
      end

*...................................................................



      subroutine SET_OBS  ( nobs,
     .                      lat, lon, level,
     .                      jday,   stime,
     .                      date, time,
     .                      kx, kt, xm,
     .                      obs, sigo, qc_excl, qc_hist )

      implicit NONE

      integer                     nobs
      real              lat     ( nobs )
      real              lon     ( nobs )
      real              level   ( nobs )
      integer           jday
      integer           stime
      integer           date    ( nobs )
      integer           time    ( nobs )
      integer           kx      ( nobs )
      integer           kt      ( nobs )
      real              xm      ( nobs )
      real              obs     ( nobs )
      real              sigo    ( nobs )
      integer           qc_excl ( nobs )
      integer           qc_hist ( nobs )

      integer                     iob
      integer           ODS_CalDat
      integer           sdate

      sdate = ODS_CalDat ( jday )
      do 10, iob = 1, nobs
         lat     ( iob )  = 0
         lon     ( iob )  = 0
         level   ( iob )  = 0
         date    ( iob )  = sdate
         time    ( iob )  = stime * 10000
         kx      ( iob )  = 1
         kt      ( iob )  = 1
         xm      ( iob )  = 0.0
         obs     ( iob )  = 0.0
         sigo    ( iob )  = 0.0
         qc_excl ( iob )  = 0
         qc_hist ( iob )  = 0
 10   continue

      return
      end

*...................................................................



      subroutine SET_OBS3  ( nobs, 1
     .                       lat, lon, level,
     .                       jday,   stime,
     .                       date, time,
     .                       kx, kt, xm,
     .                       obs, sigo, qc_excl, qc_hist )

      implicit NONE

      integer                     nobs
      real              lat     ( nobs )
      real              lon     ( nobs )
      real              level   ( nobs )
      integer           jday
      integer           stime
      integer           date    ( nobs )
      integer           time    ( nobs )
      integer           kx      ( nobs )
      integer           kt      ( nobs )
      real              xm      ( nobs )
      real              obs     ( nobs )
      real              sigo    ( nobs )
      integer           qc_excl ( nobs )
      integer           qc_hist ( nobs )

      integer                     iob
      integer           ODS_CalDat
      integer           sdate

      sdate = ODS_CalDat ( jday )
      do 10, iob = 1, nobs
         lat     ( iob )  = 0
         lon     ( iob )  = 0
         level   ( iob )  = 0
         date    ( iob )  = sdate
         time    ( iob )  = stime * 10000
         kx      ( iob )  = 1
         kt      ( iob )  = 1
         xm      ( iob )  = 0.0
         obs     ( iob )  = 0.0
         sigo    ( iob )  = 0.0
         qc_excl ( iob )  = 0
         qc_hist ( iob )  = 0
 10   continue

      lat     ( 1  )  = 30.12
      lon     ( 1  )  = -80.90
      level   ( 1  )  = 500.0
      kx      ( 1  )  = 7
      kt      ( 1  )  = 4
      xm      ( 1  )  = 1.5
      obs     ( 1  )  = 5263.0
      sigo    ( 1  )  = 15.0
      qc_excl ( 1  )  = 1
      qc_hist ( 1  )  = 11

      lat     ( 2  )  = 30.12
      lon     ( 2  )  = -80.90
      level   ( 2  )  = 500.0
      kx      ( 2  )  = 7
      kt      ( 2  )  = 5
      xm      ( 2  )  = 2.5
      obs     ( 2  )  = 15.0
      sigo    ( 2  )  = 2.0
      qc_excl ( 2  )  = 2
      qc_hist ( 2  )  = 22

      lat     ( 3  )  = 30.12
      lon     ( 3  )  = -80.90
      level   ( 3  )  = 500.0
      kx      ( 3  )  = 7
      kt      ( 3  )  = 6
      xm      ( 3  )  = 3.5
      obs     ( 3  )  = 11.0
      sigo    ( 3  )  = 2.0
      qc_excl ( 3  )  = 2
      qc_hist ( 3  )  = 33

      lat     ( 4  )  = 30.12
      lon     ( 4  )  = -80.90
      level   ( 4  )  = 300.0
      kx      ( 4  )  = 7
      kt      ( 4  )  = 4
      xm      ( 4  )  = 4.5
      obs     ( 4  )  = 9376.0
      sigo    ( 4  )  = 25.0
      qc_excl ( 4  )  = 5
      qc_hist ( 4  )  = 44

      lat     ( 6  )  = 30.12
      lon     ( 6  )  = -80.90
      level   ( 6  )  = 300.0
      kx      ( 6  )  = 7
      kt      ( 6  )  = 5
      xm      ( 6  )  = 6.5
      obs     ( 6  )  = 17.0
      sigo    ( 6  )  = 2.0
      qc_excl ( 6  )  = 7
      qc_hist ( 6  )  = 66

      lat     ( 7  )  = 30.12
      lon     ( 7  )  = -80.90
      level   ( 7  )  = 300.0
      kx      ( 7  )  = 7
      kt      ( 7  )  = 6
      xm      ( 7  )  = 7.5
      obs     ( 7  )  = 22.0
      sigo    ( 7  )  = 2.0
      qc_excl ( 7  )  = 2
      qc_hist ( 7  )  = 77

      lat     ( 10 )  = 45.82
      lon     ( 10 )  = 100.90
      level   ( 10 )  = 850.0
      kx      ( 10 )  = 7
      kt      ( 10 )  = 4
      xm      ( 10 )  = 10.5
      obs     ( 10 )  = 1367.0
      sigo    ( 10 )  = 2.0
      qc_excl ( 10 )  = 0
      qc_hist ( 10 )  = 111

      return
      end

*...................................................................



      subroutine SET_OBS2 ( nobs, 2
     .                      lat, lon, level,
     .                      jday,   stime,
     .                      date  , time,
     .                      kx, kt, xm,
     .                      obs, sigo, qc_excl, qc_hist )

      implicit NONE

      integer                     nobs
      real              lat     ( nobs )
      real              lon     ( nobs )
      real              level   ( nobs )
      integer           jday
      integer           stime
      integer           date    ( nobs )
      integer           time    ( nobs )
      integer           kx      ( nobs )
      integer           kt      ( nobs )
      real              xm      ( nobs )
      real              obs     ( nobs )
      real              sigo    ( nobs )
      integer           qc_excl ( nobs )
      integer           qc_hist ( nobs )

      integer                     iob
      integer           ODS_CalDat
      integer           sdate

      sdate = ODS_CalDat ( jday )
      do 10, iob = 1, nobs
         lat     ( iob )  = 0
         lon     ( iob )  = 0
         level   ( iob )  = 0
         date    ( iob )  = sdate
         time    ( iob )  = stime * 10000
         kx      ( iob )  = 1
         kt      ( iob )  = 1
         xm      ( iob )  = 0.0
         obs     ( iob )  = 0.0
         sigo    ( iob )  = 0.0
         qc_excl ( iob )  = 0
         qc_hist ( iob )  = 0
 10   continue

      lat     ( 1  )  = 30.12
      lon     ( 1  )  = -80.90
      level   ( 1  )  = 500.0
      kx      ( 1  )  = 7
      kt      ( 1  )  = 4 
      xm      ( 1  )  = 2.01
      obs     ( 1  )  = 5371.0
      sigo    ( 1  )  = 15.0
      qc_excl ( 1  )  = 0
      qc_hist ( 1  )  = 2

      lat     ( 2  )  = 30.12
      lon     ( 2  )  = -80.90
      level   ( 2  )  = 500.0
      kx      ( 2  )  = 7
      kt      ( 2  )  = 5
      xm      ( 2  )  = 1.2
      obs     ( 2  )  = 12.0
      sigo    ( 2  )  = 2.0
      qc_excl ( 2  )  = 1
      qc_hist ( 2  )  = 7

      lat     ( 3  )  = 30.12
      lon     ( 3  )  = -80.90
      level   ( 3  )  = 500.0
      kx      ( 3  )  = 7
      kt      ( 3  )  = 6
      xm      ( 3  )  = 4.0
      obs     ( 3  )  = 18.0
      sigo    ( 3  )  = 2.0
      qc_excl ( 3  )  = 0
      qc_hist ( 3  )  = 2

      lat     ( 4  )  = 30.12
      lon     ( 4  )  = -80.90
      level   ( 4  )  = 300.0
      kx      ( 4  )  = 7
      kt      ( 4  )  = 4
      xm      ( 4  )  = 7.1
      obs     ( 4  )  = 9485.0
      sigo    ( 4  )  = 25.0
      qc_excl ( 4  )  = 1
      qc_hist ( 4  )  = 23

      lat     ( 6  )  = 30.12
      lon     ( 6  )  = -80.90
      level   ( 6  )  = 300.0
      kx      ( 6  )  = 7
      kt      ( 6  )  = 5
      xm      ( 6  )  = 15.1
      obs     ( 6  )  = 28.0
      sigo    ( 6  )  = 2.0
      qc_excl ( 6  )  = 2
      qc_hist ( 6  )  = 2

      lat     ( 7  )  = 30.12
      lon     ( 7  )  = -80.90
      level   ( 7  )  = 300.0
      kx      ( 7  )  = 7
      kt      ( 7  )  = 6
      xm      ( 7  )  = 21.01
      obs     ( 7  )  = 6.0
      sigo    ( 7  )  = 2.0
      qc_excl ( 7  )  = 0
      qc_hist ( 7  )  = 7

      lat     ( 10 )  = 45.82
      lon     ( 10 )  = 100.90
      level   ( 10 )  = 850.0
      kx      ( 10 )  = 7
      kt      ( 10 )  = 4
      xm      ( 10 )  = 14.0
      obs     ( 10 )  = 1492.0
      sigo    ( 10 )  = 2.0
      qc_excl ( 10 )  = 1
      qc_hist ( 10 )  = 2

      lat     ( 13 )  = 45.82
      lon     ( 13 )  = 100.90
      level   ( 13 )  = 850.0
      kx      ( 13 )  = 7
      kt      ( 13 )  = 5
      xm      ( 13 )  = 66.02
      obs     ( 13 )  = 281.0
      sigo    ( 13 )  = 1.0
      qc_excl ( 13 )  = 1
      qc_hist ( 13 )  = 15

      lat     ( 15 )  = 45.82
      lon     ( 15 )  = 100.90
      level   ( 15 )  = 500.0
      kx      ( 15 )  = 7
      kt      ( 15 )  = 6
      xm      ( 15 )  = 6.2
      obs     ( 15 )  = 21.0
      sigo    ( 15 )  = 2.0
      qc_excl ( 15 )  = 1
      qc_hist ( 15 )  = 22

      lat     ( 16 )  = 45.82
      lon     ( 16 )  = 100.90
      level   ( 16 )  = 500.0
      kx      ( 16 )  = 7
      kt      ( 16 )  = 7
      xm      ( 16 )  = 1.1
      obs     ( 16 )  = 18.0
      sigo    ( 16 )  = 2.0
      qc_excl ( 16 )  = 3
      qc_hist ( 16 )  = 18

      lat     ( 17 )  = 45.82
      lon     ( 17 )  = 100.90
      level   ( 17 )  = 500.0
      kx      ( 17 )  = 7
      kt      ( 17 )  = 5
      xm      ( 17 )  = 13.7
      obs     ( 17 )  = 274.0
      sigo    ( 17 )  = 2.0
      qc_excl ( 17 )  = 1
      qc_hist ( 17 )  = 75

      lat     ( 20 )  = 45.82
      lon     ( 20 )  = 100.90
      level   ( 20 )  = 300.0
      kx      ( 20 )  = 7
      kt      ( 20 )  = 4
      xm      ( 20 )  = 1.0
      obs     ( 20 )  = 9355.0
      sigo    ( 20 )  = 25.0
      qc_excl ( 20 )  = 2
      qc_hist ( 20 )  = 15

      lat     ( 21 )  = 10.51
      lon     ( 21 )  = -71.44
      level   ( 21 )  = 850.0
      kx      ( 21 )  = 7
      kt      ( 21 )  = 4
      xm      ( 21 )  = 4.0
      obs     ( 21 )  = 1655.0
      sigo    ( 21 )  = 7.0
      qc_excl ( 21 )  = 1
      qc_hist ( 21 )  = 19

      lat     ( 23 )  = 10.51
      lon     ( 23 )  = -70.44
      level   ( 23 )  = 700.0
      kx      ( 23 )  = 7
      kt      ( 23 )  = 4
      xm      ( 23 )  = -6.21
      obs     ( 23 )  = 2985.0
      sigo    ( 23 )  = 8.0
      qc_excl ( 23 )  = 4
      qc_hist ( 23 )  = 22

      lat     ( 25 )  = 10.51
      lon     ( 25 )  = -70.44
      level   ( 25 )  = 500.0
      kx      ( 25 )  = 7
      kt      ( 25 )  = 4
      xm      ( 25 )  = 5.11
      obs     ( 25 )  = 5850.0
      sigo    ( 25 )  = 10.0
      qc_excl ( 25 )  = 1
      qc_hist ( 25 )  = 44

 
      return
      end

*...................................................................



      subroutine SET_OBS1 ( nobs, 1
     .                      lat, lon, level,
     .                      jday,   stime,
     .                      date  , time,
     .                      kx, kt, xm,
     .                      obs, sigo, qc_excl, qc_hist )

      implicit NONE

      integer                     nobs
      real              lat     ( nobs )
      real              lon     ( nobs )
      real              level   ( nobs )
      integer           jday
      integer           stime
      integer           date    ( nobs )
      integer           time    ( nobs )
      integer           kx      ( nobs )
      integer           kt      ( nobs )
      real              xm      ( nobs )
      real              obs     ( nobs )
      real              sigo    ( nobs )
      integer           qc_excl ( nobs )
      integer           qc_hist ( nobs )

      integer                     iob
      integer           ODS_CalDat
      integer           sdate

      sdate = ODS_CalDat ( jday )
      do 10, iob = 1, nobs
         lat     ( iob )  = 0
         lon     ( iob )  = 0
         level   ( iob )  = 0
         date    ( iob )  = sdate
         time    ( iob )  = stime * 10000
         kx      ( iob )  = 1
         kt      ( iob )  = 1
         xm      ( iob )  = 0.0
         obs     ( iob )  = 0.0
         sigo    ( iob )  = 0.0
         qc_excl ( iob )  = 0
         qc_hist ( iob )  = 0
 10   continue

      lat     ( 1  )  = 30.12
      lon     ( 1  )  = -80.90
      level   ( 1  )  = 500.0
      kx      ( 1  )  = 7
      kt      ( 1  )  = 4
      xm      ( 1  )  = 1.1
      obs     ( 1  )  = 5432.0
      sigo    ( 1  )  = 15.0
      qc_excl ( 1  )  = 2
      qc_hist ( 1  )  = 5

      lat     ( 4  )  = 30.12
      lon     ( 4  )  = -80.90
      level   ( 4  )  = 300.0
      kx      ( 4  )  = 7
      kt      ( 4  )  = 4
      xm      ( 4  )  = 2.2
      obs     ( 4  )  = 9522.0
      sigo    ( 4  )  = 25.0
      qc_excl ( 4  )  = 3
      qc_hist ( 4  )  = 2

      lat     ( 6  )  = 30.12
      lon     ( 6  )  = -80.90
      level   ( 6  )  = 300.0
      kx      ( 6  )  = 7
      kt      ( 6  )  = 5
      xm      ( 6  )  = 5.0
      obs     ( 6  )  = 22.0
      sigo    ( 6  )  = 2.0
      qc_excl ( 6  )  = 1
      qc_hist ( 6  )  = 17

      lat     ( 7  )  = 30.12
      lon     ( 7  )  = -80.90
      level   ( 7  )  = 300.0
      kx      ( 7  )  = 7
      kt      ( 7  )  = 5
      xm      ( 7  )  = 22.01
      obs     ( 7  )  = 15.0
      sigo    ( 7  )  = 2.0
      qc_excl ( 7  )  = 4
      qc_hist ( 7  )  = 1

      lat     ( 10 )  = 45.82
      lon     ( 10 )  = 100.90
      level   ( 10 )  = 850.0
      kx      ( 10 )  = 7
      kt      ( 10 )  = 4
      xm      ( 10 )  = -2.1
      obs     ( 10 )  = 1524.0
      sigo    ( 10 )  = 2.0
      qc_excl ( 10 )  = 1
      qc_hist ( 10 )  = 200

      lat     ( 15 )  = 45.82
      lon     ( 15 )  = 100.90
      level   ( 15 )  = 500.0
      kx      ( 15 )  = 7
      kt      ( 15 )  = 6
      xm      ( 15 )  = 33.0
      obs     ( 15 )  = 17.0
      sigo    ( 15 )  = 2.0
      qc_excl ( 15 )  = 2
      qc_hist ( 15 )  = 16

      lat     ( 16 )  = 45.82
      lon     ( 16 )  = 100.90
      level   ( 16 )  = 500.0
      kx      ( 16 )  = 7
      kt      ( 16 )  = 7
      xm      ( 16 )  = 21.0
      obs     ( 16 )  = 13.0
      sigo    ( 16 )  = 2.0
      qc_excl ( 16 )  = 1
      qc_hist ( 16 )  = 4

      lat     ( 17 )  = 45.82
      lon     ( 17 )  = 100.90
      level   ( 17 )  = 500.0
      kx      ( 17 )  = 7
      kt      ( 17 )  = 5
      xm      ( 17 )  = 1.05
      obs     ( 17 )  = 268.0
      sigo    ( 17 )  = 2.0
      qc_excl ( 17 )  = 4
      qc_hist ( 17 )  = 2

      lat     ( 20 )  = 45.82
      lon     ( 20 )  = 100.90
      level   ( 20 )  = 300.0
      kx      ( 20 )  = 7
      kt      ( 20 )  = 4
      xm      ( 20 )  = 0.1
      obs     ( 20 )  = 9522.0
      sigo    ( 20 )  = 25.0
      qc_excl ( 20 )  = 1
      qc_hist ( 20 )  = 8

      return
      end

*....................................................................



      subroutine ODS_Info ( id,        filename,   mode, version, 3,34
     .                      FirstJDay, LatestJDay, LatestHour,
     .                      n_kt,      kt_names,   kt_units,
     .                      n_kx,      kx_names,   kx_meta,
     .                      n_qcx,     qcx_names,  ierr )

      implicit NONE

!-------------------------------------------------------------------------
!         NASA/GSFC, Data Assimilation Office, Code 910.3, GEOS/DAS      !
!-------------------------------------------------------------------------
!
! !ROUTINE:  ODS_Info() --- Returns information about an opened
!                           ODS file
! 
! !DESCRIPTION:
!     Returns the NetCDF and file status parameters
!
! !INTERFACE: 
!     call ODS_Info  ( id,        filename,   mode, version,
!                      FirstJDay, LatestJDay, LatestHour
!                      n_kt,      kt_names,   kt_units,
!                      n_kx,      kx_names,   kx_meta,
!                      n_qcx,     qcx_names,
!                      ierr )
!
!
! !INPUT PARAMETERS:
      integer          id             ! ODS file handle (file id)
                                      !   use this to refer to this
                                      !   file later on.

! !INPUT/OUTPUT PARAMETERS:
      integer          n_kt           ! on input: the maximum value
                                      !   allowed for this integer
                                      !   (usually determined by
                                      !   the space allocated for
                                      !   storage)
                                      ! on output: for maximum
                                      !   number of GEOS/DAS data
     .                                !   types
      integer          n_kx           ! on input: the maximum value
                                      !   allowed for this integer
                                      !   (usually determined by
                                      !   the space allocated for
                                      !   storage)
                                      ! on output: for maximum
                                      !   number of GEOS/DAS data
     .                                !   sources
      integer          n_qcx          ! on input: the maximum value
                                      !   allowed for this integer
                                      !   (usually determined by
                                      !   the space allocated for
                                      !   storage)
                                      ! on output: for maximum
                                      !   number of possible 
                                      !   values for the quality
                                      !   control exclusion mark
                                      !   (qcexcl)
                                      ! note: If the input values
                                      !   for either nkt, kx or
                                      !   nqcx is smaller than
                                      !   the number of values to
                                      !   be read, then the routine
                                      !   exits with a system error
                                      !   message and a code of
                                      !   ODS_DimErr ( = -3 ).
                                      !   Also, nkt, nkx and/or
                                      !   nqcx are set to the
                                      !   minimum value required
                                      !   in order for the routine
                                      !   to execute successfully.
!
! !OUTPUT PARAMETERS:
      character * (*)  filename       ! name of ODS file
      character * (*)  mode           ! mode = 'w' open for writing
                                      ! mode = 'r' open for reading 
      character * (*)  version        ! version tag
      integer          FirstJDay      ! first julian day on file
      integer          LatestJDay     ! latest julian day for which
                                      !   data exists
      integer          LatestHour     ! latest julian hour for which
                                      !   data exists
      character * (*)  kt_names  ( n_kt )
                                      ! name for each data type
      character * (*)  kt_units  ( n_kt )
                                      ! units for each data type
      character * (*)  kx_names  ( n_kx )
                                      ! name for each data source
      character * (*)  kx_meta   ( n_kx )
                                      ! kx specific metadata information
                                      !   Use this to specify the
                                      !   meaning of the parameter "xm"
                                      !   or to specify the name of the
                                      !   external OMS file name.
                                      !   e.g. "oms_file:myinstr.oms"
      character * (*)  qcx_names ( n_qcx ) 
                                      ! information about the meaning
                                      !   of the variable, "qcexcl".
      integer          ierr           ! Error code. If non-zero, an 
                                      !   error has occurred. For a list
                                      !   of possible values see Table 8
                                      !   of da Silva and Redder (1995).
                                      !   If an error has occurred, then
                                      !   file was closed.
!
!     NOTE: No more than id_max ( as defined in header file ods_hdf.h )
!           files can be opened at any one time.  Use the function
!           ODS_Julian to obtain the input parameters, FirstJDay, and
!           LatestJDay.
!
! !SEE ALSO:
!     ODS_Create()   creates the ODS file, sets the dimensions
!                    and saves the text data for kt_names, kt_units
!                    and kx_names. 
!
!
! !REVISION HISTORY:
!     09Apr1998   Redder    Original code.
!
!-------------------------------------------------------------------------

      include  'ods_hdf.h'
      include  'netcdf.inc'
      include  'ods_stdio.h'

*     Function referenced
*     -------------------
      integer   ODS_VerIndex  ! determines the ODS version
                              !  index number

*     Other variables
*     ---------------
      integer   str_len       ! string length for each name
     .                        !  and unit
      integer   ierr_temp     ! temporary storage for the
                              !  returned error code
      integer   version_index ! version index number
      integer   version_2     ! index number for version 2.00

*     Set ierr code to valid 
*     ----------------------
      ierr    = NCNoErr

*     Check to determine if the file handle id is valid
*     -------------------------------------------------
      if ( id            .lt. 1      .or.
     .     id            .gt. id_max .or.
     .     IOMode ( id ) .eq. CLOSED ) then
         write ( stderr, 901 )
         ierr = NCEBadID
         return
      end if

*     Get ODS file name
*     -----------------
      call ODS_CGet    ( id, ':filename',   filename,    ierr )
      if ( ierr .ne. NCNoErr ) return

*     Get mode (read or write)
*     ------------------------
      call ODS_CGet    ( id, ':mode',       mode,        ierr )
      if ( ierr .ne. NCNoErr ) return

*     Get ODS version number
*     ----------------------
      call ODS_CGet    ( id, ':version',    version,     ierr )
      if ( ierr .ne. NCNoErr ) return
      version_index = ODS_VerIndex ( version, ierr )

*     Get some NetCDF file dimensions and parameters from ODS
*     -------------------------------------------------------
      version_2     = ODS_VerIndex ( '2.00', ierr )
      if ( ierr .ne. NCNoErr ) return

      if ( version_index .ge. version_2 ) then
         call ODS_IGet    ( id, 'nkt',      n_kt,        ierr )
         if ( ierr .ne. NCNoErr ) return
         call ODS_IGet    ( id, 'nkx',      n_kx,        ierr )
         if ( ierr .ne. NCNoErr ) return
         call ODS_IGet    ( id, 'nqcx',     n_qcx,       ierr )
         if ( ierr .ne. NCNoErr ) return

      else
         call ODS_IGet    ( id, 'ktmax',    n_kt,        ierr )
         if ( ierr .ne. NCNoErr ) return
         call ODS_IGet    ( id, 'kxmax',    n_kx,        ierr )
         if ( ierr .ne. NCNoErr ) return

      end if

      call ODS_IGet    ( id, 'strlen',      str_len,     ierr )
      if ( ierr .ne. NCNoErr ) return
      call ODS_IGet    ( id, 'syn_beg:first_julian_day',  
     .                                      FirstJDay,   ierr )
      if ( ierr .ne. NCNoErr ) return
      call ODS_IGet    ( id, 'syn_beg:latest_julian_day',
     .                                      LatestJDay,  ierr )
      if ( ierr .ne. NCNoErr ) return
      call ODS_IGet    ( id, 'syn_beg:latest_synoptic_hour',
     .                                      LatestHour,  ierr )
      if ( ierr .ne. NCNoErr ) return

*     Read the text labels for data types and sources currently
*     available and quality control codes currently implemented
*     ---------------------------------------------------------
      call ODS_GetList ( id, 'kt_names', n_kt, kt_names, ierr )
      if ( ierr .ne. NCNoErr ) return
      call ODS_GetList ( id, 'kt_units', n_kt, kt_units, ierr )
      if ( ierr .ne. NCNoErr ) return
      call ODS_GetList ( id, 'kx_names', n_kx, kx_names, ierr )
      if ( ierr .ne. NCNoErr ) return

*     Read these tables only if the file corre-
*     sponds to one of the later versions
*     -----------------------------------------
      if ( version_index .ge. version_2 ) then
         call ODS_GetList
     .               ( id, 'kx_meta',   n_kx,  kx_meta,   ierr )
         if ( ierr .ne. NCNoErr ) return
         call ODS_GetList
     .               ( id, 'qcx_names', n_qcx, qcx_names, ierr )
         if ( ierr .ne. NCNoErr ) return

      end if

      return
*     ------

 901  format ( /, ' ODS_Info: File handle id number does not ',
     .         /, '           correspond to an opened ODS file' )

      end
*....................................................................