From 1d1e91a2ab40ed962aad071c18f9bc1672c6f06c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Thu, 11 Jul 2024 19:29:26 +0200
Subject: [PATCH] Add new CLI option to allow parallel output

---
 src/utils/Messenger.cpp |  8 ++++----
 src/utils/Messenger.hpp |  4 ++--
 src/utils/PugsUtils.cpp | 12 ++++++++----
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp
index 05dfa43e5..14891477a 100644
--- a/src/utils/Messenger.cpp
+++ b/src/utils/Messenger.cpp
@@ -9,10 +9,10 @@ namespace parallel
 Messenger* Messenger::m_instance = nullptr;
 
 void
-Messenger::create(int& argc, char* argv[])
+Messenger::create(int& argc, char* argv[], bool parallel_output)
 {
   if (Messenger::m_instance == nullptr) {
-    Messenger::m_instance = new Messenger(argc, argv);
+    Messenger::m_instance = new Messenger(argc, argv, parallel_output);
   } else {
     throw UnexpectedError("Messenger already created");
   }
@@ -28,7 +28,7 @@ Messenger::destroy()
   }
 }
 
-Messenger::Messenger([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[])
+Messenger::Messenger([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[], bool parallel_output)
 {
 #ifdef PUGS_HAS_MPI
   MPI_Init(&argc, &argv);
@@ -66,7 +66,7 @@ Messenger::Messenger([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[])
     return size;
   }();
 
-  if (m_rank != 0) {
+  if ((not parallel_output) and (m_rank != 0)) {
     // LCOV_EXCL_START
     std::cout.setstate(std::ios::badbit);
     std::cerr.setstate(std::ios::badbit);
diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index ac79ee849..a04c664d7 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -85,7 +85,7 @@ class Messenger
   };
 
   static Messenger* m_instance;
-  Messenger(int& argc, char* argv[]);
+  Messenger(int& argc, char* argv[], bool parallel_output);
 
 #ifdef PUGS_HAS_MPI
   MPI_Comm m_pugs_comm_world = MPI_COMM_WORLD;
@@ -406,7 +406,7 @@ class Messenger
   }
 
  public:
-  static void create(int& argc, char* argv[]);
+  static void create(int& argc, char* argv[], bool parallel_output = false);
   static void destroy();
 
   PUGS_INLINE
diff --git a/src/utils/PugsUtils.cpp b/src/utils/PugsUtils.cpp
index 104e70cdd..3e759212c 100644
--- a/src/utils/PugsUtils.cpp
+++ b/src/utils/PugsUtils.cpp
@@ -85,9 +85,10 @@ setDefaultOMPEnvironment()
 std::string
 initialize(int& argc, char* argv[])
 {
-  bool enable_fpe     = true;
-  bool enable_signals = true;
-  int nb_threads      = -1;
+  bool enable_fpe      = true;
+  bool enable_signals  = true;
+  int nb_threads       = -1;
+  bool parallel_output = false;
 
   ParallelChecker::Mode pc_mode = ParallelChecker::Mode::automatic;
   std::string pc_filename       = ParallelChecker::instance().filename();
@@ -132,6 +133,8 @@ initialize(int& argc, char* argv[])
     app.add_flag("--reproducible-sums,!--no-reproducible-sums", show_preamble,
                  "Special treatment of array sums to ensure reproducibility [default: true]");
 
+    app.add_flag("--parallel-output", parallel_output, "All MPI processes output to console [default: false]");
+
     std::map<std::string, ParallelChecker::Mode> pc_mode_map{{"auto", ParallelChecker::Mode::automatic},
                                                              {"write", ParallelChecker::Mode::write},
                                                              {"read", ParallelChecker::Mode::read}};
@@ -169,7 +172,8 @@ initialize(int& argc, char* argv[])
     SignalManager::setPauseForDebug(pause_on_error);
     ReproducibleSumManager::setReproducibleSums(reproducible_sums);
   }
-  parallel::Messenger::create(argc, argv);
+
+  parallel::Messenger::create(argc, argv, parallel_output);
 
   PETScWrapper::initialize(argc, argv);
   SLEPcWrapper::initialize(argc, argv);
-- 
GitLab