From 67cd30be06d428c5cf582110836b0789face902d Mon Sep 17 00:00:00 2001
From: "Godoy, William F" <godoywf@ornl.gov>
Date: Tue, 24 Oct 2017 22:28:20 -0400
Subject: [PATCH] Make BPLS2 friend of BPFileReader Engine

---
 source/adios2/engine/bp/BPFileReader.h |  7 +++++
 source/utils/bpls2/BPLS2.cpp           | 38 ++++++++++++++++++++++++++
 source/utils/bpls2/BPLS2.h             |  2 ++
 source/utils/bpls2/main.cpp            |  5 ++++
 4 files changed, 52 insertions(+)

diff --git a/source/adios2/engine/bp/BPFileReader.h b/source/adios2/engine/bp/BPFileReader.h
index 4c123500e..9a2427de1 100644
--- a/source/adios2/engine/bp/BPFileReader.h
+++ b/source/adios2/engine/bp/BPFileReader.h
@@ -19,9 +19,16 @@
 namespace adios2
 {
 
+namespace utils
+{
+class BPLS2;
+}
+
 class BPFileReader : public Engine
 {
 
+    friend class utils::BPLS2;
+
 public:
     /**
      * Unique constructor
diff --git a/source/utils/bpls2/BPLS2.cpp b/source/utils/bpls2/BPLS2.cpp
index 00e87201a..b18b0212c 100644
--- a/source/utils/bpls2/BPLS2.cpp
+++ b/source/utils/bpls2/BPLS2.cpp
@@ -12,6 +12,11 @@
 
 #include <iostream>
 
+#include "adios2/ADIOSMPICommOnly.h"
+#include "adios2/core/ADIOS.h"
+#include "adios2/core/IO.h"
+#include "adios2/engine/bp/BPFileReader.h"
+
 namespace adios2
 {
 namespace utils
@@ -31,6 +36,7 @@ void BPLS2::Run()
 {
     ParseArguments();
     ProcessParameters();
+    ProcessTransport();
 }
 
 // PRIVATE
@@ -175,5 +181,37 @@ void BPLS2::SetParameters(const std::string argument, const bool isLong)
     }
 }
 
+void BPLS2::ProcessTransport() const
+{
+    ADIOS adios(true);
+    IO &io = adios.DeclareIO("bpls2");
+    BPFileReader bpFileReader(io, m_FileName, Mode::Read, io.m_MPIComm);
+    const auto variablesMap = io.GetAvailableVariables();
+    // const auto attributesMap = io.GetAvailableAttributes();
+
+    if (m_Parameters.count("verbose") == 1)
+    {
+        const auto &metadataSet = bpFileReader.m_BP3Deserializer.m_MetadataSet;
+        std::cout << "File info:\n";
+        std::cout << "    groups:     " << metadataSet.DataPGCount << "\n";
+        std::cout << "    variables:  " << variablesMap.size() << "\n";
+        std::cout << "    attributes: TODO\n";
+        std::cout << "    meshes:     TODO\n";
+        std::cout << "    time steps: " << metadataSet.TimeStep << "\n";
+        std::cout << "    file size:  "
+                  << bpFileReader.m_FileManager.GetFileSize(0) << " bytes\n";
+
+        const auto &minifooter = bpFileReader.m_BP3Deserializer.m_Minifooter;
+        std::cout << "    bp version: " << std::to_string(minifooter.Version)
+                  << "\n";
+        std::string endianness("Little Endian");
+        if (!minifooter.IsLittleEndian)
+        {
+            endianness = "Big Endian";
+        }
+        std::cout << "    Endianness: " << endianness << "\n";
+    }
+}
+
 } // end namespace utils
 } // end namespace adios2
diff --git a/source/utils/bpls2/BPLS2.h b/source/utils/bpls2/BPLS2.h
index 37b2e67a2..f92543797 100644
--- a/source/utils/bpls2/BPLS2.h
+++ b/source/utils/bpls2/BPLS2.h
@@ -38,6 +38,8 @@ private:
     void PrintUsage() const noexcept final;
     void PrintExamples() const noexcept final;
     void SetParameters(const std::string argument, const bool isLong) final;
+
+    void ProcessTransport() const;
 };
 
 } // end namespace utils
diff --git a/source/utils/bpls2/main.cpp b/source/utils/bpls2/main.cpp
index c9fe8694b..f1315b81c 100644
--- a/source/utils/bpls2/main.cpp
+++ b/source/utils/bpls2/main.cpp
@@ -11,10 +11,13 @@
 #include <iostream>
 #include <stdexcept>
 
+#include "adios2/ADIOSMPI.h"
 #include "utils/bpls2/BPLS2.h"
 
 int main(int argc, char *argv[])
 {
+    MPI_Init(&argc, &argv);
+
     try
     {
         adios2::utils::BPLS2 bpls2(argc, argv);
@@ -25,4 +28,6 @@ int main(int argc, char *argv[])
         std::cout << "bpls2 Caught an Exception\n";
         std::cout << e.what() << "\n";
     }
+
+    MPI_Finalize();
 }
-- 
GitLab