Commit bcc455d1 authored by incardon's avatar incardon

Fix in HDF5 writer and reader with memory leak + added documentation

parent 223f739a
......@@ -15,7 +15,7 @@ class HDF5_reader<VECTOR_DIST>
private:
template<unsigned int dim, typename St,typename prp>
void load_block(long int bid,
bool load_block(long int bid,
hssize_t mpi_size_old,
int * metadata_out,
openfpm::vector<size_t> metadata_accum,
......@@ -44,14 +44,17 @@ private:
//Select file dataspace
hid_t file_dataspace_id_2 = H5Dget_space(dataset_2);
if (file_dataspace_id_2 < 0) {return false;}
H5Sselect_hyperslab(file_dataspace_id_2, H5S_SELECT_SET, offset, NULL, count, block);
herr_t err = H5Sselect_hyperslab(file_dataspace_id_2, H5S_SELECT_SET, offset, NULL, count, block);
if (err < 0) {return false;}
hsize_t mdim_2[1] = {block[0]};
//Create data space in memory
hid_t mem_dataspace_id_2 = H5Screate_simple(1, mdim_2, NULL);
if (mem_dataspace_id_2 < 0) {return false;}
size_t sum = 0;
......@@ -65,7 +68,8 @@ private:
mem.incRef();
// Read the dataset.
H5Dread(dataset_2, H5T_NATIVE_CHAR, mem_dataspace_id_2, file_dataspace_id_2, plist_id, (char *)mem.getPointer());
err = H5Dread(dataset_2, H5T_NATIVE_CHAR, mem_dataspace_id_2, file_dataspace_id_2, plist_id, (char *)mem.getPointer());
if (err < 0) {return false;}
mem.allocate(pmem.size());
......@@ -88,11 +92,16 @@ private:
v_prp.add(v_prp_unp.get(i));
g_m = v_pos.size();
H5Sclose(file_dataspace_id_2);
H5Sclose(mem_dataspace_id_2);
return true;
}
public:
template<unsigned int dim, typename St, typename prp> inline void load(const std::string & filename,
template<unsigned int dim, typename St, typename prp> inline bool load(const std::string & filename,
openfpm::vector<Point<dim,St>> & v_pos,
openfpm::vector<prp> & v_prp,
size_t & g_m)
......@@ -111,40 +120,48 @@ public:
// Set up file access property list with parallel I/O access
hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_fapl_mpio(plist_id, comm, info);
if (plist_id == -1) {return false;}
herr_t err = H5Pset_fapl_mpio(plist_id, comm, info);
if (err < 0)
return false;
//Open a file
hid_t file = H5Fopen (filename.c_str(), H5F_ACC_RDONLY, plist_id);
if (file < 0) {return false;}
H5Pclose(plist_id);
//Open dataset
hid_t dataset = H5Dopen (file, "metadata", H5P_DEFAULT);
if (dataset < 0) {return false;}
//Create property list for collective dataset read
plist_id = H5Pcreate(H5P_DATASET_XFER);
if (plist_id == -1) {return false;}
H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
//Select file dataspace
hid_t file_dataspace_id = H5Dget_space(dataset);
if (file_dataspace_id < 0) {return false;}
hssize_t mpi_size_old = H5Sget_select_npoints (file_dataspace_id);
if (mpi_size_old < 0) {return false;}
//Where to read metadata
int metadata_out[mpi_size_old];
for (int i = 0; i < mpi_size_old; i++)
{
metadata_out[i] = 0;
}
{metadata_out[i] = 0;}
//Size for data space in memory
hsize_t mdim[1] = {(size_t)mpi_size_old};
//Create data space in memory
hid_t mem_dataspace_id = H5Screate_simple(1, mdim, NULL);
if (mem_dataspace_id < 0) {return false;}
// Read the dataset.
H5Dread(dataset, H5T_NATIVE_INT, mem_dataspace_id, file_dataspace_id, plist_id, metadata_out);
err = H5Dread(dataset, H5T_NATIVE_INT, mem_dataspace_id, file_dataspace_id, plist_id, metadata_out);
if (err < 0) {return false;}
openfpm::vector<size_t> metadata_accum;
metadata_accum.resize(mpi_size_old);
......@@ -155,10 +172,14 @@ public:
//Open dataset
hid_t dataset_2 = H5Dopen (file, "vector_dist", H5P_DEFAULT);
if (dataset_2 < 0) {return false;}
//Create property list for collective dataset read
plist_id = H5Pcreate(H5P_DATASET_XFER);
H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
if (plist_id == -1) {return false;}
err = H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
if (err < 0) {return false;}
openfpm::vector<size_t> n_block;
n_block.resize(v_cl.getProcessingUnits());
......@@ -205,12 +226,17 @@ public:
load_block(-1,mpi_size_old,metadata_out,metadata_accum,plist_id,dataset_2,g_m,v_pos,v_prp);
}
// Close open object
H5Sclose(mem_dataspace_id);
H5Sclose(file_dataspace_id);
// Close the dataset.
H5Dclose(dataset);
H5Dclose(dataset_2);
// Close the file.
H5Fclose(file);
H5Pclose(plist_id);
return true;
}
};
......
......@@ -125,7 +125,11 @@ struct vtk_dist_vertex_node
v_node += std::to_string(x[0]) + " " + std::to_string(x[1]) + " " + std::to_string(x[2]) + "\n";
}
//! It call the functor for each member
/*! \brief It call the functor for each attribute
*
* \param t attribute id
*
*/
template<typename T>
void operator()(T& t)
{
......@@ -173,7 +177,11 @@ struct vtk_dist_vertex_node<G, false>
{
}
//! It call the functor for each member
/*! \brief It call the functor for each attribute
*
* \param t attribute id
*
*/
template<typename T>
void operator()(T& t)
{
......@@ -391,10 +399,11 @@ public:
/*! \brief For each vertex set the value
*
* \tparam i vertex property to print
*
* \param g graph to output
*
* \return get the point data string
*
*/
static std::string get_point_data(const Graph & g)
{
......@@ -418,11 +427,11 @@ public:
}
/*! \brief For each edge set the value, set 1 on vertices, needed by vtk file format
*
* \tparam i edge property to print
*
* \param g graph to output
*
* \return the cell-data string
*
*/
static std::string get_cell_data(const Graph & g)
......@@ -464,6 +473,8 @@ public:
*
* \param prop property id
*
* \return the string with the property header
*
*/
static std::string get_point_property_header(size_t prop)
{
......@@ -601,6 +612,8 @@ class dist_prop_output<false, Graph, i>
*
* \param g graph to print
*
* \return the string with the point data
*
*/
static std::string get_point_data(Graph & g)
{
......@@ -625,10 +638,11 @@ class dist_prop_output<false, Graph, i>
/*! \brief For each edge output the property string
*
* \param graph to print
* \param g graph to print
*
* \return the string containing cell-data
*
*/
static std::string get_cell_data(const Graph & g)
{
//! vertex node output string
......@@ -801,7 +815,11 @@ struct dist_prop_out_vertex
{
}
//! It produce an output for each property
/*! \brief It produce an output for each property
*
* \param t property id
*
*/
template<typename T>
void operator()(T& t) const
{
......@@ -846,16 +864,19 @@ struct dist_prop_out_edge
/*! \brief constructor
*
* \param v_out string to fill with the vertex properties
* \param e_out string to fill with the edge properties
* \param g graph to write
*
*/
dist_prop_out_edge(std::string & e_out, const Graph & g) :
e_out(e_out), g(g)
{
}
;
{};
//! It produce an output for each property
/*! \brief It produce an output for each property
*
* \param t index property
*
*/
template<typename T>
void operator()(T& t) const
{
......@@ -930,6 +951,11 @@ class VTKWriter<Graph, DIST_GRAPH>
return v_out;
}
/*! \brief Get the VTK point info string
*
* \return the point info string
*
*/
std::string get_point_info()
{
//! vertex property output string
......@@ -977,9 +1003,10 @@ class VTKWriter<Graph, DIST_GRAPH>
/*! \brief Create the VTK point definition
*
* \tparam s_type spatial type of the data
* \tparam attr false x,y,z are set to 0 for each vertex
*
* \return the point list string
*
*/
template<bool attr> std::string get_point_list()
......@@ -1018,11 +1045,11 @@ class VTKWriter<Graph, DIST_GRAPH>
/*! \brief Create the VTK vertex definition
*
* \tparam s_type spatial type of the data
* \tparam attr false x,y,z are set to 0 for each vertex
*
* \return the vertex list string
*
*/
std::string get_vertex_list()
{
//! vertex node output string
......@@ -1114,11 +1141,12 @@ public:
* \tparam prp_out which properties to output [default = -1 (all)]
*
* \param file path where to write
* \param name of the graph
* \param graph_name of the graph
* \param ft specify if it is a VTK BINARY or ASCII file [default = ASCII]
*
* \return true if it succeed
*
*/
template<int prp = -1> bool write(std::string file, std::string graph_name = "Graph", file_type ft = file_type::ASCII)
{
......
......@@ -91,17 +91,19 @@ struct vtk_vertex_node_array_scalar_selector<true>
template<typename G, bool attr>
struct vtk_vertex_node
{
// Vertex spatial type information
//! Vertex spatial type information
typedef typename G::V_type::s_type s_type;
//! Indicate if there is the information about the z coordinate
bool z_set;
//! point to write
s_type (&x)[3];
// Vertex object container
//! Vertex object container
typename G::V_container & vo;
// vertex node string
//! vertex node string
std::string & v_node;
/*! \brief Constructor
......@@ -834,15 +836,16 @@ struct prop_out_vertex
template<typename Graph>
struct prop_out_edge
{
// property output string
//! property output string
std::string & e_out;
// Graph that we are processing
//! Graph that we are processing
const Graph & g;
/*! \brief constructor
*
* \param v_out string to fill with the vertex properties
* \param e_out string to fill with the edge properties
* \param g graph we are writing
*
*/
prop_out_edge(std::string & e_out, const Graph & g) :
......@@ -851,7 +854,11 @@ struct prop_out_edge
}
;
//! It produce an output for each property
/*! \brief It produce an output for each property
*
* \param t property index
*
*/
template<typename T>
void operator()(T& t) const
{
......@@ -883,6 +890,7 @@ struct prop_out_edge
template<typename Graph>
class VTKWriter<Graph, VTK_GRAPH>
{
//! graph we are writing
const Graph & g;
/*! \brief It get the vertex properties list
......@@ -947,11 +955,11 @@ class VTKWriter<Graph, VTK_GRAPH>
/*! \brief Create the VTK point definition
*
* \tparam s_type spatial type of the data
* \tparam attr false x,y,z are set to 0 for each vertex
*
* \return a string with the point list
*
*/
template<bool attr> std::string get_point_list()
{
//! VTK spatial information
......@@ -988,11 +996,9 @@ class VTKWriter<Graph, VTK_GRAPH>
/*! \brief Create the VTK vertex definition
*
* \tparam s_type spatial type of the data
* \tparam attr false x,y,z are set to 0 for each vertex
* \return a string with the vertex definition
*
*/
std::string get_vertex_list()
{
//! vertex node output string
......@@ -1090,8 +1096,9 @@ public:
* \param name of the graph
* \param ft specify if it is a VTK BINARY or ASCII file [default = ASCII]
*
* \return true if it write correctly
*
*/
template<int prp = -1> bool write(std::string file, std::string graph_name = "Graph", file_type ft = file_type::ASCII)
{
// Check that the Vertex type define x y and z attributes
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment