Newer
Older
*
* Created on: Feb 16, 2017
* Author: wfg
*/
#include <vector>
#include <iostream> //std::cout, std::endl
#include <string>
#include <numeric> //std::accumulate
#include <functional> //std::multiplies
#include <mpi.h>
#include "ADIOS_CPP.h"
void getcb( const void *data, std::string doid, std::string var, std::string dtype, std::vector<std::size_t> varshape )
{
std::cout << "data object ID = " << doid << "\n"; //do you need to flush?
std::cout << "variable name = " << var << "\n";
std::cout << "data type = " << dtype << "\n";
std::size_t varsize = std::accumulate(varshape.begin(), varshape.end(), 1, std::multiplies<std::size_t>());
for( unsigned int i=0; i < varsize; ++i )
std::cout << ((float*)data)[i] << " ";
std::cout << std::endl;
}
int main( int argc, char* argv [] )
{
MPI_Init( &argc, &argv );
int rank;
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
const bool adiosDebug = true;
adios::ADIOS adios( MPI_COMM_WORLD, adios::Verbose::WARN, adiosDebug );
try
{
//Define method for engine creation, it is basically straight-forward parameters
adios::Method& datamanSettings = adios.DeclareMethod( "WAN" );
if( ! datamanSettings.isUserDefined())
{
// if not defined by user, we can change the default settings
datamanSettings.SetEngine( "DataManReader" );
datamanSettings.SetParameters( "peer-to-peer=yes" );
datamanSettings.AddTransport( "Mdtm", "localIP=128.0.0.0.1", "remoteIP=128.0.0.0.2", "tolerances=1,2,3" );
//datamanSettings.AddTransport( "ZeroMQ", "localIP=128.0.0.0.1.1", "remoteIP=128.0.0.0.2.1", "tolerances=1,2,3" ); not yet supported , will throw an exception
}
//Create engine smart pointer to DataManReader Engine due to polymorphism,
//Open returns a smart pointer to Engine containing the Derived class DataManReader
auto datamanReader = adios.Open( "myDoubles.bp", "r", datamanSettings, adios::IOMode::INDEPENDENT );
throw std::ios_base::failure( "ERROR: failed to create DataMan I/O engine at Open\n" );
datamanReader->SetCallBack( getcb );
adios::Variable<double>* ioMyDoubles = datamanReader->InquireVariableDouble( "ioMyDoubles" );
if( ioMyDoubles == nullptr )
std::cout << "Variable ioMyDoubles not read...yet\n";
datamanReader->Close( );
}
catch( std::invalid_argument& e )
{
if( rank == 0 )
{
std::cout << "Invalid argument exception, STOPPING PROGRAM\n";
std::cout << e.what() << "\n";
}
}
catch( std::ios_base::failure& e )
{
if( rank == 0 )
{
std::cout << "System exception, STOPPING PROGRAM\n";
std::cout << e.what() << "\n";
}
}
catch( std::exception& e )
{
if( rank == 0 )
{
std::cout << "Exception, STOPPING PROGRAM\n";
std::cout << e.what() << "\n";
}
}
MPI_Finalize( );
return 0;
}