Skip to content
Snippets Groups Projects
helloDataManReader.cpp 3 KiB
Newer Older
wfg's avatar
wfg committed
/*
 * helloDataManReader.cpp
wfg's avatar
wfg committed
 *
 *  Created on: Feb 16, 2017
 *      Author: wfg
 */

#include <functional> //std::multiplies
#include <iostream>   //std::cout, std::endl
#include <numeric>    //std::accumulate
#include <string>
#include <vector>
wfg's avatar
wfg committed

#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[])
wfg's avatar
wfg committed
{
  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())
wfg's avatar
wfg committed
    {
      // 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
    }
wfg's avatar
wfg committed

    // 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);
wfg's avatar
wfg committed

    if (datamanReader == nullptr)
      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";
wfg's avatar
wfg committed

    datamanReader->Close();
  }
  catch (std::invalid_argument &e)
  {
    if (rank == 0)
wfg's avatar
wfg committed
    {
      std::cout << "Invalid argument exception, STOPPING PROGRAM\n";
      std::cout << e.what() << "\n";
wfg's avatar
wfg committed
    }
  }
  catch (std::ios_base::failure &e)
  {
    if (rank == 0)
wfg's avatar
wfg committed
    {
      std::cout << "System exception, STOPPING PROGRAM\n";
      std::cout << e.what() << "\n";
wfg's avatar
wfg committed
    }
  }
  catch (std::exception &e)
  {
    if (rank == 0)
wfg's avatar
wfg committed
    {
      std::cout << "Exception, STOPPING PROGRAM\n";
      std::cout << e.what() << "\n";
wfg's avatar
wfg committed
    }
wfg's avatar
wfg committed

  MPI_Finalize();
wfg's avatar
wfg committed

wfg's avatar
wfg committed
}