Newer
Older
* Distributed under the OSI-approved Apache License, Version 2.0. See
* accompanying file Copyright.txt for details.
*
* Engine.cpp
*
* Created on: Dec 19, 2016
* Author: wfg
*/
#include <ios> //std::ios_base::failure
#include "adios2/ADIOSMPI.h"
#include "adios2/core/Support.h"
#include "adios2/core/adiosFunctions.h"
Engine::Engine(ADIOS &adios, const std::string engineType,
const std::string &name, const std::string accessMode,
MPI_Comm mpiComm, const Method &method,
const std::string endMessage)
: m_MPIComm(mpiComm), m_EngineType(engineType), m_Name(name),
m_AccessMode(accessMode), m_Method(method), m_ADIOS(adios),
m_DebugMode(m_Method.m_DebugMode), m_EndMessage(endMessage)
{
if (m_MPIComm == MPI_COMM_NULL)
{
throw std::ios_base::failure(
"ERROR: engine communicator is MPI_COMM_NULL,"
" in call to ADIOS Open or Constructor\n");
}
}
MPI_Comm_rank(m_MPIComm, &m_RankMPI);
MPI_Comm_size(m_MPIComm, &m_SizeMPI);
}
void Engine::SetCallBack(std::function<void(const void *, std::string,
std::string, std::string, Dims)>
static void engineThrowUp(const std::string &engineType,
const std::string &func)
{
throw std::invalid_argument(
"ERROR: Engine bass class " + func + "() called. " + engineType +
" child class is not implementing this function\n");
}
// should these functions throw an exception?
void Engine::Write(Variable<char> & /*variable*/, const char * /*values*/) {}
void Engine::Write(Variable<unsigned char> & /*variable*/,
const unsigned char * /*values*/)
void Engine::Write(Variable<short> & /*variable*/, const short * /*values*/) {}
void Engine::Write(Variable<unsigned short> & /*variable*/,
const unsigned short * /*values*/)
void Engine::Write(Variable<int> & /*variable*/, const int * /*values*/) {}
void Engine::Write(Variable<unsigned int> & /*variable*/,
const unsigned int * /*values*/)
void Engine::Write(Variable<long int> & /*variable*/,
const long int * /*values*/)
void Engine::Write(Variable<unsigned long int> & /*variable*/,
const unsigned long int * /*values*/)
void Engine::Write(Variable<long long int> & /*variable*/,
const long long int * /*values*/)
void Engine::Write(Variable<unsigned long long int> & /*variable*/,
const unsigned long long int * /*values*/)
void Engine::Write(Variable<float> & /*variable*/, const float * /*values*/) {}
void Engine::Write(Variable<double> & /*variable*/, const double * /*values*/)
void Engine::Write(Variable<long double> & /*variable*/,
const long double * /*values*/)
void Engine::Write(Variable<std::complex<float>> & /*variable*/,
const std::complex<float> * /*values*/)
void Engine::Write(Variable<std::complex<double>> & /*variable*/,
const std::complex<double> * /*values*/)
void Engine::Write(Variable<std::complex<long double>> & /*variable*/,
const std::complex<long double> * /*values*/)
void Engine::Write(VariableCompound & /*variable*/, const void * /*values*/) {}
void Engine::Write(const std::string & /*variableName*/,
const char * /*values*/)
{
}
void Engine::Write(const std::string & /*variableName*/,
const unsigned char * /*values*/)
{
}
void Engine::Write(const std::string & /*variableName*/,
const short * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const unsigned short * /*values*/)
void Engine::Write(const std::string & /*variableName*/, const int * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const unsigned int * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const long int * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const unsigned long int * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const long long int * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const unsigned long long int * /*values*/)
{
}
void Engine::Write(const std::string & /*variableName*/,
const float * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const double * /*values*/)
void Engine::Write(const std::string & /*variableName*/,
const long double * /*values*/)
{
}
void Engine::Write(const std::string & /*variableName*/,
const std::complex<float> * /*values*/)
{
}
void Engine::Write(const std::string & /*variableName*/,
const std::complex<double> * /*values*/)
{
}
void Engine::Write(const std::string & /*variableName*/,
const std::complex<long double> * /*values*/)
{
}
void Engine::Write(const std::string & /*variableName*/,
const void * /*values*/)
void Engine::Advance(float /*timeout_sec*/) {}
void Engine::Advance(AdvanceMode /*mode*/, float /*timeout_sec*/) {}
AdvanceMode /*mode*/,
std::function<void(std::shared_ptr<adios::Engine>)> /*callback*/)
void Engine::Close(const int /*transportIndex*/) {}
Variable<void> *Engine::InquireVariable(const std::string & /*name*/,
const bool /*readIn*/)
Variable<char> *Engine::InquireVariableChar(const std::string & /*name*/,
const bool /*readIn*/)
Variable<unsigned char> *
Engine::InquireVariableUChar(const std::string & /*name*/,
const bool /*readIn*/)
Variable<short> *Engine::InquireVariableShort(const std::string & /*name*/,
const bool /*readIn*/)
Variable<unsigned short> *
Engine::InquireVariableUShort(const std::string & /*name*/,
const bool /*readIn*/)
Variable<int> *Engine::InquireVariableInt(const std::string & /*name*/,
const bool /*readIn*/)
Variable<unsigned int> *
Engine::InquireVariableUInt(const std::string & /*name*/, const bool /*readIn*/)
engineThrowUp(m_EngineType, "InquireVariableUInt");
Variable<long int> *Engine::InquireVariableLInt(const std::string & /*name*/,
const bool /*readIn*/)
Engine::InquireVariableULInt(const std::string & /*name*/,
const bool /*readIn*/)
Variable<long long int> *
Engine::InquireVariableLLInt(const std::string & /*name*/,
const bool /*readIn*/)
Engine::InquireVariableULLInt(const std::string & /*name*/,
const bool /*readIn*/)
Variable<float> *Engine::InquireVariableFloat(const std::string & /*name*/,
const bool /*readIn*/)
Variable<double> *Engine::InquireVariableDouble(const std::string & /*name*/,
const bool /*readIn*/)
Variable<long double> *
Engine::InquireVariableLDouble(const std::string & /*name*/,
const bool /*readIn*/)
Engine::InquireVariableCFloat(const std::string & /*name*/,
const bool /*readIn*/)
Engine::InquireVariableCDouble(const std::string & /*name*/,
const bool /*readIn*/)
Engine::InquireVariableCLDouble(const std::string & /*name*/,
const bool /*readIn*/)
VariableCompound *Engine::InquireVariableCompound(const std::string & /*name*/,
const bool /*readIn*/)
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
void Engine::ScheduleRead(Variable<char> &variable, char *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<unsigned char> &variable,
unsigned char *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<short> &variable, short *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<unsigned short> &variable,
unsigned short *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<int> &variable, int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<unsigned int> &variable,
unsigned int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<long int> &variable, long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<unsigned long int> &variable,
unsigned long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<long long int> &variable,
long long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<unsigned long long int> &variable,
unsigned long long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<float> &variable, float *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<double> &variable, double *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<long double> &variable, long double *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<std::complex<float>> &variable,
std::complex<float> *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<std::complex<double>> &variable,
std::complex<double> *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(Variable<std::complex<long double>> &variable,
std::complex<long double> *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, char *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName,
unsigned char *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, short *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName,
unsigned short *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, unsigned int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName,
unsigned long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName,
long long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName,
unsigned long long int *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, float *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, double *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName, long double *values)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead(const std::string &variableName,
std::complex<float> *values)
engineThrowUp(m_EngineType, "ScheduleRead");
void Engine::ScheduleRead(const std::string &variableName,
std::complex<double> *values)
Podhorszki, Norbert
committed
{
engineThrowUp(m_EngineType, "ScheduleRead");
Podhorszki, Norbert
committed
}
void Engine::ScheduleRead(const std::string &variableName,
std::complex<long double> *values)
engineThrowUp(m_EngineType, "ScheduleRead");
void Engine::ScheduleRead(const std::string & /*variableName*/)
{
engineThrowUp(m_EngineType, "ScheduleRead");
}
void Engine::ScheduleRead() { engineThrowUp(m_EngineType, "ScheduleRead"); }
Podhorszki, Norbert
committed
void Engine::PerformReads(PerformReadMode /*mode*/){};
// PROTECTED
void Engine::Init() {}
void Engine::InitParameters() {}
void Engine::InitTransports() {}
void Engine::CheckParameter(
const std::map<std::string, std::string>::const_iterator itParameter,
const std::map<std::string, std::string> ¶meters,
const std::string parameterName, const std::string hint) const
{
if (itParameter == parameters.end())
{
{
throw std::invalid_argument("ERROR: parameter name " +
parameterName + " not found " + hint);
}
}
}
bool Engine::TransportNamesUniqueness() const
{
auto lf_CheckTransportsType =
[&](const std::set<std::string> &specificType) -> bool
std::set<std::string> transportNames;
for (const auto ¶meters : m_Method.m_TransportParameters)
{
auto itTransport = parameters.find("transport");
if (m_DebugMode == true)
{
if (itTransport == parameters.end())
{
throw std::invalid_argument("ERROR: transport not defined "
"in Method input to Engine " +
m_Name);
}
}
const std::string type(itTransport->second);
if (specificType.count(type) == 1) // file transports type
{
std::string name(m_Name);
auto itName = parameters.find("name");
if (itName != parameters.end())
{
name = itName->second;
}
if (transportNames.count(name) == 0)
{
transportNames.insert(name);
}
else
{
return false;
}
}
}
return lf_CheckTransportsType(Support::FileTransports);
}
void Engine::CheckTransportIndex(const int transportIndex)
{
if (transportIndex >= static_cast<int>(m_Transports.size()) ||
transportIndex < -1)
{
throw std::invalid_argument(
"ERROR: transport index " + std::to_string(transportIndex) +
" is out of range, in call to " + m_Name + "Close \n");
}
} // end namespace adios