Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Types | Protected Member Functions | Protected Attributes

ECMWFFileData Class Reference

Inheritance diagram for ECMWFFileData:
Inheritance graph
[legend]
Collaboration diagram for ECMWFFileData:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 ECMWFFileData (const string &name, const string &mode="r")
 constructor
 ~ECMWFFileData ()
 destructor
void free_geolocation_data ()
 free eventually loaded data. Not used here, only for interface compatibility
const bool get_index (const float &lat, const float &lon, const double &time, int *indexes)
 find the index of the nearest point to (lat,lon,time) in the data. time is ignored for ECMWF files because only one time level is used
const bool get_index (const float &lat, const float &lon, int *indexes)
 find the index of the nearest point to (lat,lon) in the data. If (lat,lon,time) is not contained in this file, returned indexes are [-1,-1]
const bool get_index (const float &lat, const float &lon, const float &p_lvl, int *indexes)
 find the index of the nearest point to (lat,lon, p_lvl) in the data.
const int get_lat_index (const float &lat) const
 return the index of the grid point that has the nearest latitude to lat
const int get_lon_index (const float &lon) const
 return the index of the grid point that has the nearest longitude to lon
const float32 get_lat (const int &i_y) const
 return the latitude of the grid point at indice i_y
const float32 get_lon (const int &i_x) const
 return the longitude of the grid point at indice i_x
void * read_data (void *data, const char *sds_name, int *start=NULL, int *stride=NULL, int *edges=NULL, int rank=-1)
 read a subset of a data set
ECMWFProductType get_product_id () const
 accessor to the product type ID
const string get_s_product_id () const
 accessor to the product type as a string
int get_sz_x () const
 accessor to the number of grid cells along the longitudes
int get_sz_y () const
 accessor to the number of grid cells along the latitudes
const string get_grid_desc ()
 return a description of the grid (resolution, number of cells,...) as a string
const vector< int > get_pressure_levels (const string &var_name)
 returns the pressure levels of the given variable
const int get_nb_pressure_levels (const string &var_name)
 returns the number of vertical levels of the given variable
void get_hybrid_level_pressures (const double &p_surf, double *v_p_hybrid) const
 accessor to the pressures of the 91 model levels in hPa Source : http://www.ecmwf.int/research/ifsdocs/DYNAMICS/Chap2_Discretization4.html#961180
const double get_hybrid_level_pressure (const int i_level, const double &p_surf) const
 compute the pressure of an hybrid level, in the 91 levels model Source : http://www.ecmwf.int/research/ifsdocs/DYNAMICS/Chap2_Discretization4.html#961180
template<typename Txout , typename Tyout , typename Txin , typename Tyin >
void get_v_pres_on_alt (Tyout *v_out_pres, const Txout *v_alt, const int sz_alt, const Txin *v_geop, const Tyin *v_inpres, const int n_pres, const string interp_type="linear")
 compute the pressure at a list of altitudes
template<typename Txout , typename Txin , typename Tyin >
double get_pres_on_alt (const Txout alt, const Txin *v_ingeop, const Tyin *v_inpres, const int sz_inpres, const string interp_type="linear")
 compute the pressure at a given altitude
double alt_to_geop (const double &alt)
 compute the geopotential of an altitude in m The formula used is : geop = g0 * alt. g0 is assumed to be constant in the atmosphere and on the surface on the earth
template<typename Txout , typename Tyout >
void get_abscissa_iso (Tyout *v_out_abs, const Txout *v_out_pres, const int sz_out_pres)
 compute the abscissa of the given pressures in the isobaric levels system. The abscissa is designed to be used lineary with log(P)
template<typename Txout , typename Tyout , typename Txin >
void get_abscissa_hybrid (Tyout *v_out_abs, const Txout *v_out_pres, const int sz_out_pres, const Txin *v_in_pres, const int sz_in_pres)
 compute the abscissa of the given pressures in the hybrid levels system. The abscissa is designed to be used lineary with log(P)
template<typename Txout , typename Tyout , typename Txin , typename Tyin >
void interp_on_pres (Tyout *v_out_var, const Txout *v_out_abs, const int sz_out, const Tyin *v_in_var, const Txin *v_in_pres, const int sz_in)
 interpolate the variable on the given pressures, using precomputed abscissa based on a linear approach on log(P)
void close_data_file ()
void open_data_file ()
 open the file
