Newer
Older
* Distributed under the OSI-approved Apache License, Version 2.0. See
* accompanying file Copyright.txt for details.
* HDF5ReaderP.cpp
#include "adios2/ADIOSMPI.h"
namespace adios
{
HDF5Reader::HDF5Reader(ADIOS &adios, const std::string name,
const std::string accessMode, MPI_Comm mpiComm,
const Method &method)
: Engine(adios, "HDF5Reader", name, accessMode, mpiComm, method,
" HDF5Reader constructor (or call to ADIOS Open).\n")
{
if (m_AccessMode != "r" && m_AccessMode != "read")
{
if (m_AccessMode != "r" && m_AccessMode != "read")
{
throw std::invalid_argument(
"ERROR: HDF5Reader doesn't support access mode " + m_AccessMode +
", in call to ADIOS Open or HDF5Reader constructor\n");
}
m_H5File.Init(m_Name, m_MPIComm, false);
Variable<void> *HDF5Reader::InquireVariable(const std::string &variableName,
const bool readIn)
std::cout << "Not implemented: HDF5Reader::InquireVariable()" << std::endl;
Variable<char> *HDF5Reader::InquireVariableChar(const std::string &variableName,
const bool readIn)
{
Variable<unsigned char> *
HDF5Reader::InquireVariableUChar(const std::string &variableName,
const bool readIn)
{
Variable<short> *
HDF5Reader::InquireVariableShort(const std::string &variableName,
const bool readIn)
{
Variable<unsigned short> *
HDF5Reader::InquireVariableUShort(const std::string &variableName,
const bool readIn)
{
Variable<int> *HDF5Reader::InquireVariableInt(const std::string &variableName,
Variable<unsigned int> *
HDF5Reader::InquireVariableUInt(const std::string &variableName, const bool)
{
Variable<long int> *
HDF5Reader::InquireVariableLInt(const std::string &variableName, const bool)
{
HDF5Reader::InquireVariableULInt(const std::string &variableName, const bool)
{
HDF5Reader::InquireVariableLLInt(const std::string &variableName, const bool)
{
Variable<unsigned long long int> *
HDF5Reader::InquireVariableULLInt(const std::string &variableName, const bool)
{
Variable<float> *
HDF5Reader::InquireVariableFloat(const std::string &variableName, const bool)
{
Variable<double> *
HDF5Reader::InquireVariableDouble(const std::string &variableName, const bool)
{
std::cout << " ... reading var: " << variableName << std::endl;
}
{
std::cout << " ... I saw total timesteps: " << totalts << std::endl;
}
Variable<long double> *
HDF5Reader::InquireVariableLDouble(const std::string &variableName, const bool)
{
Variable<std::complex<float>> *
HDF5Reader::InquireVariableCFloat(const std::string &variableName, const bool)
{
Variable<std::complex<double>> *
HDF5Reader::InquireVariableCDouble(const std::string &variableName, const bool)
{
Variable<std::complex<long double>> *
HDF5Reader::InquireVariableCLDouble(const std::string &variableName, const bool)
{
VariableCompound *
HDF5Reader::InquireVariableCompound(const std::string &variableName,
const bool readIn)
{
template <class T>
void HDF5Reader::UseHDFRead(const std::string &variableName, T *values,
hid_t dataSetId =
H5Dopen(m_H5File.m_GroupId, variableName.c_str(), H5P_DEFAULT);
{
std::cout << " opened to read: " << variableName << std::endl;
}
hid_t fileSpace = H5Dget_space(dataSetId);
int ndims = H5Sget_simple_extent_ndims(fileSpace);
herr_t status_n = H5Sget_simple_extent_dims(fileSpace, dims, NULL);
hsize_t start[ndims] = {0}, count[ndims] = {0}, stride[ndims] = {1};
int totalElements = 1;
for (int i = 0; i < ndims; i++)
{
std::cout << " [" << i << "] th dimension: " << dims[i] << std::endl;
count[i] = dims[i];
totalElements *= dims[i];
}
start[0] = m_RankMPI * dims[0] / m_SizeMPI;
count[0] = dims[0] / m_SizeMPI;
if (m_RankMPI == m_SizeMPI - 1)
count[0] = dims[0] - count[0] * (m_SizeMPI - 1);
std::cout << " rank = " << m_RankMPI << ", count=" << count[0]
hid_t ret = H5Sselect_hyperslab(fileSpace, H5S_SELECT_SET, start, stride,
count, NULL);
if (ret < 0)
{
return;
}
hid_t memDataSpace = H5Screate_simple(ndims, count, NULL);
int elementsRead = 1;
for (int i = 0; i < ndims; i++)
{
elementsRead *= count[i];
}
T data_array[elementsRead];
ret = H5Dread(dataSetId, h5Type, memDataSpace, fileSpace, H5P_DEFAULT,
data_array);
for (int i = 0; i < elementsRead; i++)
{
std::cout << "... rank " << m_RankMPI << " , " << data_array[i]
H5Sclose(fileSpace);
H5Dclose(dataSetId);
void HDF5Reader::Advance(float timeoutSec) { m_H5File.Advance(); }
void HDF5Reader::Close(const int transportIndex) { m_H5File.Close(); }