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

#include <iostream>


#include "engine/dataman/DataMan.h"
wfg's avatar
wfg committed
#include "core/Support.h"

//supported capsules
#include "capsule/Heap.h"

//supported transports
#include "transport/POSIX.h"
#include "transport/FStream.h"
#include "transport/File.h"


namespace adios
{
namespace engine
{

DataMan::DataMan( const std::string streamName, const std::string accessMode, const MPI_Comm mpiComm,
                  const Method& method, const bool debugMode, const unsigned int cores ):
    Engine( "DataMan", streamName, accessMode, mpiComm, method, debugMode, cores, " DataMan constructor (or call to ADIOS Open).\n" )
wfg's avatar
wfg committed
{
    Init( );
}


DataMan::~DataMan( )
{ }


void DataMan::Init( )
{
    InitCapsules( );
    InitTransports( );
}


void DataMan::Write( Group& group, const std::string variableName, const char* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const unsigned char* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const short* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const unsigned short* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const int* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const unsigned int* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const long int* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const unsigned long int* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const long long int* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const unsigned long long int* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const float* values )
{

}

void DataMan::Write( Group& group, const std::string variableName, const double* values )
{

}


void DataMan::Write( Group& group, const std::string variableName, const long double* values )
{

}


void DataMan::Write( const std::string variableName, const char* values )
{

}

void DataMan::Write( const std::string variableName, const unsigned char* values )
{

}

void DataMan::Write( const std::string variableName, const short* values )
{

}

void DataMan::Write( const std::string variableName, const unsigned short* values )
{

}

void DataMan::Write( const std::string variableName, const int* values )
{
    auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("int"), " from call to Write int*" );
    std::cout << "Hello from DataMan Write integer with index " << index << "\n";

}

void DataMan::Write( const std::string variableName, const unsigned int* values )
{

}

void DataMan::Write( const std::string variableName, const long int* values )
{

}

void DataMan::Write( const std::string variableName, const unsigned long int* values )
{

}

void DataMan::Write( const std::string variableName, const long long int* values )
{

}

void DataMan::Write( const std::string variableName, const unsigned long long int* values )
{

}

void DataMan::Write( const std::string variableName, const float* values )
{

}

void DataMan::Write( const std::string variableName, const double* values )
{
    auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("double"), " from call to Write double*" );
    std::cout << "Hello from Data Write double with index " << index << "\n";
}


void DataMan::Write( const std::string variableName, const long double* values )
{

}


void DataMan::InitCapsules( )
{
    if( m_DebugMode == true )
    {
        if( m_Method.m_CapsuleParameters.size() > 1 )
        {
            throw std::invalid_argument( "ERROR: DataMan engine only allows one heap buffer, in " + m_Name +
wfg's avatar
wfg committed
                                         m_EndMessage );
        }
        else if( m_Method.m_CapsuleParameters.size() == 1 )
        {
            auto itType = m_Method.m_CapsuleParameters[0].find( "buffer" );

            if( m_DebugMode == true )
                CheckParameter( itType, m_Method.m_CapsuleParameters[0], " capsule buffer",
                                ", in " + m_Name + m_EndMessage );

            if( !( itType->second == "Heap" || itType->second == "HEAP" ) )
                throw std::invalid_argument( "ERROR: DataMan doesn't support Capsule of buffer type " +
wfg's avatar
wfg committed
                                              itType->second + " in " + m_Name + m_EndMessage );
        }
    }
    //Create single capsule of type heap
    m_Capsules.push_back( std::make_shared<Heap>( m_AccessMode, m_RankMPI, m_Cores ) );
}



void DataMan::InitTransports( )
{
    std::set< std::string > transportStreamNames; //used to check for name conflict between transports

    const unsigned int transportsSize = m_Method.m_TransportParameters.size();

    for( const auto& parameters : m_Method.m_TransportParameters )
    {
        auto itTransport = parameters.find( "transport" );
        if( m_DebugMode == true )
            CheckParameter( itTransport, parameters, "transport", ", in " + m_Name + m_EndMessage );


        if( itTransport->second == "POSIX" )
        {
            m_Transports.push_back( std::make_shared<POSIX>( m_MPIComm, m_DebugMode ) );
        }
        else if( itTransport->second == "File" )
        {
            m_Transports.push_back( std::make_shared<File>( m_MPIComm, m_DebugMode ) );
        }
        else if( itTransport->second == "FStream" )
        {
            m_Transports.push_back( std::make_shared<FStream>( m_MPIComm, m_DebugMode ) );
        }
        else if( itTransport->second == "MPIFile" )
        {
            //m_Transports.push_back( std::make_shared<MPIFile>( m_MPIComm, m_DebugMode ) ); not yet supported
        }
        else
        {
            if( m_DebugMode == true )
                throw std::invalid_argument( "ERROR: transport + " + itTransport->second + " not supported, in " +
                                              m_Name + m_EndMessage );
        }
        //name
        if( transportsSize > 1 )
        {
            auto itName = parameters.find( "name" ); //first check name

            if( m_DebugMode == true )
                CheckParameter( itName, parameters, "name", " in transport " + itTransport->second +
                                ", in " + m_Name + m_EndMessage );

            m_Transports.back()->Open( itName->second, m_AccessMode );
        }
        else if( transportsSize == 1 )
        {
            auto itName = parameters.find( "name" );

            if( itName == parameters.end() ) //take streamName
                m_Transports.back()->Open( m_Name, m_AccessMode );
            else
                m_Transports.back()->Open( m_Name, m_AccessMode );

        }
        else if( transportsSize == 0 )
        {
            if( m_DebugMode == true )
                throw std::invalid_argument( "ERROR: transport not defined for engine " + m_Name + m_EndMessage );
        }
    }
}


} //end namespace engine
} //end namespace adios