Newer
Older
* Distributed under the OSI-approved Apache License, Version 2.0. See
* accompanying file Copyright.txt for details.
*
* BPFileReader.cpp
*
* Created on: Feb 27, 2017
* Author: wfg
*/
#include "BPFileReader.h"
#include "../../helper/adiosFunctions.h" // CSVToVector
#include "../../toolkit/transport/file/FileDescriptor.h" // uses POSIX
#include "../../toolkit/transport/file/FilePointer.h" // uses C FILE*
#include "../../toolkit/transport/file/FileStream.h" // uses C++ fstream
BPFileReader::BPFileReader(ADIOS &adios, const std::string &name,
const std::string accessMode, MPI_Comm mpiComm,
const Method &method)
: Engine(adios, "BPFileReader", name, accessMode, mpiComm, method,
" BPFileReader constructor (or call to ADIOS Open).\n"),
Variable<void> *BPFileReader::InquireVariable(const std::string & /*name*/,
// not yet implemented
return nullptr;
Variable<char> *BPFileReader::InquireVariableChar(const std::string &name,
return InquireVariableCommon<char>(name, readIn);
BPFileReader::InquireVariableUChar(const std::string &name, const bool readIn)
return InquireVariableCommon<unsigned char>(name, readIn);
Variable<short> *BPFileReader::InquireVariableShort(const std::string &name,
return InquireVariableCommon<short>(name, readIn);
BPFileReader::InquireVariableUShort(const std::string &name, const bool readIn)
return InquireVariableCommon<unsigned short>(name, readIn);
Variable<int> *BPFileReader::InquireVariableInt(const std::string &name,
return InquireVariableCommon<int>(name, readIn);
BPFileReader::InquireVariableUInt(const std::string &name, const bool readIn)
return InquireVariableCommon<unsigned int>(name, readIn);
Variable<long int> *BPFileReader::InquireVariableLInt(const std::string &name,
return InquireVariableCommon<long int>(name, readIn);
BPFileReader::InquireVariableULInt(const std::string &name, const bool readIn)
return InquireVariableCommon<unsigned long int>(name, readIn);
BPFileReader::InquireVariableLLInt(const std::string &name, const bool readIn)
return InquireVariableCommon<long long int>(name, readIn);
BPFileReader::InquireVariableULLInt(const std::string &name, const bool readIn)
return InquireVariableCommon<unsigned long long int>(name, readIn);
Variable<float> *BPFileReader::InquireVariableFloat(const std::string &name,
return InquireVariableCommon<float>(name, readIn);
Variable<double> *BPFileReader::InquireVariableDouble(const std::string &name,
return InquireVariableCommon<double>(name, readIn);
BPFileReader::InquireVariableLDouble(const std::string &name, const bool readIn)
return InquireVariableCommon<long double>(name, readIn);
BPFileReader::InquireVariableCFloat(const std::string &name, const bool readIn)
return InquireVariableCommon<std::complex<float>>(name, readIn);
BPFileReader::InquireVariableCDouble(const std::string &name, const bool readIn)
return InquireVariableCommon<std::complex<double>>(name, readIn);
}
Variable<std::complex<long double>> *
BPFileReader::InquireVariableCLDouble(const std::string &name,
const bool readIn)
return InquireVariableCommon<std::complex<long double>>(name, readIn);
BPFileReader::InquireVariableCompound(const std::string & /*name*/,
void BPFileReader::Close(const int /*transportIndex*/) {}
// PRIVATE
void BPFileReader::Init()
{
if (m_AccessMode != "r" && m_AccessMode != "read")
{
throw std::invalid_argument(
"ERROR: BPFileReader doesn't support access mode " +
m_AccessMode +
", in call to ADIOS Open or BPFileReader constructor\n");
}
}
void BPFileReader::InitTransports() // maybe move this?
{
if (TransportNamesUniqueness() == false)
{
throw std::invalid_argument(
"ERROR: two transports of the same kind (e.g file IO) "
"can't have the same name, modify with name= in Method "
"AddTransport\n");
}
for (const auto ¶meters : m_Method.m_TransportParameters)
auto itTransport = parameters.find("transport");
if (itTransport->second == "file" || itTransport->second == "File")
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
auto itLibrary = parameters.find("library");
if (itLibrary == parameters.end() ||
itLibrary->second == "POSIX") // use default POSIX
{
auto file = std::make_shared<transport::FileDescriptor>(
m_MPIComm, m_DebugMode);
// m_BP1Reader.OpenRankFiles( m_Name, m_AccessMode, *file );
m_Transports.push_back(std::move(file));
}
else if (itLibrary->second == "FILE*" ||
itLibrary->second == "stdio.h")
{
auto file = std::make_shared<transport::FilePointer>(
m_MPIComm, m_DebugMode);
// m_BP1Reader.OpenRankFiles( m_Name, m_AccessMode, *file );
m_Transports.push_back(std::move(file));
}
else if (itLibrary->second == "fstream" ||
itLibrary->second == "std::fstream")
{
auto file = std::make_shared<transport::FStream>(m_MPIComm,
m_DebugMode);
// m_BP1Reader.OpenRankFiles( m_Name, m_AccessMode, *file );
m_Transports.push_back(std::move(file));
}
else if (itLibrary->second == "MPI-IO")
{
}
else
{
if (m_DebugMode == true)
{
throw std::invalid_argument(
"ERROR: file transport library " + itLibrary->second +
" not supported, in " + m_Name + m_EndMessage);
}
}
}
else
{
if (m_DebugMode == true)
{
throw std::invalid_argument(
"ERROR: transport " + itTransport->second +
" (you mean File?) not supported, in " + m_Name +
m_EndMessage);
}