From 102aa934ae58e1fa3b68ffadbf49f3ed8cb610a2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 5 Feb 2019 22:53:53 -0600 Subject: [PATCH] Add implementation of write_message and fatal_error in error.cpp --- include/openmc/error.h | 35 +++++----------------- src/error.F90 | 26 ---------------- src/error.cpp | 68 ++++++++++++++++++++++++++++++++++-------- 3 files changed, 64 insertions(+), 65 deletions(-) diff --git a/include/openmc/error.h b/include/openmc/error.h index 9bfebb2ce..ee7168a4e 100644 --- a/include/openmc/error.h +++ b/include/openmc/error.h @@ -9,11 +9,6 @@ namespace openmc { -extern "C" void fatal_error_from_c(const char* message, int message_len); -extern "C" void warning_from_c(const char* message, int message_len); -extern "C" void write_message_from_c(const char* message, int message_len, - int level); - inline void set_errmsg(const char* message) { @@ -32,17 +27,7 @@ set_errmsg(const std::stringstream& message) std::strcpy(openmc_err_msg, message.str().c_str()); } -inline -void fatal_error(const char* message) -{ - fatal_error_from_c(message, std::strlen(message)); -} - -inline -void fatal_error(const std::string& message) -{ - fatal_error_from_c(message.c_str(), message.length()); -} +[[noreturn]] void fatal_error(const std::string& message, int err=-1); inline void fatal_error(const std::stringstream& message) @@ -50,6 +35,12 @@ void fatal_error(const std::stringstream& message) fatal_error(message.str()); } +inline +void fatal_error(const char* message) +{ + fatal_error({message, std::strlen(message)}); +} + void warning(const std::string& message); inline @@ -58,17 +49,7 @@ void warning(const std::stringstream& message) warning(message.str()); } -inline -void write_message(const char* message, int level) -{ - write_message_from_c(message, std::strlen(message), level); -} - -inline -void write_message(const std::string& message, int level) -{ - write_message_from_c(message.c_str(), message.length(), level); -} +void write_message(const std::string& message, int level); inline void write_message(const std::stringstream& message, int level) diff --git a/src/error.F90 b/src/error.F90 index ad07987eb..ca94c6ce7 100644 --- a/src/error.F90 +++ b/src/error.F90 @@ -111,14 +111,6 @@ contains end subroutine warning - subroutine warning_from_c(message, message_len) bind(C) - integer(C_INT), intent(in), value :: message_len - character(kind=C_CHAR), intent(in) :: message(message_len) - character(message_len+1) :: message_out - write(message_out, *) message - call warning(message_out) - end subroutine - !=============================================================================== ! FATAL_ERROR alerts the user that an error has been encountered and displays a ! message about the particular problem. Errors are considered 'fatal' and hence @@ -208,14 +200,6 @@ contains end subroutine fatal_error - subroutine fatal_error_from_c(message, message_len) bind(C) - integer(C_INT), intent(in), value :: message_len - character(kind=C_CHAR), intent(in) :: message(message_len) - character(message_len+1) :: message_out - write(message_out, *) message - call fatal_error(message_out) - end subroutine - !=============================================================================== ! WRITE_MESSAGE displays an informational message to the log file and the ! standard output stream. @@ -271,14 +255,4 @@ contains end subroutine write_message - subroutine write_message_from_c(message, message_len, level) bind(C) - integer(C_INT), intent(in), value :: message_len - character(kind=C_CHAR), intent(in) :: message(message_len) - integer(C_INT), intent(in), value :: level - character(message_len+1) :: message_out - ! Using * in the internal write adds an extra space at the beginning - write(message_out, *) message - call write_message(message_out(2:), level) - end subroutine write_message_from_c - end module error diff --git a/src/error.cpp b/src/error.cpp index fdb42d269..38001b72a 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -1,11 +1,13 @@ #include "openmc/error.h" #include "openmc/message_passing.h" +#include "openmc/settings.h" #if defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)) #include // for isatty #endif +#include // for exit #include // for setw #include @@ -18,21 +20,10 @@ void abort_mpi(int code) } #endif -void warning(const std::string& message) +void output(const std::string& message, std::ostream& out, int indent) { -#ifdef _POSIX_VERSION - // Make output yellow if user is in a terminal - if (isatty(STDERR_FILENO)) { - std::cerr << "\033[0;33m"; - } -#endif - - // Write warning at beginning - std::cerr << " WARNING: "; - // Set line wrapping and indentation int line_wrap = 80; - int indent = 10; // Determine length of message int length = message.size(); @@ -57,6 +48,20 @@ void warning(const std::string& message) i_start += (pos == std::string::npos) ? line_len : pos + 1; } } +} + +void warning(const std::string& message) +{ +#ifdef _POSIX_VERSION + // Make output yellow if user is in a terminal + if (isatty(STDERR_FILENO)) { + std::cerr << "\033[0;33m"; + } +#endif + + // Write warning + std::cerr << " WARNING: "; + output(message, std::cerr, 10); #ifdef _POSIX_VERSION // Reset color for terminal @@ -66,4 +71,43 @@ void warning(const std::string& message) #endif } +void write_message(const std::string& message, int level) +{ + // Only allow master to print to screen + if (!mpi::master) return; + + if (level <= settings::verbosity) { + std::cout << " "; + output(message, std::cout, 1); + } +} + +void fatal_error(const std::string& message, int err) +{ +#ifdef _POSIX_VERSION + // Make output red if user is in a terminal + if (isatty(STDERR_FILENO)) { + std::cerr << "\033[0;31m"; + } +#endif + + // Write error message + std::cerr << " ERROR: "; + output(message, std::cerr, 8); + +#ifdef _POSIX_VERSION + // Reset color for terminal + if (isatty(STDERR_FILENO)) { + std::cerr << "\033[0m"; + } +#endif + +#ifdef OPENMC_MPI + MPI_Abort(mpi::intracomm, err); +#endif + + // Abort the program + std::exit(err); +} + } // namespace openmc