From 0f3d4d5d20a03ef3cec46161594bc1445e7afe8c Mon Sep 17 00:00:00 2001
From: wfg <wfg@pc0098504.ornl.gov>
Date: Tue, 21 Feb 2017 17:19:02 -0500
Subject: [PATCH] Added DataMan Reader class and examples

Run ./buildDataman.sh see contents for detailed info
---
 buildDataman.sh                               |  21 +-
 examples/hello/datamanReader/Makefile         |  32 +++
 .../datamanReader/helloDataManReader.cpp      |  80 ++++++++
 .../helloDataManReader_nompi.cpp              |  60 ++++++
 .../hello/{dataman => datamanWriter}/Makefile |   0
 .../helloDataManWriter.cpp                    |   0
 .../helloDataManWriter_nompi.cpp              |  20 --
 include/core/Engine.h                         |  53 ++---
 include/engine/dataman/DataManReader.h        | 105 ++++++++++
 include/engine/dataman/DataManWriter.h        |  12 +-
 src/ADIOS.cpp                                 |   5 +
 src/core/Engine.cpp                           |  31 +--
 src/engine/dataman/DataManReader.cpp          | 187 ++++++++++++++++++
 src/engine/dataman/DataManWriter.cpp          |  70 ++++---
 14 files changed, 582 insertions(+), 94 deletions(-)
 create mode 100644 examples/hello/datamanReader/Makefile
 create mode 100644 examples/hello/datamanReader/helloDataManReader.cpp
 create mode 100644 examples/hello/datamanReader/helloDataManReader_nompi.cpp
 rename examples/hello/{dataman => datamanWriter}/Makefile (100%)
 rename examples/hello/{dataman => datamanWriter}/helloDataManWriter.cpp (100%)
 rename examples/hello/{dataman => datamanWriter}/helloDataManWriter_nompi.cpp (81%)
 create mode 100644 include/engine/dataman/DataManReader.h
 create mode 100644 src/engine/dataman/DataManReader.cpp

diff --git a/buildDataman.sh b/buildDataman.sh
index bf57df38d..3a942c6ef 100755
--- a/buildDataman.sh
+++ b/buildDataman.sh
@@ -14,21 +14,32 @@ echo
 
 echo
 echo "#################################################################"
-echo "Building Dataman example"
+echo "Building Dataman Reader and Writer examples"
 echo "#################################################################"
-make -C ./examples/hello/dataman
+make -C ./examples/hello/datamanWriter
+echo
+make -C ./examples/hello/datamanReader
 
 echo
 echo
 echo "#################################################################"
-echo "Running helloDataman_nompi.exe example"
+echo "Running nompi.exe examples"
+echo "#################################################################"
+echo "#################################################################"
+echo "DataMan writer"
+echo "#################################################################"
+./examples/hello/datamanWriter/helloDataManWriter_nompi.exe
+
+echo "#################################################################"
+echo "DataMan reader"
 echo "#################################################################"
-./examples/hello/dataman/helloDataMan_nompi.exe
+./examples/hello/datamanReader/helloDataManReader_nompi.exe
 
 echo
 echo
 echo "#################################################################"
 echo "To run mpi version with 4 mpi processes: "
-echo "mpirun -n 4 ./examples/hello/dataman/helloDataman.exe"
+echo "mpirun -n 4 ./examples/hello/datamanWriter/helloDatamanWriter.exe"
+echo "mpirun -n 4 ./examples/hello/datamanReader/helloDatamanReader.exe"
 echo "END"
 echo "################################################################"