int get_n_dataset ()
string get_dataset_name (int i)
int get_dataset_data_type (string sds_name)
string get_values_attr_dataset (string sds_name, string attr)
bool has_attr_dataset (string sds_name, string attr)

Static Public Member Functions

static const unsigned short * get_isobaric_level_pressures ()
 access to the isobaric levels pressures vector, in hPa and sorted in decreasing order

Static Public Attributes

static const unsigned short isobaric_level_pressures []
static const int nb_max_isobaric_level = 26
static const double a_hybrid_91 [92]
static const double b_hybrid_91 [92]
static const int nb_level_hybrid_91 = 91

Protected Types

enum  ECMWFProductType { UNDEFINED = 0, ANALYSIS, FORECAST }

Protected Member Functions

void set_time_coverage ()
 compute the time range covered by this file, depending of the product
void parse_filename (const string &short_filename)
 extract sone informations using the filename
bool check_filename (const string &short_filename) const
 test if the filename seems to be a valid ECMWF file
void init_grid ()
 read the grid characteristics in the file attributes
virtual void load_time_level ()
 if not already set, read the time levels in the file Interface implementation purpose. GRIB ECMWF files are composed of only one time

Protected Attributes

ECMWFProductType product_id
string version
int sz_x
int sz_y
float lat0
float lon0

Detailed Description

Author:
Nicolas PASCAL reading of ECMWF GRIB files archived at ICARE remove FileDataReader interface implementation

Member Enumeration Documentation

the different types of ECMWF products


Constructor & Destructor Documentation

ECMWFFileData::ECMWFFileData ( const string &  name,
const string &  mode = "r" 
)

constructor

Parameters:
name the filename
mode opening mode. only "r" at this time

References close_data_file(), MeteoFileData::delta_lat, MeteoFileData::delta_lon, MeteoFileData::delta_time, init_grid(), parse_filename(), product_id, FileData::time_coverage, and version.


Member Function Documentation

double ECMWFFileData::alt_to_geop ( const double &  alt  )  [inline]

compute the geopotential of an altitude in m The formula used is : geop = g0 * alt. g0 is assumed to be constant in the atmosphere and on the surface on the earth

Parameters:
alt an altitude in m
Returns:
the geopotential of this altitude, in m2.s-2

Referenced by get_pres_on_alt(), and get_v_pres_on_alt().

bool ECMWFFileData::check_filename ( const string &  short_filename  )  const [protected]

test if the filename seems to be a valid ECMWF file

Parameters:
short_filename the filename without its path

Referenced by parse_filename().

void ECMWFFileData::close_data_file (  )  [virtual]

--- FOR OLD DATA2GRID INTERFACE compatibility - START ---

Reimplemented from FileData.

Referenced by ECMWFFileData().

template<typename Txout , typename Tyout , typename Txin >
void ECMWFFileData::get_abscissa_hybrid ( Tyout *  v_out_abs,
const Txout *  v_out_pres,
const int  sz_out_pres,
const Txin *  v_in_pres,
const int  sz_in_pres 
)

compute the abscissa of the given pressures in the hybrid levels system. The abscissa is designed to be used lineary with log(P)

Parameters:
v_out_abs [OUT] pressures abscissa
v_out_pres [IN] searched pressures
sz_out_pres [IN] number of searched pressures
v_in_pres [IN] hybrid levels pressures
sz_in_pres [IN] number of hybrid levels pressures
template<typename Txout , typename Tyout >
void ECMWFFileData::get_abscissa_iso ( Tyout *  v_out_abs,
const Txout *  v_out_pres,
const int  sz_out_pres 
)

compute the abscissa of the given pressures in the isobaric levels system. The abscissa is designed to be used lineary with log(P)

Parameters:
v_out_abs [OUT] pressures abscissa
v_out_pres [IN] searched pressures
sz_out_pres [IN] number of searched pressures

References isobaric_level_pressures, and nb_max_isobaric_level.

const string ECMWFFileData::get_grid_desc (  ) 

return a description of the grid (resolution, number of cells,...) as a string

Returns:
a description of the grid

References MeteoFileData::delta_lat, MeteoFileData::delta_lon, lat0, lon0, sz_x, and sz_y.

const double ECMWFFileData::get_hybrid_level_pressure ( const int  i_level,
const double &  p_surf 
) const [inline]

