User: rhaas Date: 2013/12/27 04:13 PM
Modified: /PITTNullCode/SphericalHarmonicReconGen/src/ sph_database.cc
Log: add error checking around HDF5 calls
in particular abort when HDF5 file cannot be opened
File Changes:
Directory: /PITTNullCode/SphericalHarmonicReconGen/src/ =======================================================
File [modified]: sph_database.cc Delta lines: +69 -37 =================================================================== --- PITTNullCode/SphericalHarmonicReconGen/src/sph_database.cc 2013-12-27 22:09:03 UTC (rev 104) +++ PITTNullCode/SphericalHarmonicReconGen/src/sph_database.cc 2013-12-27 22:13:16 UTC (rev 105) @@ -1,11 +1,26 @@ #include "sph_database.hh" +#include <cassert>
namespace SHR {
using namespace std;
+// check return code of HDF5 call and print a warning in case of an error +#define HDF5_ERROR(fn_call) HDF5_CALL(__LINE__, __FILE__, CCTK_THORNSTRING, \ + fn_call, #fn_call) +static int HDF5_CALL(const int line, const char* file, + const char* thornstring, int error_code, + const char* fn_call) +{ + if (error_code < 0) + { + CCTK_VError (line, file, thornstring, + "HDF5 call '%s' returned error code %d", + fn_call, error_code); + } + return error_code; +}
- SPH_db_ASCII::SPH_db_ASCII(const string& fname_, const bool verbose_, const int cached_timesteps, @@ -899,6 +914,10 @@ { // open file file = H5Fopen(_fname.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + if (file < 0) { + CCTK_VError(__LINE__, __FILE__, CCTK_THORNSTRING, + "Could not open file "%s".", _fname.c_str()); + }
scan(); } @@ -907,7 +926,7 @@ SPH_db_SpEC_H5::~SPH_db_SpEC_H5() { // close file - H5Fclose(file); + HDF5_ERROR(H5Fclose(file)); }
@@ -977,10 +996,12 @@ CCTK_WARN(0, "Requested timestep not in worldtube data file. Stopping!"); }
- hid_t dataset = H5Dopen(file, (varname_table[varno][0]+"/"+steps[timestep].name+"/"+varname_table[varno][1]).c_str());//, H5P_DEFAULT); + hid_t dataset = HDF5_ERROR(H5Dopen(file, (varname_table[varno][0]+"/"+ + steps[timestep].name+"/"+ + varname_table[varno][1]).c_str())); vector<double> buffer((_lmax+1)*(_lmax+1)*2); - H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &buffer.front()); - H5Dclose(dataset); + HDF5_ERROR(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &buffer.front())); + HDF5_ERROR(H5Dclose(dataset));
int c = 0; for (int l=0; l <= _lmax; ++l) { @@ -1005,11 +1026,11 @@ if (gname.find(step_basename) != string::npos) { // get time attribute double time; - hid_t group = H5Gopen(loc_id, name); - hid_t attribute = H5Aopen(group, time_attrib_name.c_str(), H5P_DEFAULT); - H5Aread(attribute, H5T_NATIVE_DOUBLE, &time); - H5Aclose(attribute); - H5Gclose(group); + hid_t group = HDF5_ERROR(H5Gopen(loc_id, name)); + hid_t attribute = HDF5_ERROR(H5Aopen(group, time_attrib_name.c_str(), H5P_DEFAULT)); + HDF5_ERROR(H5Aread(attribute, H5T_NATIVE_DOUBLE, &time)); + HDF5_ERROR(H5Aclose(attribute)); + HDF5_ERROR(H5Gclose(group));
SpEC_H5->steps.push_back(timestep_t(name, time)); } @@ -1033,7 +1054,9 @@ // pick one variable and browse through entire file // to find out how many (and what) cycles and times there are // (assuming that all variables are present at the same timesteps) - H5Literate_by_name (file, varname_table[0][0].c_str(), H5_INDEX_NAME, H5_ITER_NATIVE, NULL, H5iter, this, H5P_DEFAULT); + HDF5_ERROR(H5Literate_by_name (file, varname_table[0][0].c_str(), + H5_INDEX_NAME, H5_ITER_NATIVE, NULL, + H5iter, this, H5P_DEFAULT));
// sort 'steps' vector //sort(steps.begin(), steps.end()); @@ -1046,13 +1069,17 @@ }
// get lmax from first variable and timestep - hid_t dataset = H5Dopen(file, (varname_table[0][0]+"/"+steps[0].name+"/"+varname_table[0][1]).c_str()); //, H5P_DEFAULT); + hid_t dataset = HDF5_ERROR(H5Dopen(file, (varname_table[0][0]+"/"+ + steps[0].name+"/"+ + varname_table[0][1]).c_str())); //cout << (varname_table[0][0]+"/"+steps[0].name+"/"+varname_table[0][1]) << endl; - hid_t dataspace = H5Dget_space(dataset); - hsize_t size = H5Sget_simple_extent_npoints(dataspace); - H5Sclose(dataspace); - H5Dclose(dataset); + hid_t dataspace = HDF5_ERROR(H5Dget_space(dataset)); + hsize_t size = HDF5_ERROR(H5Sget_simple_extent_npoints(dataspace)); + HDF5_ERROR(H5Sclose(dataspace)); + HDF5_ERROR(H5Dclose(dataset));
+ assert (size % 2 == 0); + _lmax = sqrt(size/2)-1; _n_variables = 30; _n_spheres = 1; @@ -1110,6 +1137,10 @@ { // open file file = H5Fopen(_fname.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + if (file < 0) { + CCTK_VError(__LINE__, __FILE__, CCTK_THORNSTRING, + "Could not open file "%s".", _fname.c_str()); + }
scan(); } @@ -1118,7 +1149,7 @@ SPH_db_SpEC_H5_v2::~SPH_db_SpEC_H5_v2() { // close file - H5Fclose(file); + HDF5_ERROR(H5Fclose(file)); }
@@ -1216,27 +1247,28 @@
for (int v=0; v < _n_variables; ++v) {
- hid_t dataset = H5Dopen(file, varname_table[v].c_str()); + hid_t dataset = HDF5_ERROR(H5Dopen(file, varname_table[v].c_str())); const int nmodes = (_lmax+1)*(_lmax+1)*2; vector<double> buffer(nmodes*nsteps);
hsize_t dimsm[1] = { buffer.size() }; - hid_t memspace = H5Screate_simple (1, dimsm, NULL); + hid_t memspace = HDF5_ERROR(H5Screate_simple (1, dimsm, NULL));
- hid_t dataspace = H5Dget_space(dataset); + hid_t dataspace = HDF5_ERROR(H5Dget_space(dataset)); hsize_t dims[2]; - H5Sget_simple_extent_dims (dataspace, dims, NULL); + HDF5_ERROR(H5Sget_simple_extent_dims (dataspace, dims, NULL));
hsize_t offset[2] = { timestep, 1 }; hsize_t count[2] = { nsteps, nmodes }; - H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, offset, NULL, - count, NULL); + HDF5_ERROR(H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, offset, NULL, + count, NULL));
- H5Dread(dataset, H5T_NATIVE_DOUBLE, memspace, dataspace, H5P_DEFAULT, &buffer.front()); + HDF5_ERROR(H5Dread(dataset, H5T_NATIVE_DOUBLE, memspace, dataspace, H5P_DEFAULT, + &buffer.front()));
- H5Sclose(memspace); - H5Sclose(dataspace); - H5Dclose(dataset); + HDF5_ERROR(H5Sclose(memspace)); + HDF5_ERROR(H5Sclose(dataspace)); + HDF5_ERROR(H5Dclose(dataset));
for (int t=0; t < nsteps; ++t) {
@@ -1279,11 +1311,11 @@ */
// get lmax from first variable and timestep - hid_t dataset = H5Dopen(file, "gxx.dat"); //, H5P_DEFAULT); + hid_t dataset = HDF5_ERROR(H5Dopen(file, "gxx.dat")); //cout << (varname_table[0][0]+"/"+steps[0].name+"/"+varname_table[0][1]) << endl; - hid_t dataspace = H5Dget_space(dataset); + hid_t dataspace = HDF5_ERROR(H5Dget_space(dataset)); hsize_t dims[2]; - H5Sget_simple_extent_dims (dataspace, dims, NULL); + HDF5_ERROR(H5Sget_simple_extent_dims (dataspace, dims, NULL));
// first dim is number of timesteps steps.resize(dims[0]); @@ -1293,20 +1325,20 @@ // select hyperslab in dataset hsize_t offset[2] = { 0, 0 }; hsize_t count[2] = { dims[0], 1 }; - H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, offset, NULL, - count, NULL); + HDF5_ERROR(H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, offset, NULL, + count, NULL));
// define dataspace of memory hsize_t dimsm[1] = { steps.size() }; hid_t memspace = H5Screate_simple (1, dimsm, NULL);
// read "times" - H5Dread (dataset, H5T_NATIVE_DOUBLE, memspace, dataspace, - H5P_DEFAULT, &steps.front()); + HDF5_ERROR(H5Dread (dataset, H5T_NATIVE_DOUBLE, memspace, dataspace, + H5P_DEFAULT, &steps.front()));
- H5Sclose(memspace); - H5Sclose(dataspace); - H5Dclose(dataset); + HDF5_ERROR(H5Sclose(memspace)); + HDF5_ERROR(H5Sclose(dataspace)); + HDF5_ERROR(H5Dclose(dataset));
_n_variables = 30; _n_spheres = 1;
commits@lists.einsteintoolkit.org