diff --git a/examples/hello/datamanReader/Makefile b/examples/hello/datamanReader/Makefile
new file mode 100644
index 000000000..1da287a7e
--- /dev/null
+++ b/examples/hello/datamanReader/Makefile
@@ -0,0 +1,32 @@
+# Makefile for testing purposes, will build libadios.a 
+# Created on: Oct 4, 2016
+#     Author: wfg
+
+
+BASE_NAME=helloDataManReader
+
+CC=g++ # Compiling with defaults
+MPICC=mpic++
+
+#ADIOS LOCATION
+ADIOS_DIR=../../..
+ADIOS_LIB=$(ADIOS_DIR)/lib/libadios.a
+ADIOS_NOMPI_LIB=$(ADIOS_DIR)/lib/libadios_nompi.a
+
+ADIOS_INCLUDE=-I$(ADIOS_DIR)/include
+
+
+#FLAGS
+CFLAGS=-Wall -O0 -g -Wpedantic -std=c++11
+
+all: mpi nompi
+
+mpi: $(ADIOS_LIB) $(ADIOS_HFiles)
+	$(MPICC) $(CFLAGS) $(ADIOS_INCLUDE) -DHAVE_MPI $(BASE_NAME).cpp -o $(BASE_NAME).exe $(ADIOS_LIB) -lpthread
+	
+nompi: $(ADIOS_NOMPI_LIB) $(NoMPI_HFiles)
+	$(CC) $(CFLAGS) $(ADIOS_INCLUDE) $(BASE_NAME)_nompi.cpp -o $(BASE_NAME)_nompi.exe $(ADIOS_NOMPI_LIB) -lpthread
+
+clean:
+	rm *.exe;
+     
diff --git a/examples/hello/datamanReader/helloDataManReader.cpp b/examples/hello/datamanReader/helloDataManReader.cpp
new file mode 100644
index 000000000..9b315d702
--- /dev/null
+++ b/examples/hello/datamanReader/helloDataManReader.cpp
@@ -0,0 +1,80 @@
+/*
+ * helloWriter.cpp
+ *
+ *  Created on: Feb 16, 2017
+ *      Author: wfg
+ */
+
+
+
+#include <vector>
+#include <iostream>
+
+
+#include <mpi.h>
+
+
+#include "ADIOS_CPP.h"
+
+
+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, adiosDebug );
+
+
+    try
+    {
+        //Define method for engine creation, it is basically straight-forward parameters
+        adios::Method& datamanSettings = adios.DeclareMethod( "WAN", "DataManReader" ); //default method type is BPWriter
+        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 );
+
+        if( datamanReader == nullptr )
+            throw std::ios_base::failure( "ERROR: failed to create DataMan I/O engine at Open\n" );
+
+        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;
+
+}
diff --git a/examples/hello/datamanReader/helloDataManReader_nompi.cpp b/examples/hello/datamanReader/helloDataManReader_nompi.cpp
new file mode 100644
index 000000000..11c17a138
--- /dev/null
+++ b/examples/hello/datamanReader/helloDataManReader_nompi.cpp
@@ -0,0 +1,60 @@
+/*
+ * helloADIOSNoXML_OOP.cpp
+ *
+ *  Created on: Jan 9, 2017
+ *      Author: wfg
+ */
+
+#include <vector>
+#include <iostream>
+
+#include "ADIOS_CPP.h"
+
+
+int main( int argc, char* argv [] )
+{
+    const bool adiosDebug = true;
+    adios::ADIOS adios( adiosDebug );
+
+    try
+    {
+        //Define method for engine creation, it is basically straight-forward parameters
+        adios::Method& datamanSettings = adios.DeclareMethod( "WAN", "DataManReader" ); //default method type is BPWriter
+        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 );
+
+        if( datamanReader == nullptr )
+            throw std::ios_base::failure( "ERROR: failed to create DataMan I/O engine at Open\n" );
+
+        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 )
+    {
+        std::cout << "Invalid argument exception, STOPPING PROGRAM\n";
+        std::cout << e.what() << "\n";
+    }
+    catch( std::ios_base::failure& e )
+    {
+        std::cout << "System exception, STOPPING PROGRAM\n";
+        std::cout << e.what() << "\n";
+    }
+    catch( std::exception& e )
+    {
+        std::cout << "Exception, STOPPING PROGRAM\n";
+        std::cout << e.what() << "\n";
+    }
+
+    return 0;
+}
+
+
+
diff --git a/examples/hello/dataman/Makefile b/examples/hello/datamanWriter/Makefile
similarity index 100%
rename from examples/hello/dataman/Makefile
rename to examples/hello/datamanWriter/Makefile
diff --git a/examples/hello/dataman/helloDataManWriter.cpp b/examples/hello/datamanWriter/helloDataManWriter.cpp
similarity index 100%
rename from examples/hello/dataman/helloDataManWriter.cpp
rename to examples/hello/datamanWriter/helloDataManWriter.cpp
diff --git a/examples/hello/dataman/helloDataManWriter_nompi.cpp b/examples/hello/datamanWriter/helloDataManWriter_nompi.cpp
similarity index 81%
rename from examples/hello/dataman/helloDataManWriter_nompi.cpp
rename to examples/hello/datamanWriter/helloDataManWriter_nompi.cpp
index fb0f3c351..9e591367c 100644
--- a/examples/hello/dataman/helloDataManWriter_nompi.cpp
+++ b/examples/hello/datamanWriter/helloDataManWriter_nompi.cpp
@@ -42,26 +42,6 @@ int main( int argc, char* argv [] )
         //datamanWriter->Write( "myDoubles", myDoubles.data() ); //you can write either by string or by object
         datamanWriter->Write( ioMyDoubles, myDoubles.data() ); // Base class Engine own the Write<T> that will call overloaded Write from Derived
         datamanWriter->Close( );
