// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
// ** Copyright UCAR (c) 1992 - 2007
// ** University Corporation for Atmospheric Research (UCAR)
// ** National Center for Atmospheric Research (NCAR)
// ** Research Applications Lab (RAL)
// ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA
// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

////////////////////////////////////////////////////////////////////////

#ifndef  __VX_READ_GRIB_RECORD_H__
#define  __VX_READ_GRIB_RECORD_H__

////////////////////////////////////////////////////////////////////////

#include "vx_met_util/constants.h"
#include "vx_grib_classes/grib_classes.h"
#include "vx_data_grids/grid.h"
#include "vx_wrfdata/vx_wrfdata.h"
#include "vx_math/vx_math.h"

////////////////////////////////////////////////////////////////////////

extern int    has_grib_code(GribFile &, int);

extern int    get_grib_record(GribFile &, GribRecord &, int, int, int,
                 WrfData &, Grid &, int &,
                 PlateCarreeData &, LambertData &, StereographicData &);

extern int    find_grib_record(GribFile &, int, int, int);
extern int    find_grib_record_levels(GribFile &, int, int, int, int *, int *);

extern void   read_grib_record(const char *, GribRecord &, int, WrfData &, Grid &, int,
                 PlateCarreeData &, LambertData &, StereographicData &);
extern void   read_grib_record(GribFile &, GribRecord &, int, WrfData &, Grid &, int,
                 PlateCarreeData &, LambertData &, StereographicData &);
extern void   read_single_grib_record(GribFile &, GribRecord &, int, WrfData &, Grid &, int,
                 PlateCarreeData &, LambertData &, StereographicData &);

extern void   derive_wdir_record(GribFile &, GribRecord &, WrfData &, Grid &, int, int, int,
                 PlateCarreeData &, LambertData &, StereographicData &);
extern void   derive_wind_record(GribFile &, GribRecord &, WrfData &, Grid &, int, int, int,
                 PlateCarreeData &, LambertData &, StereographicData &);

extern void   read_pds(GribRecord &, int &, unixtime &, unixtime &, int &);
extern void   read_gds(GribRecord &, Grid &, int &, int &, int &,
                 PlateCarreeData &, LambertData &, StereographicData &);

extern double decode_lat_lon(unsigned char *, int);

extern int    all_bits_set(unsigned char *, int);

extern void   get_level_info(const GribRecord &, int &, int &);

extern int    is_grid_relative(const GribRecord &);

extern int    get_bit_from_octet(unsigned char, int);

extern void   rotate_uv_grid_to_earth(const Grid &, const WrfData &, const WrfData &, 
                 WrfData &, WrfData &,
                 const PlateCarreeData &, const LambertData &, const StereographicData &);

extern void   rotate_wdir_grid_to_earth(const Grid &, const WrfData &, WrfData &,
                 const PlateCarreeData &, const LambertData &, const StereographicData &);

////////////////////////////////////////////////////////////////////////

#endif   //  __VX_READ_GRIB_RECORD_H__

////////////////////////////////////////////////////////////////////////

