diff --git a/Source/driver/Castro.H b/Source/driver/Castro.H index 0a77218ee6..e95a0153ad 100644 --- a/Source/driver/Castro.H +++ b/Source/driver/Castro.H @@ -6,6 +6,7 @@ // runtime parameters #include #include +#include #include using namespace castro; diff --git a/Source/driver/Castro_advance.cpp b/Source/driver/Castro_advance.cpp index 6f9f0b9d07..90d596182f 100644 --- a/Source/driver/Castro_advance.cpp +++ b/Source/driver/Castro_advance.cpp @@ -229,10 +229,21 @@ Castro::initialize_do_advance (Real time, Real dt) if (castro::check_dt_before_advance && !is_first_step_on_this_level) { int is_new = 0; - Real old_dt = estTimeStep(is_new); + + // We only display the estTimeStep output if the validity check fails + std::string estTimeStep_output; + + Real old_dt; + + { + CoutRedirection redirection; + old_dt = estTimeStep(is_new); + estTimeStep_output = redirection.getCapturedOutput(); + } if (castro::change_max * old_dt < dt) { status.success = false; + std::cout << estTimeStep_output; status.reason = "pre-advance timestep validity check failed"; } } @@ -276,10 +287,21 @@ Castro::finalize_do_advance (Real time, Real dt) if (do_validity_check) { int is_new = 1; - Real new_dt = estTimeStep(is_new); + + // We only display the estTimeStep output if the validity check fails + std::string estTimeStep_output; + + Real new_dt; + + { + CoutRedirection redirection; + new_dt = estTimeStep(is_new); + estTimeStep_output = redirection.getCapturedOutput(); + } if (castro::change_max * new_dt < dt) { status.success = false; + std::cout << estTimeStep_output; status.reason = "post-advance timestep validity check failed"; return status; } diff --git a/Source/driver/Castro_io.H b/Source/driver/Castro_io.H index d47c74019f..41fbb323f0 100644 --- a/Source/driver/Castro_io.H +++ b/Source/driver/Castro_io.H @@ -1,6 +1,38 @@ #ifndef CASTRO_IO_H #define CASTRO_IO_H +#include +#include + extern std::string inputs_name; +// Redirect std::cout to a temporary buffer. + +class CoutRedirection { + +public: + CoutRedirection () : original_output(std::cout.rdbuf()) { + std::cout.rdbuf(captured_output.rdbuf()); + } + + ~CoutRedirection () { + std::cout.rdbuf(original_output); + } + + // Remove copy/move constructors/assignment operators. + CoutRedirection (const CoutRedirection&) = delete; + CoutRedirection (CoutRedirection&&) = delete; + CoutRedirection& operator= (const CoutRedirection&) = delete; + CoutRedirection& operator= (CoutRedirection&&) = delete; + + std::string getCapturedOutput () { + return captured_output.str(); + } + +private: + std::ostringstream captured_output; + std::streambuf* original_output; + +}; + #endif