compute the pressure of an hybrid level, in the 91 levels model Source : http://www.ecmwf.int/research/ifsdocs/DYNAMICS/Chap2_Discretization4.html#961180

Parameters:
i_level number of the level. Must ne in range [0,90]
p_surf surface pressure in hPa
Returns:
the pressure of the hybrid level

References a_hybrid_91, and nb_level_hybrid_91.

Referenced by get_hybrid_level_pressures().

void ECMWFFileData::get_hybrid_level_pressures ( const double &  p_surf,
double *  v_p_hybrid 
) const [inline]

accessor to the pressures of the 91 model levels in hPa Source : http://www.ecmwf.int/research/ifsdocs/DYNAMICS/Chap2_Discretization4.html#961180

Parameters:
p_surf surface pressure in hPa
v_p_hybrid [OUT] vector of hybrid pressure full levels, from top to bottom.
Returns:
the pressures of the 91 model levels

References get_hybrid_level_pressure(), and nb_level_hybrid_91.

const bool ECMWFFileData::get_index ( const float &  lat,
const float &  lon,
int *  indexes 
) [inline]

find the index of the nearest point to (lat,lon) in the data. If (lat,lon,time) is not contained in this file, returned indexes are [-1,-1]

Parameters:
lat the latitude
lon the longitude
indexes the output indexes : a 2 values array {lat_index,lon_index}
Returns:
true if the coincidence could have been found. False else

References get_lat_index(), and get_lon_index().

const bool ECMWFFileData::get_index ( const float &  lat,
const float &  lon,
const float &  p_lvl,
int *  indexes 
) [inline]

find the index of the nearest point to (lat,lon, p_lvl) in the data.

Warning:
not implemented at this time If (lat,lon,p_lvl) is not contained in this file, returned indexes are [-1,-1, -1]
Parameters:
lat the latitude
lon the longitude
p_lvl the isobaric pressure level in hPa
indexes the output indexes : a 2 values array {lat_index,lon_index}
Returns:
true if the coincidence could have been found. False else
const bool ECMWFFileData::get_index ( const float &  lat,
const float &  lon,
const double &  time,
int *  indexes 
) [inline]

find the index of the nearest point to (lat,lon,time) in the data. time is ignored for ECMWF files because only one time level is used

Exceptions:
g_exception if lat or lon are invalid
Parameters:
lat the latitude
lon the longitude
time the time (using TAI convention)
indexes the output indexes : a 3 values array {lat_index,lon_index,time_index}
Returns:
true if the coincidence could have been found. False else
static const unsigned short* ECMWFFileData::get_isobaric_level_pressures (  )  [inline, static]

access to the isobaric levels pressures vector, in hPa and sorted in decreasing order

Returns:
the isobaric levels pressures vector

References isobaric_level_pressures.

const float32 ECMWFFileData::get_lat ( const int &  i_y  )  const [inline]

return the latitude of the grid point at indice i_y

Parameters:
i_y grid point indice along Y
Returns:
the grid point latitude

References MeteoFileData::delta_lat, and lat0.

const int ECMWFFileData::get_lat_index ( const float &  lat  )  const [inline]

return the index of the grid point that has the nearest latitude to lat

Parameters:
lat the latitude
Returns:
the index, or raise an exception if out of range

References MeteoFileData::delta_lat, and lat0.

Referenced by get_index().

const float32 ECMWFFileData::get_lon ( const int &  i_x  )  const [inline]

return the longitude of the grid point at indice i_x

Parameters:
i_x grid point indice along X
Returns:
the grid point longitude

References MeteoFileData::delta_lon, and lon0.

const int ECMWFFileData::get_lon_index ( const float &  lon  )  const [inline]

return the index of the grid point that has the nearest longitude to lon

Parameters:
lon the longitude, in [-180, 180] range
Returns:
the index, or raise an exception if out of range

References MeteoFileData::delta_lon, lon0, and sz_x.

Referenced by get_index().

const int ECMWFFileData::get_nb_pressure_levels ( const string &  var_name  ) 

returns the number of vertical levels of the given variable

Parameters:
var_name the name of the searched variable
Returns:
the number of pressure levels

References GribFileData::get_dataset_desc(), and t_grib_var_desc::v_lvl.

