diff --git a/BaseLib/LogogCustomCout.h b/BaseLib/LogogCustomCout.h index 9cfdc152ec83ffdbcc5da8f14a6aa49c8ad0aaa9..a6e6e25a8b940abeb149ba22b3528f554aef3f60 100644 --- a/BaseLib/LogogCustomCout.h +++ b/BaseLib/LogogCustomCout.h @@ -24,23 +24,43 @@ class LogogCustomCout : public logog::Target { public: #ifdef USE_MPI - LogogCustomCout(MPI_Comm mpi_comm) - { - MPI_Comm_rank(mpi_comm, &_mpi_rank); - } + /** + * Constructor when MPI is involved + * + * @param all_rank_output_level Minimum level to output messages from all MPI processes + * @param mpi_comm MPI communicator + */ + LogogCustomCout(LOGOG_LEVEL_TYPE all_rank_output_level = LOGOG_LEVEL_INFO, MPI_Comm mpi_comm = MPI_COMM_WORLD) + : _all_rank_output_level(all_rank_output_level), _is_rank0 (getRank(mpi_comm)==0) + {} #endif - virtual int Output( const LOGOG_STRING &data ) + virtual int Receive( const logog::Topic &topic ) { #ifdef USE_MPI - if (_mpi_rank == 0) + if (topic.Level() > _all_rank_output_level && !_is_rank0) + return 0; #endif + return logog::Target::Receive(topic); + } + + virtual int Output( const LOGOG_STRING &data ) + { LOGOG_COUT << (const LOGOG_CHAR *)data; return 0; } +private: #ifdef USE_MPI - int _mpi_rank; + int getRank(MPI_Comm mpi_comm) const + { + int rank = 0; + MPI_Comm_rank(mpi_comm, &rank); + return rank; + } + + const LOGOG_LEVEL_TYPE _all_rank_output_level; + const bool _is_rank0; #endif }; diff --git a/Tests/testrunner.cpp b/Tests/testrunner.cpp index e806c85704f2ff5680c0f9b3bec84b6c750a1361..11d723f934b6455e0936a1553186bfd88c07a7d3 100644 --- a/Tests/testrunner.cpp +++ b/Tests/testrunner.cpp @@ -45,10 +45,8 @@ int main(int argc, char* argv[]) { #ifdef USE_MPI MPI_Init(&argc, &argv); - BaseLib::LogogCustomCout out(MPI_COMM_WORLD); -#else - BaseLib::LogogCustomCout out; #endif + BaseLib::LogogCustomCout out; BaseLib::TemplateLogogFormatterSuppressedGCC<TOPIC_LEVEL_FLAG | TOPIC_FILE_NAME_FLAG | TOPIC_LINE_NUMBER_FLAG> custom_format; out.SetFormatter(custom_format);