Field3D
|
This class gets used by SparseFieldIO and SparseFileManager to read the block data. On creation it will open the data set and not close it until the object is destroyed. More...
#include <SparseDataReader.h>
Public Member Functions | |
void | readBlock (int idx, Data_T &result) |
Reads a block, storing the data in result, which is assumed to contain enough room for m_valuesPerBlock entries. | |
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 enough room for m_valuesPerBlock entries. | |
SparseDataReader (hid_t location, int valuesPerBlock, int occupiedBlocks) | |
Constructor. Requires knowledge of the Hdf5 location where data is stored. | |
Private Attributes | |
const std::string | k_dataStr |
Hdf5Util::H5ScopedDopen | m_dataSet |
Hdf5Util::H5ScopedDget_type | m_dataType |
Hdf5Util::H5ScopedDget_space | m_fileDataSpace |
Hdf5Util::H5ScopedScreate | m_memDataSpace |
int | m_valuesPerBlock |
This class gets used by SparseFieldIO and SparseFileManager to read the block data. On creation it will open the data set and not close it until the object is destroyed.
Definition at line 68 of file SparseDataReader.h.
SparseDataReader< Data_T >::SparseDataReader | ( | hid_t | location, |
int | valuesPerBlock, | ||
int | occupiedBlocks | ||
) |
Constructor. Requires knowledge of the Hdf5 location where data is stored.
Definition at line 107 of file SparseDataReader.h.
References Hdf5Util::H5ScopedScreate::create(), Hdf5Util::H5Base::id(), SparseDataReader< Data_T >::k_dataStr, SparseDataReader< Data_T >::m_dataSet, SparseDataReader< Data_T >::m_dataType, SparseDataReader< Data_T >::m_fileDataSpace, SparseDataReader< Data_T >::m_memDataSpace, SparseDataReader< Data_T >::m_valuesPerBlock, Hdf5Util::H5ScopedDget_type::open(), Hdf5Util::H5ScopedDget_space::open(), and Hdf5Util::H5ScopedDopen::open().
: m_valuesPerBlock(valuesPerBlock), k_dataStr("data") { using namespace Hdf5Util; using namespace Exc; hsize_t dims[2]; hsize_t memDims[1]; // Open the data set m_dataSet.open(location, k_dataStr, H5P_DEFAULT); if (m_dataSet.id() < 0) throw OpenDataSetException("Couldn't open data set: " + k_dataStr); // Get the space and type m_fileDataSpace.open(m_dataSet.id()); m_dataType.open(m_dataSet.id()); if (m_fileDataSpace.id() < 0) throw GetDataSpaceException("Couldn't get data space"); if (m_dataType.id() < 0) throw GetDataTypeException("Couldn't get data type"); // Make the memory data space memDims[0] = m_valuesPerBlock; m_memDataSpace.create(H5S_SIMPLE); H5Sset_extent_simple(m_memDataSpace.id(), 1, memDims, NULL); // Get the dimensions and check they match H5Sget_simple_extent_dims(m_fileDataSpace.id(), dims, NULL); if (dims[1] != static_cast<hsize_t>(m_valuesPerBlock)) { throw FileIntegrityException("Block length mismatch in " "SparseDataReader"); } if (dims[0] != static_cast<hsize_t>(occupiedBlocks)) throw FileIntegrityException("Block count mismatch in " "SparseDataReader"); }
void SparseDataReader< Data_T >::readBlock | ( | int | idx, |
Data_T & | result | ||
) |
Reads a block, storing the data in result, which is assumed to contain enough room for m_valuesPerBlock entries.
Definition at line 150 of file SparseDataReader.h.
References Hdf5Util::H5Base::id(), SparseDataReader< Data_T >::m_dataSet, SparseDataReader< Data_T >::m_fileDataSpace, SparseDataReader< Data_T >::m_memDataSpace, and SparseDataReader< Data_T >::m_valuesPerBlock.
{ using namespace Hdf5Util; using namespace Exc; hsize_t offset[2]; hsize_t count[2]; herr_t status; offset[0] = idx; // Index of block offset[1] = 0; // Index of first data in block. Always 0 count[0] = 1; // Number of columns to read. Always 1 count[1] = m_valuesPerBlock; // Number of values in one column status = H5Sselect_hyperslab(m_fileDataSpace.id(), H5S_SELECT_SET, offset, NULL, count, NULL); if (status < 0) { throw ReadHyperSlabException("Couldn't select slab " + boost::lexical_cast<std::string>(idx)); } status = H5Dread(m_dataSet.id(), DataTypeTraits<Data_T>::h5type(), m_memDataSpace.id(), m_fileDataSpace.id(), H5P_DEFAULT, &result); }
void SparseDataReader< Data_T >::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 enough room for m_valuesPerBlock entries.
Definition at line 180 of file SparseDataReader.h.
References Hdf5Util::H5Base::id(), SparseDataReader< Data_T >::m_dataSet, SparseDataReader< Data_T >::m_fileDataSpace, and SparseDataReader< Data_T >::m_valuesPerBlock.
Referenced by SparseFieldIO::readData().
{ using namespace Hdf5Util; using namespace Exc; hsize_t offset[2]; hsize_t count[2]; herr_t status; offset[0] = idxLo; // Index of block offset[1] = 0; // Index of first data in block. Always 0 count[0] = memoryList.size(); // Number of columns to read. count[1] = m_valuesPerBlock; // Number of values in one column status = H5Sselect_hyperslab(m_fileDataSpace.id(), H5S_SELECT_SET, offset, NULL, count, NULL); if (status < 0) { throw ReadHyperSlabException("Couldn't select slab " + boost::lexical_cast<std::string>(idxLo)); } // Make the memory data space --- Hdf5Util::H5ScopedScreate localMemDataSpace; hsize_t memDims[2]; memDims[0] = memoryList.size(); memDims[1] = m_valuesPerBlock; localMemDataSpace.create(H5S_SIMPLE); H5Sset_extent_simple(localMemDataSpace.id(), 2, memDims, NULL); // Setup the temporary memory region --- int bytesPerValue = 0; { hid_t t = DataTypeTraits<Data_T>::h5type(); if (t == H5T_NATIVE_CHAR) bytesPerValue = 1; else if (t == H5T_NATIVE_SHORT) bytesPerValue = 2; else if (t == H5T_NATIVE_FLOAT) bytesPerValue = 4; else if (t == H5T_NATIVE_DOUBLE) bytesPerValue = 8; } int dim = sizeof(Data_T) / bytesPerValue; std::vector<Data_T> bigblock(memoryList.size() * m_valuesPerBlock/dim); status = H5Dread(m_dataSet.id(), DataTypeTraits<Data_T>::h5type(), localMemDataSpace.id(), m_fileDataSpace.id(), H5P_DEFAULT, &bigblock[0]); if (status < 0) { throw Hdf5DataReadException("Couldn't read slab " + boost::lexical_cast<std::string>(idxLo)); } // Distribute block data into memory slots --- for (size_t i = 0; i < memoryList.size(); ++i) { memcpy(memoryList[i], &bigblock[i * m_valuesPerBlock / dim], bytesPerValue * m_valuesPerBlock); } }
Hdf5Util::H5ScopedDopen SparseDataReader< Data_T >::m_dataSet [private] |
Definition at line 92 of file SparseDataReader.h.
Referenced by SparseDataReader< Data_T >::readBlock(), SparseDataReader< Data_T >::readBlockList(), and SparseDataReader< Data_T >::SparseDataReader().
Hdf5Util::H5ScopedDget_space SparseDataReader< Data_T >::m_fileDataSpace [private] |
Definition at line 93 of file SparseDataReader.h.
Referenced by SparseDataReader< Data_T >::readBlock(), SparseDataReader< Data_T >::readBlockList(), and SparseDataReader< Data_T >::SparseDataReader().
Hdf5Util::H5ScopedDget_type SparseDataReader< Data_T >::m_dataType [private] |
Definition at line 94 of file SparseDataReader.h.
Referenced by SparseDataReader< Data_T >::SparseDataReader().
Hdf5Util::H5ScopedScreate SparseDataReader< Data_T >::m_memDataSpace [private] |
Definition at line 95 of file SparseDataReader.h.
Referenced by SparseDataReader< Data_T >::readBlock(), and SparseDataReader< Data_T >::SparseDataReader().
int SparseDataReader< Data_T >::m_valuesPerBlock [private] |
Definition at line 97 of file SparseDataReader.h.
Referenced by SparseDataReader< Data_T >::readBlock(), SparseDataReader< Data_T >::readBlockList(), and SparseDataReader< Data_T >::SparseDataReader().
const std::string SparseDataReader< Data_T >::k_dataStr [private] |
Definition at line 99 of file SparseDataReader.h.
Referenced by SparseDataReader< Data_T >::SparseDataReader().