From 633a001a4eb1fc1f5d9f62e6b171a13e977bcd72 Mon Sep 17 00:00:00 2001
From: William F Godoy <williamfgc@yahoo.com>
Date: Tue, 25 Jul 2017 18:01:40 -0400
Subject: [PATCH] Fixing Issue #216 Python bindings

Copy constructor was implicitly removed for ADIOSPy due to m_ADIOS.

PyBind11 needed the copy constructor.

m_ADIOS is now a shared pointer to avoid copy constructor removal

Separated MPI nonMPI test as ctest failed for MPI
---
 bindings/python/ADIOSPy.cpp                   |  7 +-
 bindings/python/ADIOSPy.h                     |  4 +-
 bindings/python/gluePyBind11.cpp              |  2 +-
 testing/adios2/bindings/python/CMakeLists.txt |  8 ++-
 .../bindings/python/TestBPWriteTypes.py       |  4 +-
 .../bindings/python/TestBPWriteTypes_nompi.py | 66 +++++++++++++++++++
 6 files changed, 84 insertions(+), 7 deletions(-)
 create mode 100644 testing/adios2/bindings/python/TestBPWriteTypes_nompi.py

diff --git a/bindings/python/ADIOSPy.cpp b/bindings/python/ADIOSPy.cpp
index 96c8033a8..7f196f40a 100644
--- a/bindings/python/ADIOSPy.cpp
+++ b/bindings/python/ADIOSPy.cpp
@@ -19,7 +19,8 @@ namespace adios2
 
 ADIOSPy::ADIOSPy(const std::string configFile, MPI_Comm mpiComm,
                  const bool debugMode)
-: m_DebugMode(debugMode), m_ADIOS(configFile, mpiComm, debugMode)
+: m_DebugMode(debugMode),
+  m_ADIOS(std::make_shared<adios2::ADIOS>(configFile, mpiComm, debugMode))
 {
 }
 
@@ -29,7 +30,7 @@ ADIOSPy::ADIOSPy(MPI_Comm mpiComm, const bool debugMode)
 }
 
 ADIOSPy::ADIOSPy(const std::string configFile, const bool debugMode)
-: ADIOSPy("", MPI_COMM_SELF, debugMode)
+: ADIOSPy(configFile, MPI_COMM_SELF, debugMode)
 {
 }
 
@@ -39,7 +40,7 @@ ADIOSPy::ADIOSPy(const bool debugMode) : ADIOSPy("", MPI_COMM_SELF, debugMode)
 
 IOPy ADIOSPy::DeclareIO(const std::string name)
 {
-    return IOPy(m_ADIOS.DeclareIO(name), m_DebugMode);
+    return IOPy(m_ADIOS->DeclareIO(name), m_DebugMode);
 }
 
 } // end namespace adios
diff --git a/bindings/python/ADIOSPy.h b/bindings/python/ADIOSPy.h
index 64cd3fbbe..d3c9f5e85 100644
--- a/bindings/python/ADIOSPy.h
+++ b/bindings/python/ADIOSPy.h
@@ -12,6 +12,7 @@
 #define ADIOS2_BINDINGS_PYTHON_SOURCE_ADIOSPY_H_
 
 /// \cond EXCLUDE_FROM_DOXYGEN
+#include <memory> //std::shared_ptr
 #include <string>
 /// \endcond
 
@@ -32,13 +33,14 @@ public:
     ADIOSPy(MPI_Comm mpiComm, const bool debugMode);
     ADIOSPy(const std::string configFile, const bool debugMode);
     ADIOSPy(const bool debugMode);
+
     ~ADIOSPy() = default;
 
     IOPy DeclareIO(const std::string name);
 
 private:
     const bool m_DebugMode;
-    adios2::ADIOS m_ADIOS;
+    std::shared_ptr<adios2::ADIOS> m_ADIOS;
 };
 
 } // end namespace adios
diff --git a/bindings/python/gluePyBind11.cpp b/bindings/python/gluePyBind11.cpp
index 86eab2cb1..85f5ec219 100644
--- a/bindings/python/gluePyBind11.cpp
+++ b/bindings/python/gluePyBind11.cpp
@@ -68,7 +68,7 @@ adios2::ADIOSPy ADIOSPyInit(adios2::pyObject &object, const bool debugMode)
 adios2::ADIOSPy ADIOSPyInitConfig(const std::string configFile,
                                   const bool debugMode)
 {
-    return adios2::ADIOSPy(debugMode);
+    return adios2::ADIOSPy(configFile, debugMode);
 }
 
 adios2::ADIOSPy ADIOSPyInit(const bool debugMode)
