From 2b91f85a2c05309a071ec47a5755e49bc9d54d83 Mon Sep 17 00:00:00 2001
From: William F Godoy <williamfgc@yahoo.com>
Date: Mon, 5 Jun 2017 17:13:47 -0400
Subject: [PATCH] BP file output now compatible with bpdump

---
 source/adios2/core/IO.h                       |  2 +-
 source/adios2/core/VariableBase.cpp           |  4 +--
 .../adios2/toolkit/format/bp1/BP1Writer.cpp   | 36 +++++++++++++------
 source/adios2/toolkit/format/bp1/BP1Writer.h  |  5 ++-
 .../adios2/toolkit/format/bp1/BP1Writer.tcc   | 22 +++---------
 .../toolkit/interop/adios1/ADIOS1Common.h     |  2 +-
 6 files changed, 36 insertions(+), 35 deletions(-)

diff --git a/source/adios2/core/IO.h b/source/adios2/core/IO.h
index 215dbbfd9..87df704d8 100644
--- a/source/adios2/core/IO.h
+++ b/source/adios2/core/IO.h
@@ -42,7 +42,7 @@ public:
 
     /** from ADIOS class passed to Engine created with Open
      *  if no new communicator is passed */
-    MPI_Comm m_MPIComm = MPI_COMM_SELF;
+    MPI_Comm m_MPIComm;
 
     /** true: extra exceptions checks */
     const bool m_DebugMode = false;
diff --git a/source/adios2/core/VariableBase.cpp b/source/adios2/core/VariableBase.cpp
index 40632a61e..db50a21db 100644
--- a/source/adios2/core/VariableBase.cpp
+++ b/source/adios2/core/VariableBase.cpp
@@ -112,8 +112,8 @@ void VariableBase::SetMemorySelection(const SelectionBoundingBox &selection)
         }
     }
 
