From 802c8f26a1c92180d1654a9ce95273d31bb3c49f Mon Sep 17 00:00:00 2001
From: Dominik Thoennes <dominik.thoennes@fau.de>
Date: Thu, 5 Oct 2023 11:31:48 +0200
Subject: [PATCH] add minimal example

---
 .gitlab-ci.yml              | 11 ++++++
 CMakeLists.txt              |  8 ++++
 adios2-variable-problem.cpp | 75 +++++++++++++++++++++++++++++++++++++
 3 files changed, 94 insertions(+)
 create mode 100644 .gitlab-ci.yml
 create mode 100644 CMakeLists.txt
 create mode 100644 adios2-variable-problem.cpp

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..fc9dee7
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,11 @@
+test
+  image: i10git.cs.fau.de:5005/walberla/buildenvs/gcc-12
+  script:
+    - spack env activate /opt/spack-environment/
+    - spack load adios2
+    - mkdir build
+    - cd build
+    - cmake ..
+    - make
+    - mpirun --oversubscribe -n 8 ./adios2mini 20000
+    - bpls checkpoint.bp | wc -l
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..001454c
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.12)
+project(Adios2Minimal CXX C)
+
+find_package(MPI REQUIRED)
+find_package(ADIOS2 REQUIRED)
+
+add_executable(adios2mini adios2-variable-problem.cpp)
+target_link_libraries(adios2mini PRIVATE adios2::cxx11_mpi)
diff --git a/adios2-variable-problem.cpp b/adios2-variable-problem.cpp
new file mode 100644
index 0000000..1bee245
--- /dev/null
+++ b/adios2-variable-problem.cpp
@@ -0,0 +1,75 @@
+#include <iostream>
+#include <iomanip>
+#include <mpi.h>
+#include <adios2.h>
+
+std::string createVariable( adios2::IO& io, int counter, int rank, long unsigned int bufferSize ) {
+  std::stringstream sStream;
+  sStream << "Var-" << std::setfill('0') << std::setw(3) << counter << std::setw(3) << "_Rank-" << rank;
+  adios2::Variable< double > var = io.DefineVariable< double >( sStream.str(), {}, {}, {bufferSize} );
+  return sStream.str();
+}
+
+int main( int argc, char ** argv ) {
+
+  std::string outFile = "./checkpoint.bp";
+
+  // -----------
+  //  MPI setup
+  // -----------
+  MPI_Init( &argc, &argv );
+  int commSize;
+  int commRank;
+  MPI_Comm_size( MPI_COMM_WORLD, &commSize );
+  MPI_Comm_rank( MPI_COMM_WORLD, &commRank );
+
+  if( commRank == 0 ) {
+    std::cout << "Executing test with " << commSize << " MPI processes" << std::endl;
+  }
+
+  // determine number of variables to create
+  if( argc != 2 ) {
+    MPI_Abort( MPI_COMM_WORLD, -1 );
+  }
+
+  int numVarTotal = atoi( argv[1] );
+  int numVarLocal = numVarTotal / commSize;
+
+  if( commRank == 0 ) {
+    std::cout << "Total variables asked for = " << numVarTotal << std::endl;
+    std::cout << "Local variables to create = " << numVarLocal << std::endl;
+    numVarLocal += numVarTotal - numVarLocal * commSize;
+  }
+
+  // -------------
+  //  ADIOS setup
+  // -------------
+  adios2::ADIOS adios( MPI_COMM_WORLD );
+  adios2::IO output = adios.DeclareIO( "Writer" );
+  output.SetEngine( "BP5" );
+  adios2::Engine writer = output.Open( outFile, adios2::Mode::Write );
+
+  int counter = 0;
+
+  unsigned long int bufferSize = 100u;
+  std::vector< double > buffer( bufferSize, 2.0 );
+
+  for( int k = 1; k <= numVarLocal; ++k ) {
+    double* address = buffer.data();
+    std::string var = createVariable( output, counter++, commRank, bufferSize );
+    writer.Put< double >( var, address );
+  }
+
+  int numVariables = counter;
+  MPI_Reduce( &counter, &numVariables, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
+  if( commRank == 0 ) {
+    std::cout << "Total variables created = " << numVariables << std::endl;
+  }
+
+  // ----------
+  //  Shutdown
+  // ----------
+  writer.Close();
+  MPI_Finalize();
+
+}
-- 
GitLab