GRIB file format support in GDL is implemented using the ECMWF ecCodes library
(the legacy ECMWF GRIB_API library is supported as well). 

Naming of GDL routines resembles the one from F90 GRIB API interface 
(it was developed prior to appearance of GRIB support in IDL).

The routines are not documented for the moment so please:
- refer to ecCodes API manual for explanation,
- look in the testsuite/test_grib.pro file for an example of usage,
- read the following few lines.

Currently the followng routines are implemented:

* GRIB files related:
    file_id = grib_open_file(filename)               | opens a file and returns an id that is used to refer to it
    grib_count_in_file(file_id)                      | returns the number of messages in file
    grib_close_file, file_id                         | closes a file 
* GRIB messages related:                             |
    mesg_id = grib_new_from_file(file_id)            | decodes a message into memory (multiple calls yield subsequent messages)
    grib_release, mesg_id                            | frees the decoded message from memory
    mesg_id = grib_clone(another_mesg_id)            | clones a message
* routines for extracting data from GRIB messages:   |
    grib_get, mesg_id, keyname, values               | extracts data associated with "keyname" into variable _values_
    grib_get_data, mesg_id, lats, lons, data         | extracts the "values" key into variable _data_ placing the latitude, 
                                                     | longitude values in variables _lats_ and _lons_
    grib_get_size, mesg_id, keyname                  | returns number of elements in the "keyname"

In the above list:
- mesg_id, file_id are id numbers similiar to these returned by ncdf_open or hdf_sd_start
- keyname is a string, for example "values" or "numberOfPointsAlongAParallel"
- lats, lons, values are ment to be identifiers of variables that will be fed with data

The table below tries to summarize how the GDL interface relates to Fortran and C interfaces.
(the table is still not complete)

      ._ this column shows if the routine is implemented in GDL 
     /    (,,!'' indicates known problems with implementation)
    |
--- | ---------------------------------------------------------------------- 
  | V   GDL fun/pro          |   F90 counterpart       |  C routines called
----------------------------------------------------------------------------
F | + grib_open_file()       | grib_open_file          | fopen
I | -   /ro, /rw             |   mode                  |
L | + grib_close_file()      | grib_close_file         | fclose
E | + grib_count_in_file()   | grib_count_in_file      | grib_count_in_file
----------------------------------------------------------------------------
M | + grib_new_from_file     | grib_new_from_file      | grib_handle_new_from_file
E | - grib_new_from_message  | grib_new_from_message   | grib_handle_new_from_message (...multi_message?, ..._message_copy)
S | - grib_new_from_template | grib_new_from_template  | grib_handle_new_from_template 
S | + grib_release           | grib_release            | grib_handle_delete
A | + grib_clone             | grib_clone              | grib_handle_clone
G | ! grib_get_message_size  |
E | - grib_copy_message      |
  | - grib_write             |
----------------------------------------------------------------------------
D | + grib_get_data          | grib_get_data           | grib_iterator_new
A | +                        |                         | grib_iterator_next
T | +                        |                         | grib_iterator_delete
A | +                        |                         | ... GDL::grib_get_data
  | -   /float               | grib_get_data_real4     |
  | -   /double              | grib_get_data_real8     |
  | + grib_get_size          | 
  | - grib_get_offset
  | - grib_get_element
  | + grib_get               | grib_get                | grib_get_long
  | +                        |                         | grib_get_long_array
  | +                        |                         | grib_get_double
  | +                        |                         | grib_get_double_array
  | -   missing=             | grib_set_missing        |
  | -   offset=, count=      | grib_get_element        |
  | - grib_set               | grib_set                |
------------------------------------------------------------------------
N |                          | grib_find_nearest
E |
A |
R |
E |
S |
T |
------------------------------------------------------------------------
K | - grib_keys              | grib_keys_iterator_new
E | -                        | grib_keys_iterator_next
Y | -                        | grib_keys_iterator_delete
S | -                        | grib_keys_iterator_get_name
  | -                        | grib_keys_iterator_rewind
  | -   /skip_readonly       | grib_skip_readonly  
  | -   /skip_duplicates     | grib_skip_duplicates
  | -   /skip_coded          | grib_skip_coded
  | -   /skip_computed       | grib_skip_computed
------------------------------------------------------------------------
N |                          | grib_check             | 
/ |                          | grib_dump              |
A |                          | 
