44 #ifndef _INCLUDED_Field3D_SparseDataReader_H_
45 #define _INCLUDED_Field3D_SparseDataReader_H_
69 template <
class Data_T>
88 void readBlockList(
int idx,
const std::vector<Data_T*>& memoryList);
106 template <
class Data_T>
109 : m_location(location),
110 m_valuesPerBlock(valuesPerBlock),
111 m_occupiedBlocks(occupiedBlocks),
119 template <
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);
187 template <
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);