-    ConvertUint64VectorToSizetVector(selection.m_Count, m_MemoryCount);
-    ConvertUint64VectorToSizetVector(selection.m_Start, m_MemoryStart);
+    m_MemoryCount = selection.m_Count;
+    m_MemoryStart = selection.m_Start;
 }
 
 void VariableBase::SetStepSelection(const unsigned int startStep,
diff --git a/source/adios2/toolkit/format/bp1/BP1Writer.cpp b/source/adios2/toolkit/format/bp1/BP1Writer.cpp
index 34639d7fb..daaf29b8c 100644
--- a/source/adios2/toolkit/format/bp1/BP1Writer.cpp
+++ b/source/adios2/toolkit/format/bp1/BP1Writer.cpp
@@ -248,14 +248,19 @@ void BP1Writer::WriteDimensionsRecord(const Dims localDimensions,
 void BP1Writer::WriteDimensionsRecord(const Dims localDimensions,
                                       const Dims globalDimensions,
                                       const Dims offsets,
-                                      const unsigned int skip,
                                       std::vector<char> &buffer,
-                                      size_t &position) noexcept
+                                      size_t &position,
+                                      const bool isCharacteristic) noexcept
 {
-    auto lf_WriteFlaggedDim = [](std::vector<char> &buffer, size_t &position,
-                                 const size_t dimension) {
-        constexpr char no = 'n';
-        CopyToBuffer(buffer, position, &no);
+    auto lf_CopyDimension = [](std::vector<char> &buffer, size_t &position,
+                               const size_t dimension,
+                               const bool isCharacteristic) {
+        if (!isCharacteristic)
+        {
+            constexpr char no = 'n';
+            CopyToBuffer(buffer, position, &no);
+        }
+
         CopyToBuffer(buffer, position,
                      reinterpret_cast<const uint64_t *>(&dimension));
     };
@@ -263,19 +268,28 @@ void BP1Writer::WriteDimensionsRecord(const Dims localDimensions,
     // BODY Starts here
     if (offsets.empty())
     {
+        unsigned int globalBoundsSkip = 18;
+        if (isCharacteristic)
+        {
+            globalBoundsSkip = 16;
+        }
+
         for (const auto &localDimension : localDimensions)
         {
-            lf_WriteFlaggedDim(buffer, position, localDimension);
-            position += skip;
+            lf_CopyDimension(buffer, position, localDimension,
+                             isCharacteristic);
+            position += globalBoundsSkip;
         }
     }
     else
     {
         for (unsigned int d = 0; d < localDimensions.size(); ++d)
         {
-            lf_WriteFlaggedDim(buffer, position, localDimensions[d]);
-            lf_WriteFlaggedDim(buffer, position, globalDimensions[d]);
-            lf_WriteFlaggedDim(buffer, position, offsets[d]);
+            lf_CopyDimension(buffer, position, localDimensions[d],
+                             isCharacteristic);
+            lf_CopyDimension(buffer, position, globalDimensions[d],
+                             isCharacteristic);
+            lf_CopyDimension(buffer, position, offsets[d], isCharacteristic);
         }
     }
 }
diff --git a/source/adios2/toolkit/format/bp1/BP1Writer.h b/source/adios2/toolkit/format/bp1/BP1Writer.h
index d3caf67f3..d193753c1 100644
--- a/source/adios2/toolkit/format/bp1/BP1Writer.h
+++ b/source/adios2/toolkit/format/bp1/BP1Writer.h
@@ -186,9 +186,8 @@ private:
     /** Overloaded version for data buffer */
     void WriteDimensionsRecord(const Dims localDimensions,
                                const Dims globalDimensions, const Dims offsets,
-                               const unsigned int skip,
-                               std::vector<char> &buffer,
-                               size_t &position) noexcept;
+                               std::vector<char> &buffer, size_t &position,
+                               const bool isCharacteristic = false) noexcept;
 
     /** Writes min max */
     template <class T>
diff --git a/source/adios2/toolkit/format/bp1/BP1Writer.tcc b/source/adios2/toolkit/format/bp1/BP1Writer.tcc
index 31eac673a..eef815c26 100644
--- a/source/adios2/toolkit/format/bp1/BP1Writer.tcc
+++ b/source/adios2/toolkit/format/bp1/BP1Writer.tcc
@@ -175,16 +175,15 @@ void BP1Writer::WriteVariableMetadataInData(
     CopyToBuffer(buffer, position, &dimensionsLength); // length
 
     WriteDimensionsRecord(variable.m_Count, variable.m_Shape, variable.m_Start,
-                          18, buffer, position);
+                          buffer, position);
 
     // CHARACTERISTICS
-    // FIX
     WriteVariableCharacteristics(variable, stats, buffer, position);
 
     // Back to varLength including payload size
-    // remove its own size (8) from length
+    // not need to remove its own size (8) from length from bpdump
     const uint64_t varLength =
-        position - varLengthPosition + variable.PayLoadSize() - 8;
+        position - varLengthPosition + variable.PayLoadSize();
 
     size_t backPosition = varLengthPosition;
     CopyToBuffer(buffer, backPosition, &varLength);
@@ -301,10 +300,6 @@ void BP1Writer::WriteCharacteristicRecord(const uint8_t characteristicID,
 {
     const std::uint8_t id = characteristicID;
     CopyToBuffer(buffer, position, &id);
-
-    const std::uint16_t lengthOfCharacteristic = sizeof(T);
-    CopyToBuffer(buffer, position, &lengthOfCharacteristic);
-
     CopyToBuffer(buffer, position, &value);
     ++characteristicsCounter;
 }
@@ -372,25 +367,18 @@ void BP1Writer::WriteVariableCharacteristics(
     // DIMENSIONS
     uint8_t characteristicID = characteristic_dimensions;
     CopyToBuffer(buffer, position, &characteristicID);
-    const uint8_t dimensions = variable.m_Count.size();
-
-    // 24 = 3 local, global, offset x 8 bytes/each
-    const int16_t lengthOfDimensionsCharacteristic = 24 * dimensions + 3;
-    CopyToBuffer(buffer, position, &lengthOfDimensionsCharacteristic);
 
+    const uint8_t dimensions = variable.m_Count.size();
     CopyToBuffer(buffer, position, &dimensions); // count
     const uint16_t dimensionsLength = 24 * dimensions;
     CopyToBuffer(buffer, position, &dimensionsLength); // length
     WriteDimensionsRecord(variable.m_Count, variable.m_Shape, variable.m_Start,
-                          16, buffer, position);
+                          buffer, position, true); // isCharacteristic = true
     ++characteristicsCounter;
 
     // VALUE for SCALAR or STAT min, max for ARRAY
     WriteBoundsRecord(variable.m_SingleValue, stats, characteristicsCounter,
                       buffer, position);
-    // TIME INDEX
-    WriteCharacteristicRecord(characteristic_time_index, characteristicsCounter,
-                              stats.TimeIndex, buffer, position);
     // END OF CHARACTERISTICS
 
     // Back to characteristics count and length
diff --git a/source/adios2/toolkit/interop/adios1/ADIOS1Common.h b/source/adios2/toolkit/interop/adios1/ADIOS1Common.h
index 05327d92b..c5e2297f4 100644
--- a/source/adios2/toolkit/interop/adios1/ADIOS1Common.h
+++ b/source/adios2/toolkit/interop/adios1/ADIOS1Common.h
@@ -73,7 +73,7 @@ public:
     void Close();
 
 private:
-    MPI_Comm m_MPIComm = MPI_COMM_SELF;
+    MPI_Comm m_MPIComm;
     const bool m_DebugMode = false;
 
     void Init();
-- 
GitLab