-
William F Godoy authoredWilliam F Godoy authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ADIOS.h 6.57 KiB
/*
* Distributed under the OSI-approved Apache License, Version 2.0. See
* accompanying file Copyright.txt for details.
*
* ADIOS.h : ADIOS library starting point, factory class for IO objects
* Created on: Oct 3, 2016
* Author: William F Godoy godoywf@ornl.gov
*/
#ifndef ADIOS2_CORE_ADIOS_H_
#define ADIOS2_CORE_ADIOS_H_
/// \cond EXCLUDE_FROM_DOXYGEN
#include <functional> //std::function
#include <map>
#include <memory> //std::shared_ptr
#include <string>
#include <vector>
/// \endcond
#include "adios2/ADIOSConfig.h"
#include "adios2/ADIOSMPICommOnly.h"
#include "adios2/ADIOSTypes.h"
#include "adios2/core/IO.h"
#include "adios2/core/Operator.h"
namespace adios2
{
/** @brief Point of entry class for an application.
* Serves as factory of IO class objects and Transforms */
class ADIOS
{
public:
/** Passed from parallel constructor, MPI_Comm is a pointer itself. */
MPI_Comm m_MPIComm;
/**
* @brief Constructor for MPI applications WITH a XML config file
* @param configFile XML format (maybe support different formats in the
* future?)
* @param mpiComm MPI communicator from application
* @param debugMode true: extra exception checks (recommended)
*/
ADIOS(const std::string configFile, MPI_Comm mpiComm,
const bool debugMode = true, const std::string hostLanguage = "C++");
/**
* @brief Constructor for non-MPI applications WITH a XML config file
* @param configFile XML format (maybe support different formats in the
* future?)
* @param debugMode true: extra exception checks (recommended)
*/
ADIOS(const std::string configFile, const bool debugMode = true,
const std::string hostLanguage = "C++");
/**
* @brief Constructor for MPI apps WITHOUT a XML config file
* @param mpiComm MPI communicator from application
* @param debugMode true: extra exception checks (recommended)
*/
ADIOS(MPI_Comm mpiComm, const bool debugMode = true,
const std::string hostLanguage = "C++");
/**
* @brief ADIOS no-MPI default empty constructor
* @param debugMode true: extra exception checks (recommended)
*/
ADIOS(const bool debugMode = true, const std::string hostLanguage = "C++");
/**
* Delete copy constructor explicitly. Objects shouldn't be allowed to be
* redefined. Use smart pointers if this is absolutely necessary.
* @param adios reference to another adios object
*/
ADIOS(const ADIOS &adios) = delete;
~ADIOS() = default;
/**
* Declares a new IO class object. If IO object is defined in the user
* config file, by name, it will be already created during the processing
* the config file. So this function returns a reference to that object.
* Otherwise it will create and return a new IO object with default
* settings.
* Use function InConfigFile() to distinguish between the two cases.
* @param ioName must be unique
* @return reference to existing (or newly created) method inside ADIOS
*/
IO &DeclareIO(const std::string name);
/**
* Retrieve a reference pointer to an existing Operator object
* created with DeclareIO.
* @param name of IO to look for
* @return if IO exists returns a reference to existing IO object inside
* ADIOS, otherwise a nullptr
*/
IO *InquireIO(const std::string name) noexcept;
/**
* Declares a derived class of the Operator abstract class. If object is
* defined in the user
* config file, by name, it will be already created during the processing of
* the config file. So this function returns a reference to that object.
* @param name must be unique for each operator created with DefineOperator
* @param type from derived class
* @param parameters optional parameters
* @return reference to Operator object
*/
Operator &DefineOperator(const std::string name, const std::string type,
const Params ¶meters = Params());
/**
* Signature for passing Callback functions as operators
* @param name unique operator name
* @param function callable function
* @param parameters
* @return reference to Operator object
*/
template <class R, class... Args>
Operator &DefineOperator(const std::string name,
const std::function<R(Args...)> &function,
const Params ¶meters = Params());
/**
* Retrieve a reference pointer to an existing Operator object
* created with DeclareIO.
* @return if IO exists returns a reference to existing IO object inside
* ADIOS, otherwise a nullptr
*/
Operator *InquireOperator(const std::string name) noexcept;
private:
/** XML File to be read containing configuration information */
const std::string m_ConfigFile;
/** if true will do more checks, exceptions, warnings, expect slower code */
const bool m_DebugMode = true;
/** Changed by language bindings in constructor */
const std::string m_HostLanguage = "C++";
/**
* @brief List of IO class objects defined from either ADIOS
* configuration file (XML) or the DeclareIO function explicitly.
* Using map (binary tree) to preserve references returned by DeclareIO.
* <pre>
* Key: unique method name
* Value: IO class object
* </pre>
*/
std::map<std::string, IO> m_IOs;
/** operators created with DefineOperator */
std::map<std::string, std::shared_ptr<Operator>> m_Operators;
/** throws exception if m_MPIComm = MPI_COMM_NULL */
void CheckMPI() const;
/** define CallBack1 */
#define declare_type(T) \
Operator &DefineCallBack( \
const std::string name, \
const std::function<void(const T *, const std::string, \
const std::string, const std::string, \
const Dims &)> &function, \
const Params ¶meters);
ADIOS2_FOREACH_TYPE_1ARG(declare_type)
#undef declare_type
/** define CallBack2 */
Operator &DefineCallBack(
const std::string name,
const std::function<void(void *, const std::string &,
const std::string &, const std::string &,
const Dims &)> &function,
const Params ¶meters);
};
} // end namespace adios2
#include "ADIOS.inl"
#endif /* ADIOS2_ADIOS_H_ */