template<typename Txout , typename Txin , typename Tyin >
double ECMWFFileData::get_pres_on_alt ( const Txout  alt,
const Txin *  v_ingeop,
const Tyin *  v_inpres,
const int  sz_inpres,
const string  interp_type = "linear" 
)

compute the pressure at a given altitude

Warning:
no extrapolation done. If alt is out of the latitudes represented in v_ingeop NaN is returned
Parameters:
alt [IN] altitude where to compute the pressure in km
v_ingeop [IN] geopotential on input levels in m^2.s^-2
v_inpres [IN] pressure on input levels in hPa. Stricly decreasing
sz_inpres [IN] number of input levels
interp_type [IN] type of interpolation to use : "linear" , "linear_log" or "spline"
Returns:
the output pressure in hPa

References alt_to_geop().

Referenced by get_v_pres_on_alt().

const vector< int > ECMWFFileData::get_pressure_levels ( const string &  var_name  ) 

returns the pressure levels of the given variable

Parameters:
var_name the name of the searched variable
Returns:
the pressure levels

References GribFileData::get_dataset_desc(), and t_grib_var_desc::v_lvl.

ECMWFProductType ECMWFFileData::get_product_id (  )  const [inline]

accessor to the product type ID

Returns:
the product type ID

References product_id.

const string ECMWFFileData::get_s_product_id (  )  const [inline]

accessor to the product type as a string

Returns:
the product type as a string

References product_id.

int ECMWFFileData::get_sz_x (  )  const [inline]

accessor to the number of grid cells along the longitudes

Returns:
the number of grid cells along the longitudes

References sz_x.

int ECMWFFileData::get_sz_y (  )  const [inline]

accessor to the number of grid cells along the latitudes

Returns:
the number of grid cells along the latitudes

References sz_y.

template<typename Txout , typename Tyout , typename Txin , typename Tyin >
void ECMWFFileData::get_v_pres_on_alt ( Tyout *  v_out_pres,
const Txout *  v_alt,
const int  sz_alt,
const Txin *  v_geop,
const Tyin *  v_inpres,
const int  n_pres,
const string  interp_type = "linear" 
)

compute the pressure at a list of altitudes

Parameters:
v_out_pres [OUT] output pressure in hPa
v_alt [IN] altitudes where to compute the pressure in km
sz_alt [IN] number of altitudes and output pressures
v_geop [IN] geopotential on input levels in m^2.s^-2
v_inpres [IN] pressure on input levels in hPa. Stricly decreasing
n_pres [IN] number of input levels
interp_type [IN] type of interpolation to use : "linear" , "linear_log" or "spline"

References alt_to_geop(), and get_pres_on_alt().

template<typename Txout , typename Tyout , typename Txin , typename Tyin >
void ECMWFFileData::interp_on_pres ( Tyout *  v_out_var,
const Txout *  v_out_abs,
const int  sz_out,
const Tyin *  v_in_var,
const Txin *  v_in_pres,
const int  sz_in 
)

interpolate the variable on the given pressures, using precomputed abscissa based on a linear approach on log(P)

Parameters:
v_out_var [OUT] output variable interpolated on abscissa
v_out_abs [IN] abscissa of output level, in the reference coordinates system
sz_out [IN] number of elements to interpolate
v_in_var [IN] value of variable at reference levels
v_in_pres [IN] pressure of reference levels
sz_in [IN] number of reference levels
void ECMWFFileData::open_data_file (  )  [virtual]

open the file

Warning:
here for interface implementation prupose. All subclasses should implement this method

Reimplemented from FileData.

void ECMWFFileData::parse_filename ( const string &  short_filename  )  [protected]

extract sone informations using the filename

Parameters:
short_filename the filename without its path

References check_filename(), FileData::date, product_id, Date::set_date_str(), FileData::time_coverage, and version.

Referenced by ECMWFFileData().

void* ECMWFFileData::read_data ( void *  data,
const char *  sds_name,
int *  start = NULL,
int *  stride = NULL,
int *  edges = NULL,
int  rank = -1 
) [inline, virtual]

read a subset of a data set

Parameters:
data the data output buffer
sds_name the data set to read
start the start point
stride the step between to read values
edges the number of values to read in each direction
rank the rank of the sds
Returns:
a pointer to the data buffer. Use it if the allocation is done inside this method

Implements FileData.


Member Data Documentation

