diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp index 05dfa43e5a22f5223fd6c1e8291302c5366f5015..14891477a2b804c4f0c8698fdfa51a8ea2470c8b 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 ac79ee8490882a1bac8a9fd74db58b6cd8dccdb7..a04c664d7dcbe36817d2748a6f27e0b8d8dc3481 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 104e70cddc5cc29d927583adde0ffa53afe72e95..3e759212cb13f0eb448ef19d34691a39883849b0 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);