-
-
-//        auto datamanReader = adios.Open( "myDoubles.bp", "r", datamanSettings );
-//
-//        if( datamanReader == nullptr )
-//            throw std::ios_base::failure( "ERROR: failed to create DataMan I/O engine at Open\n" );
-//
-//        adios::Variable<double>& readMyDoubles = datamanReader->Inquire<double>( "myDoubles" );
-//        std::cout << "Hello dataman Reader\n";
-//        for( auto value : readMyDoubles.m_Values )
-//        {
-//            std::cout << value << "\n";
-//        }
-//
-//
-//        datamanReader->Close( );
-
-
-
-
     }
     catch( std::invalid_argument& e )
     {
diff --git a/include/core/Engine.h b/include/core/Engine.h
index 9fe6adaac..a3b2d4ca3 100644
--- a/include/core/Engine.h
+++ b/include/core/Engine.h
@@ -169,31 +169,34 @@ public:
     virtual void Write( const std::string variableName, const void* values );
 
     //Read API
-//    template< class T >
-//    virtual Variable<T>* InquireVariable( const std::string name )
-//    {
-//        return InquireVariable<T>( name );
-//    }
-//
-//    virtual Variable<char>* InquireVariable( const std::string name );
-//    virtual Variable<unsigned char>* InquireVariable( const std::string name );
-//    virtual Variable<short>* InquireVariable( const std::string name );
-//    virtual Variable<unsigned short>* InquireVariable( const std::string name );
-//    virtual Variable<int>* InquireVariable( const std::string name );
-//    virtual Variable<unsigned int>* InquireVariable( const std::string name );
-//    virtual Variable<long int>* InquireVariable( const std::string name );
-//    virtual Variable<unsigned long int>* InquireVariable( const std::string name );
-//    virtual Variable<long long int>* InquireVariable( const std::string name );
-//    virtual Variable<unsigned long long int>* InquireVariable( const std::string name );
-//    virtual Variable<float>* InquireVariable( const std::string name );
-//    virtual Variable<double>* InquireVariable( const std::string name );
-//    virtual Variable<long double>* InquireVariable( const std::string name );
-//    virtual Variable<std::complex<float>>* InquireVariable( const std::string name );
-//    virtual Variable<std::complex<double>>* InquireVariable( const std::string name );
-//    virtual Variable<std::complex<long double>>* InquireVariable( const std::string name );
-
-
-    virtual void Close( const int transportIndex = -1  ); ///< Closes a particular transport, or all if -1
+    /**
+     * Inquires and (optionally) allocates and copies the contents of a variable
+     * If success: it returns a pointer to the internal stored variable object in ADIOS class.
+     * If failure: it returns nullptr
+     * @param name variable name to look for
+     * @param readIn if true: reads the full variable and payload, allocating values in memory, if false: internal payload is nullptr
+     * @return success: it returns a pointer to the internal stored variable object in ADIOS class, failure: nullptr
+     */
+    virtual Variable<void>* InquireVariable( const std::string name, const bool readIn = true );
+    virtual Variable<char>* InquireVariableChar( const std::string name, const bool readIn = true );
+    virtual Variable<unsigned char>* InquireVariableUChar( const std::string name, const bool readIn = true );
+    virtual Variable<short>* InquireVariableShort( const std::string name, const bool readIn = true );
+    virtual Variable<unsigned short>* InquireVariableUShort( const std::string name, const bool readIn = true );
+    virtual Variable<int>* InquireVariableInt( const std::string name, const bool readIn = true );
+    virtual Variable<unsigned int>* InquireVariableUInt( const std::string name, const bool readIn = true );
+    virtual Variable<long int>* InquireVariableLInt( const std::string name, const bool readIn = true );
+    virtual Variable<unsigned long int>* InquireVariableULInt( const std::string name, const bool readIn = true );
+    virtual Variable<long long int>* InquireVariableLLInt( const std::string name, const bool readIn = true );
+    virtual Variable<unsigned long long int>* InquireVariableULLInt( const std::string name, const bool readIn = true );
+    virtual Variable<float>* InquireVariableFloat( const std::string name, const bool readIn = true );
+    virtual Variable<double>* InquireVariableDouble( const std::string name, const bool readIn = true );
+    virtual Variable<long double>* InquireVariableLDouble( const std::string name, const bool readIn = true );
+    virtual Variable<std::complex<float>>* InquireVariableCFloat( const std::string name, const bool readIn = true );
+    virtual Variable<std::complex<double>>* InquireVariableCDouble( const std::string name, const bool readIn = true );
+    virtual Variable<std::complex<long double>>* InquireVariableCLDouble( const std::string name, const bool readIn = true );
+    virtual VariableCompound* InquireVariableCompound( const std::string name, const bool readIn = true );
+
+    virtual void Close( const int transportIndex = -1  ) = 0; ///< Closes a particular transport, or all if -1
 
 
 protected:
diff --git a/include/engine/dataman/DataManReader.h b/include/engine/dataman/DataManReader.h
new file mode 100644
index 000000000..d0a51d079
--- /dev/null
+++ b/include/engine/dataman/DataManReader.h
@@ -0,0 +1,105 @@
+/*
+ * 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"
+
+
+
+namespace adios
+{
+
+class DataManReader : public Engine
+{
+
+public:
+
+    /**
+     * Constructor for single BP capsule engine, writes in BP format into a single heap capsule
+     * @param name unique name given to the engine
+     * @param accessMode
+     * @param mpiComm
+     * @param method
+     * @param debugMode
+     * @param hostLanguage
+     */
+    DataManReader( 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 );
+
+    ~DataManReader( );
+
+    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
+
+
+    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 << "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_ */
diff --git a/include/engine/dataman/DataManWriter.h b/include/engine/dataman/DataManWriter.h
index 04a3848a3..9df1c6b60 100644
--- a/include/engine/dataman/DataManWriter.h
+++ b/include/engine/dataman/DataManWriter.h
@@ -8,8 +8,8 @@
 #ifndef DATAMANWRITER_H_
 #define DATAMANWRITER_H_
 
-#include <iostream> //must be removed
-#include <unistd.h> //must be removed
+#include <iostream> //std::cout must be removed, only used for hello example
+#include <unistd.h> //sleep must be removed
 
 #include "core/Engine.h"
 #include "format/BP1Writer.h"
@@ -35,7 +35,7 @@ public:
      * @param hostLanguage
      */
     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 );
