Skip to content
Snippets Groups Projects
DataManReader.h 4.49 KiB
Newer Older
/*
 * DataManReader.h
 *
 *  Created on: Feb 21, 2017
 *      Author: wfg
 */

#ifndef DATAMANREADER_H_
#define DATAMANREADER_H_

#include <iostream> //std::cout << Needs to go

#include "core/Engine.h"
#include "format/BP1Writer.h"

//supported capsules
#include "capsule/heap/STLVector.h"

#include "DataManager.h"

namespace adios
{

class DataManReader : public Engine
{

public:

    /**
     * Constructor for dataman engine Reader for WAN communications
     * @param adios
     * @param name
     * @param accessMode
     * @param mpiComm
     * @param method
     * @param debugMode
     */
    DataManReader( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm,
                   const Method& method, const IOMode iomode, const float timeout_sec,
                   const bool debugMode = false, const unsigned int nthreads = 1 );

    ~DataManReader( );

    /**
     * Set callback function from user application
     * @param callback function (get) provided by the user to be applied in DataMan
     */
    void SetCallBack( std::function<void( const void*, std::string, std::string, std::string, Dims )> callback );

    Variable<void>* InquireVariable( const std::string name, const bool readIn = true );
    Variable<char>* InquireVariableChar( const std::string name, const bool readIn = true );
    Variable<unsigned char>* InquireVariableUChar( const std::string name, const bool readIn = true );
    Variable<short>* InquireVariableShort( const std::string name, const bool readIn = true );
    Variable<unsigned short>* InquireVariableUShort( const std::string name, const bool readIn = true );
    Variable<int>* InquireVariableInt( const std::string name, const bool readIn = true );
    Variable<unsigned int>* InquireVariableUInt( const std::string name, const bool readIn = true );
    Variable<long int>* InquireVariableLInt( const std::string name, const bool readIn = true );
    Variable<unsigned long int>* InquireVariableULInt( const std::string name, const bool readIn = true );
    Variable<long long int>* InquireVariableLLInt( const std::string name, const bool readIn = true );
    Variable<unsigned long long int>* InquireVariableULLInt( const std::string name, const bool readIn = true );
    Variable<float>* InquireVariableFloat( const std::string name, const bool readIn = true );
    Variable<double>* InquireVariableDouble( const std::string name, const bool readIn = true );
    Variable<long double>* InquireVariableLDouble( const std::string name, const bool readIn = true );
    Variable<std::complex<float>>* InquireVariableCFloat( const std::string name, const bool readIn = true );
    Variable<std::complex<double>>* InquireVariableCDouble( const std::string name, const bool readIn = true );
    Variable<std::complex<long double>>* InquireVariableCLDouble( const std::string name, const bool readIn = true );

    /**
     * Not implemented
     * @param name
     * @param readIn
     * @return
     */
    VariableCompound* InquireVariableCompound( const std::string name, const bool readIn = true );


    void Close( const int transportIndex = -1 );

private:

    capsule::STLVector m_Buffer; ///< heap capsule, contains data and metadata buffers
    format::BP1Writer m_BP1Writer; ///< format object will provide the required BP functionality to be applied on m_Buffer and m_Transports

    bool m_DoRealTime = false;
    DataManager m_Man;
    std::function<void( const void*, std::string, std::string, std::string, Dims )> m_CallBack; ///< call back function

    void Init( );  ///< calls InitCapsules and InitTransports based on Method, called from constructor
    void InitCapsules( );
    void InitTransports( ); ///< from Transports

    std::string GetMdtmParameter( const std::string parameter, const std::map<std::string,std::string>& mdtmParameters );


    template< class T >
    Variable<T>* InquireVariableCommon( const std::string name, const bool readIn )
    {
        std::cout << "I am hooked to the DataMan library\n";
        std::cout << "Hello DatamanReader from rank " << m_RankMPI << "\n";
        std::cout << "Trying to read variable " << name << " from one of the variables coming from a WAN transport\n";

        //here read variable metadata (dimensions, type, etc.)...then create a Variable like below:
        //Variable<T>& variable = m_ADIOS.DefineVariable<T>( m_Name + "/" + name, )
        //return &variable; //return address if success
        return nullptr; //on failure
    }



};


} //end namespace


#endif /* DATAMANREADER_H_ */