Skip to content
Snippets Groups Projects
DataManWriter.h 6.36 KiB
Newer Older
wfg's avatar
wfg committed
/*
 * DataMan.h
 *
 *  Created on: Jan 10, 2017
 *      Author: wfg
 */

#ifndef DATAMANWRITER_H_
#define DATAMANWRITER_H_
wfg's avatar
wfg committed

#include <iostream> //std::cout must be removed, only used for hello example
#include <unistd.h> //sleep must be removed
wfg's avatar
wfg committed

#include "core/Engine.h"
#include "format/BP1Writer.h"
wfg's avatar
wfg committed

//supported capsules
#include "capsule/heap/STLVector.h"
wfg's avatar
wfg committed

Wang, Ruonan's avatar
Wang, Ruonan committed
#include "DataManager.h"  //here comes your DataMan header
wfg's avatar
wfg committed
namespace adios
{

class DataManWriter : public Engine
wfg's avatar
wfg committed
{

public:

    /**
     * Constructor for dataman engine Writer for WAN communications
     * @param adios
wfg's avatar
wfg committed
     * @param name unique name given to the engine
     * @param accessMode
     * @param mpiComm
     * @param method
     * @param debugMode
     * @param cores
wfg's avatar
wfg committed
     */
    DataManWriter( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm,
                   const Method& method, const bool debugMode = false, const unsigned int cores = 1 );
wfg's avatar
wfg committed

wfg's avatar
wfg committed

    void SetCallBack( std::function<void( const void*, std::string, std::string, std::string, Dims )> callback );

    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;
wfg's avatar
wfg committed
    bool m_DoMonitor = 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

wfg's avatar
wfg committed
    void Write( Variable<char>& variable, const char* values );
    void Write( Variable<unsigned char>& variable, const unsigned char* values );
    void Write( Variable<short>& variable, const short* values );
    void Write( Variable<unsigned short>& variable, const unsigned short* values );
    void Write( Variable<int>& variable, const int* values );
    void Write( Variable<unsigned int>& variable, const unsigned int* values );
    void Write( Variable<long int>& variable, const long int* values );
    void Write( Variable<unsigned long int>& variable, const unsigned long int* values );
    void Write( Variable<long long int>& variable, const long long int* values );
    void Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ) ;
    void Write( Variable<float>& variable, const float* values );
    void Write( Variable<double>& variable, const double* values );
    void Write( Variable<long double>& variable, const long double* values );
    void Write( Variable<std::complex<float>>& variable, const std::complex<float>* values );
    void Write( Variable<std::complex<double>>& variable, const std::complex<double>* values );
    void Write( Variable<std::complex<long double>>& variable, const std::complex<long double>* values );
wfg's avatar
wfg committed

    void Write( const std::string variableName, const char* values );
    void Write( const std::string variableName, const unsigned char* values );
    void Write( const std::string variableName, const short* values );
    void Write( const std::string variableName, const unsigned short* values );
    void Write( const std::string variableName, const int* values );
    void Write( const std::string variableName, const unsigned int* values );
    void Write( const std::string variableName, const long int* values );
    void Write( const std::string variableName, const unsigned long int* values );
    void Write( const std::string variableName, const long long int* values );
    void Write( const std::string variableName, const unsigned long long int* values );
    void Write( const std::string variableName, const float* values );
    void Write( const std::string variableName, const double* values );
    void Write( const std::string variableName, const long double* values );
    void Write( const std::string variableName, const std::complex<float>* values );
    void Write( const std::string variableName, const std::complex<double>* values );
    void Write( const std::string variableName, const std::complex<long double>* values );

    /**
     * From transport Mdtm in m_Method
     * @param parameter must be an accepted parameter
     * @param mdtmParameters
     * @return value either returns user-defined from "parameter=value" or a default
     */
    std::string GetMdtmParameter( const std::string parameter, const std::map<std::string,std::string>& mdtmParameters );

wfg's avatar
wfg committed

    template<class T>
    void WriteVariableCommon( Variable<T>& variable, const T* values )
wfg's avatar
wfg committed
    {
        //here comes your magic at Writing now variable.m_UserValues has the data passed by the user
wfg's avatar
wfg committed
        //set variable
        variable.m_AppValues = values;
        m_WrittenVariables.insert( variable.m_Name );

        //This part will go away, this is just to monitor variables per rank
        json jmsg;
        jmsg["doid"] = m_Name;
        jmsg["var"] = variable.m_Name;
        jmsg["dtype"] = GetType<T>();
        jmsg["putshape"] = variable.m_Dimensions;
        if(variable.m_GlobalDimensions.size() == 0) variable.m_GlobalDimensions = variable.m_Dimensions;
        jmsg["varshape"] = variable.m_GlobalDimensions;
        if(variable.m_GlobalOffsets.size() == 0) variable.m_GlobalOffsets.assign(variable.m_Dimensions.size(),0);
        jmsg["offset"] = variable.m_GlobalOffsets;
        jmsg["timestep"] = 0;
        m_Man.put(values, jmsg);
        if(m_DoMonitor){
            MPI_Barrier( m_MPIComm );
            std::cout << "I am hooked to the DataMan library\n";
            std::cout << "putshape " << variable.m_Dimensions.size() << endl;
            std::cout << "varshape " << variable.m_GlobalDimensions.size() << endl;
            std::cout << "offset " << variable.m_GlobalOffsets.size() << endl;
            for( int i = 0; i < m_SizeMPI; ++i )
wfg's avatar
wfg committed
            {
                if( i == m_RankMPI )
                {
                    std::cout << "Rank: " << m_RankMPI << "\n";
                    variable.Monitor( std::cout );
                    std::cout << std::endl;
                }
                else
                {
                    sleep( 1 );
                }
wfg's avatar
wfg committed
            }
#endif /* DATAMANWRITER_H_ */