// // C++ Implementation: test_gribfiledata // // Description: // // // Author: Nicolas PASCAL ; , (C) 2011 // // Copyright: See COPYING file that comes with this distribution // // #include "gribfiledata.h" int main(int argc, char *argv[]) { /* Open and create the access to the file */ // string fname = "/DATA/LIENS/ECMWF/operational.v1.0.0/2011/2011_05_17/ECMWF_201105170000_v1.0.0_1deg_AN.grb"; // string fname = "/DATA/LIENS/ECMWF/operational.v1.2.0/2011/2011_05_17/ECMWF_201105170000_v1.2.0_1deg_AN.grb"; // string fname = "/DATA/LIENS/ECMWF/operational.v1.2.0/2011/2011_05_20/ECMWF_201105200300_v1.2.0_1deg_FC_201105191200.grb"; string fname = "/home/pascal/test/test_AN.grb"; GribFileData fd (fname); printf ("--- %s ---\n", fname.c_str()); // --- print variables characteristics fd.print_param_table(); // --- print dimensions size string ds_name = "z"; printf ("--- Dataset %s ---\n", ds_name.c_str()); vector dims = fd.get_dataset_dimension(ds_name); cout << "Dims : "; for (vector ::iterator it_dim = dims.begin() ; it_dim != dims.end() ; ++it_dim) cout << *it_dim << " "; cout << endl; fd.open_data_file(); // --- print number of GRIB messages printf ("n_msg = %d\n", fd.get_n_msg ()); // --- print number of datasets printf ("n_datasets = %d\n", fd.get_n_dataset ()); // --- print all keys of all messages fd.print_keys (true); // --- print some message keys int i_msg; i_msg = 1; cout << fd.get_dataset_name (i_msg) << " " << fd.get_msg_key (i_msg, "level") << endl; i_msg = 6; cout << fd.get_dataset_name (i_msg) << " " << fd.get_msg_key (i_msg, "level") << endl; i_msg = 1; cout << fd.get_dataset_name (i_msg) << " " << fd.get_msg_key (i_msg, "level") << endl; i_msg = 2; cout << fd.get_dataset_name (i_msg) << " " << fd.get_msg_key (i_msg, "level") << endl; i_msg = 3; cout << fd.get_dataset_name (i_msg) << " " << fd.get_msg_key (i_msg, "level") << endl; // --- read and print messages data i_msg = 125; printf ("--- i = %d ; name = %s ; level = %s ---\n", i_msg, fd.get_dataset_name(i_msg).c_str(), fd.get_msg_key (i_msg, "level").c_str()); fd.print_msg_data (i_msg); for (i_msg = 0 ; i_msg < 5 ; ++i_msg) { printf ("--- i = %d ; name = %s ; level = %s ---\n", i_msg, fd.get_dataset_name (i_msg).c_str(), fd.get_msg_key (i_msg, "level").c_str()); fd.print_msg_data (i_msg); } // --- Read a 2D dataset double * data = NULL; int iz, iy, ix; ds_name = "sp"; data = (double*)(fd.read_data (NULL, ds_name.c_str())); dims = fd.get_dataset_dimension (ds_name); printf ("--- name = %s ---\n", ds_name.c_str()); for (iy = 0 ; iy < dims[0] ; ++iy) { cout << "irow=" << iy << "\t"; for (ix = 0 ; ix < dims[1] ; ++ix) { cout << data [iy * dims[1] + ix] << " "; } cout << endl; } delete[] data, data = NULL; // --- Read a 2D dataset subset ds_name = "sp"; int start_2d [] = {1, 2}, edges_2d [] = {2, 5}; data = (double*)(fd.read_data (NULL, ds_name.c_str())); dims = fd.get_dataset_dimension (ds_name); printf ("--- name = %s ; subset [%d, %d] -> [%d, %d]---\n", ds_name.c_str(), start_2d [0], start_2d [1], start_2d [0] + edges_2d [0], start_2d [1] + edges_2d [1]); for (iy = start_2d [0] ; iy < start_2d [0] + edges_2d [0] ; ++iy) { for (ix = start_2d [1] ; ix < start_2d [1] + edges_2d [1] ; ++ix) { cout << data [iy * dims[1] + ix] << " "; } cout << endl; } delete[] data, data = NULL; // --- Read a 3D dataset ds_name = "t"; data = (double*)(fd.read_data (NULL, ds_name.c_str())); dims = fd.get_dataset_dimension (ds_name); printf ("--- name = %s ---\n", ds_name.c_str()); for (iz = 0 ; iz < dims [0] ; ++iz) { cout << "[level " << iz << "]" << endl; for (iy = 0 ; iy < dims[1] ; ++iy) { cout << "irow=" << iy << "\t"; for (ix = 0 ; ix < dims[2] ; ++ix) { cout << data [iz * dims[1] * dims[2] + iy * dims[2] + ix] << " "; } cout << endl; } } delete[] data, data = NULL; // --- Read a 3D dataset subset ds_name = "t"; int start_3d [] = {1, 1, 1}, edges_3d [] = {10, 2, 2}; data = (double*)(fd.read_data (NULL, ds_name.c_str(), start_3d, NULL, edges_3d, 3)); dims = fd.get_dataset_dimension (ds_name); printf ("--- name = %s ; subset [%d, %d, %d] -> [%d, %d, %d] ---\n", ds_name.c_str(), start_3d [0], start_3d [1], start_3d [2], start_3d [0] + edges_3d [0], start_3d [1] + edges_3d [1], start_3d [2] + edges_3d [2]); for (iz = 0 ; iz < edges_3d[0] ; ++iz) { cout << "[level " << start_3d[0] + iz << "]" << endl; for (iy = 0 ; iy < edges_3d[1] ; ++iy) { cout << "irow=" << iy + start_3d[1] << "\t"; for (ix = 0 ; ix < edges_3d[2] ; ++ix) { cout << data [iz * edges_3d[1] * edges_3d[2] + iy * edges_3d[2] + ix] << " "; } cout << endl; } } delete[] data, data = NULL; // --- read the keys of a specific message vector > v_keys (0); // select which keys are printed // unsigned int keys_filter = GRIB_KEYS_ITERATOR_ALL_KEYS; unsigned int keys_filter = GRIB_KEYS_ITERATOR_SKIP_READ_ONLY & GRIB_KEYS_ITERATOR_SKIP_OPTIONAL & GRIB_KEYS_ITERATOR_SKIP_EDITION_SPECIFIC & GRIB_KEYS_ITERATOR_SKIP_CODED & GRIB_KEYS_ITERATOR_SKIP_COMPUTED & GRIB_KEYS_ITERATOR_SKIP_DUPLICATES & GRIB_KEYS_ITERATOR_SKIP_FUNCTION; i_msg = 5; fd.get_msg_keys(i_msg, v_keys, keys_filter); printf ("--- Message # %d ---\n", i_msg); typedef vector >::iterator key_val_iter; for (key_val_iter it = v_keys.begin() ; it != v_keys.end() ; ++it) cout << it->first << " = " << it->second << endl; cout << endl; fd.close_data_file(); return 0; }