+                   const Method& method, const bool debugMode = false, const unsigned int cores = 1 );
 
     ~DataManWriter( );
 
@@ -67,6 +67,8 @@ public:
     void Write( const std::string variableName, const double* values );
     void Write( const std::string variableName, const long double* values );
 
+    void Close( const int transportIndex = -1 );
+
 private:
 
     capsule::STLVector m_Buffer; ///< heap capsule, contains data and metadata buffers
@@ -86,9 +88,9 @@ private:
 
 
     template<class T>
-    void WriteVariable( Variable<T>& variable, const T* values )
+    void WriteVariableCommon( Variable<T>& variable, const T* values )
     {
-        //here comes your magic at Writting now variable.m_UserValues has the data passed by the user
+        //here comes your magic at Writing now variable.m_UserValues has the data passed by the user
         //set variable
         variable.m_AppValues = values;
         m_WrittenVariables.insert( variable.m_Name );
diff --git a/src/ADIOS.cpp b/src/ADIOS.cpp
index edae670b8..a7b36c80e 100644
--- a/src/ADIOS.cpp
+++ b/src/ADIOS.cpp
@@ -20,6 +20,7 @@
 //Engines
 #include "engine/bp/BPWriter.h"
 #include "engine/dataman/DataManWriter.h"
+#include "engine/dataman/DataManReader.h"
 
 
 namespace adios
@@ -108,6 +109,10 @@ std::shared_ptr<Engine> ADIOS::Open( const std::string name, const std::string a
     {
     	return std::make_shared<DataManWriter>( *this, name, accessMode, mpiComm, method, m_DebugMode, cores );
     }
+    else if( type == "DataManReader" )
+    {
+        return std::make_shared<DataManReader>( *this, name, accessMode, mpiComm, method, m_DebugMode, cores );
+    }
     else if( type == "Vis" )
     {
         //return std::make_shared<Vis>( *this, name, accessMode, mpiComm, method, m_DebugMode, cores );
diff --git a/src/core/Engine.cpp b/src/core/Engine.cpp
index fc4ef69f9..c41544fe2 100644
--- a/src/core/Engine.cpp
+++ b/src/core/Engine.cpp
@@ -75,19 +75,26 @@ void Engine::Write( const std::string variableName, const std::complex<long doub
 void Engine::Write( const std::string variableName, const void* values ){ }
 
 
+//READ
+Variable<void>* Engine::InquireVariable( const std::string name, const bool readIn ){ return nullptr; }
+Variable<char>* Engine::InquireVariableChar( const std::string name, const bool readIn ){ return nullptr; }
+Variable<unsigned char>* Engine::InquireVariableUChar( const std::string name, const bool readIn ){ return nullptr; }
+Variable<short>* Engine::InquireVariableShort( const std::string name, const bool readIn ){ return nullptr; }
+Variable<unsigned short>* Engine::InquireVariableUShort( const std::string name, const bool readIn ){ return nullptr; }
+Variable<int>* Engine::InquireVariableInt( const std::string name, const bool readIn ){ return nullptr; }
+Variable<unsigned int>* Engine::InquireVariableUInt( const std::string name, const bool readIn ){ return nullptr; }
+Variable<long int>* Engine::InquireVariableLInt( const std::string name, const bool readIn ){ return nullptr; }
+Variable<unsigned long int>* Engine::InquireVariableULInt( const std::string name, const bool readIn ){ return nullptr; }
+Variable<long long int>* Engine::InquireVariableLLInt( const std::string name, const bool readIn ){ return nullptr; }
+Variable<unsigned long long int>* Engine::InquireVariableULLInt( const std::string name, const bool readIn ){ return nullptr; }
+Variable<float>* Engine::InquireVariableFloat( const std::string name, const bool readIn ){ return nullptr; }
+Variable<double>* Engine::InquireVariableDouble( const std::string name, const bool readIn ){ return nullptr; }
+Variable<long double>* Engine::InquireVariableLDouble( const std::string name, const bool readIn ){ return nullptr; }
+Variable<std::complex<float>>* Engine::InquireVariableCFloat( const std::string name, const bool readIn ){ return nullptr; }
+Variable<std::complex<double>>* Engine::InquireVariableCDouble( const std::string name, const bool readIn ){ return nullptr; }
+Variable<std::complex<long double>>* Engine::InquireVariableCLDouble( const std::string name, const bool readIn ){ return nullptr; }
+VariableCompound* Engine::InquireVariableCompound( const std::string name, const bool readIn ){ return nullptr;  }
 
-void Engine::Close( const int transportIndex )
-{
-    if( transportIndex == -1 ) //close all transports
-    {
-        for( auto& transport : m_Transports )
-            transport->Close( );
-    }
-    else
-    {
-        m_Transports[transportIndex]->Close( ); //here need to pass the buffer
-    }
-}
 
 //PROTECTED
 void Engine::Init( )
diff --git a/src/engine/dataman/DataManReader.cpp b/src/engine/dataman/DataManReader.cpp
new file mode 100644
index 000000000..d74000178
--- /dev/null
+++ b/src/engine/dataman/DataManReader.cpp
@@ -0,0 +1,187 @@
+/*
+ * DataManReader.cpp
+ *
+ *  Created on: Feb 21, 2017
+ *      Author: wfg
+ */
+
+
+#include "engine/dataman/DataManReader.h"
+
+#include "core/Support.h"
+#include "functions/adiosFunctions.h" //CSVToVector
+
+//supported transports
+#include "transport/file/FD.h" // uses POSIX
+#include "transport/file/FP.h" // uses C FILE*
+#include "transport/file/FStream.h" // uses C++ fstream
+#include "transport/wan/MdtmMan.h" //uses Mdtm library
+
+
+namespace adios
+{
+
+DataManReader::DataManReader( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm,
+                              const Method& method, const bool debugMode, const unsigned int cores ):
+    Engine( adios, "DataManReader", name, accessMode, mpiComm, method, debugMode, cores, " DataManReader constructor (or call to ADIOS Open).\n" ),
+    m_Buffer( accessMode, m_RankMPI, m_DebugMode )
+{
+    Init( );
+}
+
+DataManReader::~DataManReader( )
+{ }
+
+void DataManReader::Init( )
+{
+    if( m_DebugMode == true )
+    {
+        if( m_AccessMode != "r" && m_AccessMode != "read" )
+            throw std::invalid_argument( "ERROR: DataManReader doesn't support access mode " + m_AccessMode +
+                                         ", in call to ADIOS Open or DataManReader constructor\n"  );
+    }
+
+    InitCapsules( );
+    InitTransports( );
+}
+
+
+Variable<void>* DataManReader::InquireVariable( const std::string name, const bool readIn ) //not yet implemented
+{ return nullptr; }
+
+Variable<char>* DataManReader::InquireVariableChar( const std::string name, const bool readIn )
+{ return InquireVariableCommon<char>( name, readIn ); }
+
+Variable<unsigned char>* DataManReader::InquireVariableUChar( const std::string name, const bool readIn )
+{ return InquireVariableCommon<unsigned char>( name, readIn ); }
+
+Variable<short>* DataManReader::InquireVariableShort( const std::string name, const bool readIn )
+{ return InquireVariableCommon<short>( name, readIn ); }
+
+Variable<unsigned short>* DataManReader::InquireVariableUShort( const std::string name, const bool readIn )
+{ return InquireVariableCommon<unsigned short>( name, readIn ); }
+
+Variable<int>* DataManReader::InquireVariableInt( const std::string name, const bool readIn )
+{ return InquireVariableCommon<int>( name, readIn ); }
+
+Variable<unsigned int>* DataManReader::InquireVariableUInt( const std::string name, const bool readIn )
+{ return InquireVariableCommon<unsigned int>( name, readIn ); }
+
+Variable<long int>* DataManReader::InquireVariableLInt( const std::string name, const bool readIn )
+{ return InquireVariableCommon<long int>( name, readIn ); }
+
+Variable<unsigned long int>* DataManReader::InquireVariableULInt( const std::string name, const bool readIn )
+{ return InquireVariableCommon<unsigned long int>( name, readIn ); }
+
+Variable<long long int>* DataManReader::InquireVariableLLInt( const std::string name, const bool readIn )
+{ return InquireVariableCommon<long long int>( name, readIn ); }
+
+Variable<unsigned long long int>* DataManReader::InquireVariableULLInt( const std::string name, const bool readIn )
+{ return InquireVariableCommon<unsigned long long int>( name, readIn ); }
+
+Variable<float>* DataManReader::InquireVariableFloat( const std::string name, const bool readIn )
+{ return InquireVariableCommon<float>( name, readIn ); }
+
+Variable<double>* DataManReader::InquireVariableDouble( const std::string name, const bool readIn )
+{ return InquireVariableCommon<double>( name, readIn ); }
+
+Variable<long double>* DataManReader::InquireVariableLDouble( const std::string name, const bool readIn )
+{ return InquireVariableCommon<long double>( name, readIn ); }
+
+Variable<std::complex<float>>* DataManReader::InquireVariableCFloat( const std::string name, const bool readIn )
+{ return InquireVariableCommon<std::complex<float>>( name, readIn ); }
+
+Variable<std::complex<double>>* DataManReader::InquireVariableCDouble( const std::string name, const bool readIn )
+{ return InquireVariableCommon<std::complex<double>>( name, readIn ); }
+
+Variable<std::complex<long double>>* DataManReader::InquireVariableCLDouble( const std::string name, const bool readIn )
+{ return InquireVariableCommon<std::complex<long double>>( name, readIn ); }
+
+VariableCompound* DataManReader::InquireVariableCompound( const std::string name, const bool readIn )
+{ return nullptr; }
+
+
+void DataManReader::Close( const int transportIndex )
+{
+
+}
+
+
+//PRIVATE
+void DataManReader::InitCapsules( )
+{
+    //here init memory capsules
+}
+
+
+void DataManReader::InitTransports( ) //maybe move this?
+{
+    TransportNamesUniqueness( );
+
+    for( const auto& parameters : m_Method.m_TransportParameters )
+    {
+        auto itTransport = parameters.find( "transport" );
+
+        if( itTransport->second == "Mdtm" || itTransport->second == "MdtmMan" )
+        {
+            const std::string localIP( GetMdtmParameter( "localIP", parameters ) ); //mandatory
+            const std::string remoteIP( GetMdtmParameter( "remoteIP", parameters ) ); //mandatory
+            const std::string prefix( GetMdtmParameter( "prefix", parameters ) );
+            const int numberOfPipes = std::stoi( GetMdtmParameter( "pipes", parameters ) );
+            const std::vector<int> tolerances = CSVToVectorInt( GetMdtmParameter( "tolerances", parameters ) );
+            const std::vector<int> priorities = CSVToVectorInt( GetMdtmParameter( "priorities", parameters ) );
+
+            m_Transports.push_back( std::make_shared<transport::MdtmMan>( localIP, remoteIP, m_AccessMode, prefix, numberOfPipes,
+                                                                          tolerances, priorities, m_MPIComm, m_DebugMode ) );
+        }
+        else if( itTransport->second == "Zmq" )
+        {
+
+        }
+        else
+        {
+            if( m_DebugMode == true )
+                throw std::invalid_argument( "ERROR: transport + " + itTransport->second + " not supported, in " +
+                                              m_Name + m_EndMessage );
+        }
+    }
+}
+
+
+std::string DataManReader::GetMdtmParameter( const std::string parameter, const std::map<std::string,std::string>& mdtmParameters )
+{
+    auto itParam = mdtmParameters.find( parameter );
+    if( itParam != mdtmParameters.end() ) //found
+    {
+        return itParam->second; //return value
+    }
+    // if not found
+    //mandatory ones
+    if( parameter == "localIP" || parameter == "remoteIP" )
+    {
+        if( m_DebugMode == true )
+            throw std::invalid_argument( "ERROR: " + parameter + " parameter not found in Method, in call to DataManWriter constructor\n" );
+    }
+    else if( parameter == "prefix" )
+    {
+        return "";
+    }
+    else if( parameter == "pipes" )
+    {
+        return "0"; // or 1?
+    }
+    else if( parameter == "tolerances" ) //so far empty string
+    {
+
+    }
+    else if( parameter == "priority" )
+    {
+
+    }
+
+    return ""; //return empty string
+}
+
+
+
+}
diff --git a/src/engine/dataman/DataManWriter.cpp b/src/engine/dataman/DataManWriter.cpp
index d04c21857..a549f6ae4 100644
--- a/src/engine/dataman/DataManWriter.cpp
+++ b/src/engine/dataman/DataManWriter.cpp
@@ -25,7 +25,7 @@ namespace adios
 
 DataManWriter::DataManWriter( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm,
                               const Method& method, const bool debugMode, const unsigned int cores ):
-    Engine( adios, "DataManWriter", name, accessMode, mpiComm, method, debugMode, cores, " Dataman constructor (or call to ADIOS Open).\n" ),
+    Engine( adios, "DataManWriter", name, accessMode, mpiComm, method, debugMode, cores, " DataManWriter constructor (or call to ADIOS Open).\n" ),
     m_Buffer( accessMode, m_RankMPI, m_DebugMode )
 {
     Init( );
@@ -38,90 +38,106 @@ DataManWriter::~DataManWriter( )
 
 void DataManWriter::Init( )
 {
+    if( m_DebugMode == true )
+    {
+        if( m_AccessMode != "w" && m_AccessMode != "write" && m_AccessMode != "a" && m_AccessMode != "append" )
+            throw std::invalid_argument( "ERROR: DataManWriter doesn't support access mode " + m_AccessMode +
+                                         ", in call to ADIOS Open or DataManWriter constructor\n"  );
+    }
+
     InitCapsules( );
     InitTransports( );
 }
 
 
 void DataManWriter::Write( Variable<char>& variable, const char* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<unsigned char>& variable, const unsigned char* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<short>& variable, const short* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<unsigned short>& variable, const unsigned short* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<int>& variable, const int* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<unsigned int>& variable, const unsigned int* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<long int>& variable, const long int* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<unsigned long int>& variable, const unsigned long int* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<long long int>& variable, const long long int* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<unsigned long long int>& variable, const unsigned long long int* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<float>& variable, const float* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<double>& variable, const double* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( Variable<long double>& variable, const long double* values )
-{ WriteVariable( variable, values ); }
+{ WriteVariableCommon( variable, values ); }
 
 void DataManWriter::Write( const std::string variableName, const char* values )
-{ WriteVariable( m_ADIOS.GetVariable<char>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<char>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const unsigned char* values )
-{ WriteVariable( m_ADIOS.GetVariable<unsigned char>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<unsigned char>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const short* values )
-{ WriteVariable( m_ADIOS.GetVariable<short>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<short>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const unsigned short* values )
-{ WriteVariable( m_ADIOS.GetVariable<unsigned short>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<unsigned short>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const int* values )
-{ WriteVariable( m_ADIOS.GetVariable<int>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<int>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const unsigned int* values )
-{ WriteVariable( m_ADIOS.GetVariable<unsigned int>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<unsigned int>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const long int* values )
-{ WriteVariable( m_ADIOS.GetVariable<long int>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<long int>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const unsigned long int* values )
-{ WriteVariable( m_ADIOS.GetVariable<unsigned long int>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<unsigned long int>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const long long int* values )
-{ WriteVariable( m_ADIOS.GetVariable<long long int>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<long long int>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const unsigned long long int* values )
-{ WriteVariable( m_ADIOS.GetVariable<unsigned long long int>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<unsigned long long int>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const float* values )
-{ WriteVariable( m_ADIOS.GetVariable<float>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<float>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const double* values )
-{ WriteVariable( m_ADIOS.GetVariable<double>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<double>( variableName ), values ); }
 
 void DataManWriter::Write( const std::string variableName, const long double* values )
-{ WriteVariable( m_ADIOS.GetVariable<long double>( variableName ), values ); }
+{ WriteVariableCommon( m_ADIOS.GetVariable<long double>( variableName ), values ); }
+
+
+
+void DataManWriter::Close( const int transportIndex )
+{
+    //here close IPs and deallocate or free/close resources (if using STL no need for memory deallocation)
+}
+
 
 
+//PRIVATE functions below
 void DataManWriter::InitCapsules( )
 {
     //here init memory capsules
-- 
GitLab