44#ifndef _INCLUDED_Field3D_SparseDataReader_H_
45#define _INCLUDED_Field3D_SparseDataReader_H_
69template <
class Data_T>
88 void readBlockList(
int idx,
const std::vector<Data_T*>& memoryList);
106template <
class Data_T>
109 : m_location(location),
110 m_valuesPerBlock(valuesPerBlock),
111 m_occupiedBlocks(occupiedBlocks),
119template <
class Data_T>
136 dataSet.
open(m_location, k_dataStr, H5P_DEFAULT);
137 if (dataSet.
id() < 0)
138 throw OpenDataSetException(
"Couldn't open data set: " + k_dataStr);
141 fileDataSpace.
open(dataSet.
id());
142 dataType.
open(dataSet.
id());
143 if (fileDataSpace.
id() < 0)
144 throw GetDataSpaceException(
"Couldn't get data space");
145 if (dataType.
id() < 0)
146 throw GetDataTypeException(
"Couldn't get data type");
149 memDims[0] = m_valuesPerBlock;
150 memDataSpace.
create(H5S_SIMPLE);
151 H5Sset_extent_simple(memDataSpace.
id(), 1, memDims, NULL);
154 H5Sget_simple_extent_dims(fileDataSpace.
id(), dims, NULL);
155 if (dims[1] !=
static_cast<hsize_t
>(m_valuesPerBlock)) {
156 throw FileIntegrityException(
"Block length mismatch in "
159 if (dims[0] !=
static_cast<hsize_t
>(m_occupiedBlocks))
160 throw FileIntegrityException(
"Block count mismatch in "
170 count[1] = m_valuesPerBlock;
172 status = H5Sselect_hyperslab(fileDataSpace.
id(), H5S_SELECT_SET,
173 offset, NULL, count, NULL);
176 throw ReadHyperSlabException(
"Couldn't select slab in readBlock(): " +
177 boost::lexical_cast<std::string>(idx));
181 memDataSpace.
id(), fileDataSpace.
id(),
182 H5P_DEFAULT, &result);
187template <
class Data_T>
189(
int idxLo,
const std::vector<Data_T*>& memoryList)
205 dataSet.
open(m_location, k_dataStr, H5P_DEFAULT);
206 if (dataSet.
id() < 0)
207 throw OpenDataSetException(
"Couldn't open data set: " + k_dataStr);
210 fileDataSpace.
open(dataSet.
id());
211 dataType.
open(dataSet.
id());
212 if (fileDataSpace.
id() < 0)
213 throw GetDataSpaceException(
"Couldn't get data space");
214 if (dataType.
id() < 0)
215 throw GetDataTypeException(
"Couldn't get data type");
218 memDims[0] = m_valuesPerBlock;
219 memDataSpace.
create(H5S_SIMPLE);
220 H5Sset_extent_simple(memDataSpace.
id(), 1, memDims, NULL);
223 H5Sget_simple_extent_dims(fileDataSpace.
id(), dims, NULL);
224 if (dims[1] !=
static_cast<hsize_t
>(m_valuesPerBlock)) {
225 throw FileIntegrityException(
"Block length mismatch in "
228 if (dims[0] !=
static_cast<hsize_t
>(m_occupiedBlocks))
229 throw FileIntegrityException(
"Block count mismatch in "
238 count[0] = memoryList.size();
239 count[1] = m_valuesPerBlock;
241 status = H5Sselect_hyperslab(fileDataSpace.
id(), H5S_SELECT_SET,
242 offset, NULL, count, NULL);
244 throw ReadHyperSlabException(
"Couldn't select slab in readBlockList():" +
245 boost::lexical_cast<std::string>(idxLo));
252 fileDims[0] = memoryList.size();
253 fileDims[1] = m_valuesPerBlock;
254 localMemDataSpace.
create(H5S_SIMPLE);
255 H5Sset_extent_simple(localMemDataSpace.
id(), 2, fileDims, NULL);
259 int bytesPerValue = 0;
262 if (t == H5T_NATIVE_CHAR)
264 else if (t == H5T_NATIVE_SHORT)
266 else if (t == H5T_NATIVE_FLOAT)
268 else if (t == H5T_NATIVE_DOUBLE)
272 int dim =
sizeof(Data_T) / bytesPerValue;
273 std::vector<Data_T> bigblock(memoryList.size() * m_valuesPerBlock/dim);
275 status = H5Dread(dataSet.
id(),
277 localMemDataSpace.
id(),
279 H5P_DEFAULT, &bigblock[0]);
282 throw Hdf5DataReadException(
"Couldn't read slab " +
283 boost::lexical_cast<std::string>(idxLo));
287 for (
size_t i = 0; i < memoryList.size(); ++i) {
288 memcpy(memoryList[i],
289 &bigblock[i * m_valuesPerBlock / dim],
290 bytesPerValue * m_valuesPerBlock);
Contains various utility functions for Hdf5.
FIELD3D_NAMESPACE_OPEN FIELD3D_API boost::recursive_mutex g_hdf5Mutex
boost::recursive_mutex::scoped_lock GlobalLock
Contains the Log class which can be used to redirect output to an arbitrary destination.
hid_t id() const
Query the hid_t value.
Scoped object - opens a dataset on creation and closes it on destruction.
void open(hid_t dataset_id)
Scoped object - opens a dataset on creation and closes it on destruction.
void open(hid_t dataset_id)
Scoped object - opens a dataset on creation and closes it on destruction.
void open(hid_t parentLocation, const std::string &name, hid_t dapl_id)
Scoped object - creates a dataspace on creation and closes it on destruction.
void create(H5S_class_t type)
This class gets used by SparseFieldIO and SparseFileManager to read the block data....
void readBlockList(int idx, const std::vector< Data_T * > &memoryList)
Reads a series of blocks, storing each block of data in memoryList, which is assumed to contain enoug...
void readBlock(int idx, Data_T &result)
Reads a block, storing the data in result, which is assumed to contain enough room for m_valuesPerBlo...
SparseDataReader(hid_t location, int valuesPerBlock, int occupiedBlocks)
Constructor. Requires knowledge of the Hdf5 location where data is stored.
const std::string k_dataStr
Namespace for Exception objects.
Contains utility functions and classes for Hdf5 files.
#define FIELD3D_NAMESPACE_HEADER_CLOSE