diff --git a/testing/adios2/bindings/python/CMakeLists.txt b/testing/adios2/bindings/python/CMakeLists.txt
index 8da6af4e7..96e47759a 100644
--- a/testing/adios2/bindings/python/CMakeLists.txt
+++ b/testing/adios2/bindings/python/CMakeLists.txt
@@ -3,4 +3,10 @@
 # accompanying file Copyright.txt for details.
 #------------------------------------------------------------------------------#
 
-python_add_test(PythonBPWrite TestBPWriteTypes.py)
+if(NOT ADIOS2_HAVE_MPI)
+    python_add_test(PythonBPWrite TestBPWriteTypes_nompi.py)
+endif()
+
+if(ADIOS2_HAVE_MPI)
+    python_add_test(PythonBPWrite TestBPWriteTypes.py)
+endif()
\ No newline at end of file
diff --git a/testing/adios2/bindings/python/TestBPWriteTypes.py b/testing/adios2/bindings/python/TestBPWriteTypes.py
index 842adacd8..36cfe7243 100644
--- a/testing/adios2/bindings/python/TestBPWriteTypes.py
+++ b/testing/adios2/bindings/python/TestBPWriteTypes.py
@@ -10,13 +10,15 @@
 
 
 from adios2NPTypes import SmallTestData
+from mpi4py import MPI
 import adios2
 
 
 # Test data
 data = SmallTestData()
 
-adios = adios2.ADIOS(adios2.DebugON)
+comm = MPI.COMM_WORLD
+adios = adios2.ADIOS(comm, adios2.DebugON)
 
 bpIO = adios.DeclareIO("NPTypes")
 
diff --git a/testing/adios2/bindings/python/TestBPWriteTypes_nompi.py b/testing/adios2/bindings/python/TestBPWriteTypes_nompi.py
new file mode 100644
index 000000000..842adacd8
--- /dev/null
+++ b/testing/adios2/bindings/python/TestBPWriteTypes_nompi.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+#
+# Distributed under the OSI-approved Apache License, Version 2.0.  See
+# accompanying file Copyright.txt for details.
+#
+# TestBPWriteTypes.py: test Python numpy types in ADIOS2 File Write
+#  Created on: Feb 2, 2017
+#      Author: William F Godoy godoywf@ornl.gov
+
+
+from adios2NPTypes import SmallTestData
+import adios2
+
+
+# Test data
+data = SmallTestData()
+
+adios = adios2.ADIOS(adios2.DebugON)
+
+bpIO = adios.DeclareIO("NPTypes")
+
+# ADIOS Variable name, shape, start, offset, constant dims
+# All local variables
+varI8 = bpIO.DefineVariable(
+    "varI8", [], [], [data.I8.size], adios2.ConstantDims)
+varI16 = bpIO.DefineVariable(
+    "varI16", [], [], [data.I16.size], adios2.ConstantDims)
+varI32 = bpIO.DefineVariable(
+    "varI32", [], [], [data.I32.size], adios2.ConstantDims)
+varI64 = bpIO.DefineVariable(
+    "varI64", [], [], [data.I64.size], adios2.ConstantDims)
+
+varU8 = bpIO.DefineVariable(
+    "varUI8", [], [], [data.U8.size], adios2.ConstantDims)
+varU16 = bpIO.DefineVariable(
+    "varUI16", [], [], [data.U16.size], adios2.ConstantDims)
+varU32 = bpIO.DefineVariable(
+    "varUI32", [], [], [data.U32.size], adios2.ConstantDims)
+varU64 = bpIO.DefineVariable(
+    "varUI64", [], [], [data.U64.size], adios2.ConstantDims)
+
+varR32 = bpIO.DefineVariable(
+    "varR32", [], [], [data.R32.size], adios2.ConstantDims)
+
+varR64 = bpIO.DefineVariable(
+    "varR64", [], [], [data.R64.size], adios2.ConstantDims)
+
+
+# ADIOS Engine
+bpFileWriter = bpIO.Open("npTypes.bp", adios2.OpenModeWrite)
+
+bpFileWriter.Write(varI8, data.I8)
+bpFileWriter.Write(varI16, data.I16)
+bpFileWriter.Write(varI32, data.I32)
+bpFileWriter.Write(varI64, data.I64)
+
+bpFileWriter.Write(varU8, data.U8)
+bpFileWriter.Write(varU16, data.U16)
+bpFileWriter.Write(varU32, data.U32)
+bpFileWriter.Write(varU64, data.U64)
+
+bpFileWriter.Write(varR32, data.R32)
+bpFileWriter.Write(varR64, data.R64)
+
+bpFileWriter.Close()
-- 
GitLab