const double ECMWFFileData::a_hybrid_91 [static]
Initial value:
 {0.000000, 2.000040,
3.980832, 7.387186, 12.908319, 21.413612, 33.952858, 51.746601,
76.167656, 108.715561, 150.986023, 204.637451, 271.356506, 352.824493,
450.685791, 566.519226, 701.813354, 857.945801, 1036.166504, 1237.585449,
1463.163940, 1713.709595, 1989.874390, 2292.155518, 2620.898438, 2976.302246,
3358.425781, 3767.196045, 4202.416504, 4663.776367, 5150.859863, 5663.156250,
6199.839355, 6759.727051, 7341.469727, 7942.926270, 8564.624023, 9208.305664,
9873.560547, 10558.881836, 11262.484375, 11982.662109, 12713.897461,
13453.225586, 14192.009766, 14922.685547, 15638.053711, 16329.560547,
16990.623047, 17613.281250, 18191.029297, 18716.968750, 19184.544922,
19587.513672, 19919.796875, 20175.394531, 20348.916016, 20434.158203,
20426.218750, 20319.011719, 20107.031250, 19785.357422, 19348.775391,
18798.822266, 18141.296875, 17385.595703, 16544.585938, 15633.566406,
14665.645508, 13653.219727, 12608.383789, 11543.166992, 10471.310547,
9405.222656, 8356.252930, 7335.164551, 6353.920898, 5422.802734, 4550.215820,
3743.464355, 3010.146973, 2356.202637, 1784.854614, 1297.656128, 895.193542,
576.314148, 336.772369, 162.043427, 54.208336, 6.575628, 0.003160, 0.000000}

a, b coefficients used to compute the pressure of the ECMWF 91 vertical hybrid levels Source : http://www.ecmwf.int/products/data/technical/model_levels/model_def_91.html

Referenced by get_hybrid_level_pressure().

const double ECMWFFileData::b_hybrid_91 [static]
Initial value:
 {0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
0.000014, 0.000055, 0.000131, 0.000279, 0.000548, 0.001000, 0.001701, 0.002765,
0.004267, 0.006322, 0.009035, 0.012508, 0.016860, 0.022189, 0.028610, 0.036227,
0.045146, 0.055474, 0.067316, 0.080777, 0.095964, 0.112979, 0.131935, 0.152934,
0.176091, 0.201520, 0.229315, 0.259554, 0.291993, 0.326329, 0.362203, 0.399205,
0.436906, 0.475016, 0.513280, 0.551458, 0.589317, 0.626559, 0.662934, 0.698224,
0.732224, 0.764679, 0.795385, 0.824185, 0.850950, 0.875518, 0.897767, 0.917651,
0.935157, 0.950274, 0.963007, 0.973466, 0.982238, 0.989153, 0.994204, 0.997630,
1.000000}
const unsigned short ECMWFFileData::isobaric_level_pressures [static]
Initial value:
 { 1000, 950,
925, 900, 850, 800, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20,
10, 7, 5, 3, 2, 1, 0 }

vector of isobaric pressures, in hPa

Referenced by get_abscissa_iso(), and get_isobaric_level_pressures().

float ECMWFFileData::lat0 [protected]

latitude of the up grid point (border of cell)

Referenced by get_grid_desc(), get_lat(), get_lat_index(), and init_grid().

float ECMWFFileData::lon0 [protected]

longitude of the left grid point (border of cell)

Referenced by get_grid_desc(), get_lon(), get_lon_index(), and init_grid().

const int ECMWFFileData::nb_level_hybrid_91 = 91 [static]

number of hybrid levels

Referenced by get_hybrid_level_pressure(), and get_hybrid_level_pressures().

const int ECMWFFileData::nb_max_isobaric_level = 26 [static]

maximum number of isobaric pressure levels

Referenced by get_abscissa_iso().

the type of ECMWF product

Referenced by ECMWFFileData(), get_product_id(), get_s_product_id(), and parse_filename().

int ECMWFFileData::sz_x [protected]

number of grid cells along the longitudes

Referenced by get_grid_desc(), get_lon_index(), get_sz_x(), and init_grid().

int ECMWFFileData::sz_y [protected]

number of grid cells along the latitudes

Referenced by get_grid_desc(), get_sz_y(), and init_grid().

string ECMWFFileData::version [protected]

the product version

Referenced by ECMWFFileData(), and parse_filename().


The documentation for this class was generated from the following files: