LAMA
|
00001 00033 #ifndef LAMA_SOLVER_LOGGER_HPP_ 00034 #define LAMA_SOLVER_LOGGER_HPP_ 00035 00036 // for dll_import 00037 #include <lama/config.hpp> 00038 00039 // base classes 00040 #include <lama/NonCopyable.hpp> 00041 00042 // others 00043 #include <lama/solver/logger/LogLevel.hpp> 00044 #include <lama/solver/logger/LoggerWriteBehaviour.hpp> 00045 #include <lama/solver/logger/Timer.hpp> 00046 00047 #include <lama/norm/Norm.hpp> 00048 00049 #include <string> 00050 #include <sstream> 00051 #include <memory> 00052 00053 namespace lama 00054 { 00055 00056 class Solver; 00057 class Logger; 00058 00059 typedef boost::shared_ptr<Logger> LoggerPtr; 00060 00068 class LAMA_DLL_IMPORTEXPORT Logger : private NonCopyable 00069 { 00070 public: 00071 00077 const std::string& id() const; 00078 00095 Logger(const std::string& id, 00096 LogLevel::LogLevel level, 00097 LoggerWriteBehaviour::LoggerWriteBehaviour writeBehaviour, 00098 bool ignoreRank = false); 00099 00118 Logger(const std::string& id, 00119 LogLevel::LogLevel level, 00120 LoggerWriteBehaviour::LoggerWriteBehaviour writeBehaviour, 00121 std::auto_ptr<Timer> timer, 00122 bool ignoreRank = false); 00123 00150 Logger(const std::string& id, 00151 LogLevel::LogLevel level, 00152 LoggerWriteBehaviour::LoggerWriteBehaviour writeBehaviour, 00153 const std::string& logFileName, 00154 std::auto_ptr<Timer> timer, 00155 bool ignoreRank = false); 00156 00160 virtual ~Logger(); 00161 00167 LogLevel::LogLevel getLogLevel() const; 00168 00174 void setLogLevel(LogLevel::LogLevel level); 00175 00184 void logMessage(LogLevel::LogLevel level, const std::string& message); 00185 00191 void logNewLine(LogLevel::LogLevel level); 00192 00201 void logResidual(LogLevel::LogLevel level, const Solver& solver, const Norm& norm, const std::string iterationPrefix = ""); 00202 00214 void logTime(const std::string& timerId, 00215 LogLevel::LogLevel level, 00216 const std::string& message); 00217 00225 void startTimer(const std::string& timerId); 00226 00237 void stopTimer(const std::string& timerId); 00238 00246 void stopAndResetTimer(const std::string& timerId); 00247 00259 template<typename T> 00260 void logType( LogLevel::LogLevel level, const std::string& message, T arg ); 00261 00262 protected: 00263 00270 virtual void logString( 00271 LogLevel::LogLevel level, 00272 const std::string& message); 00273 00279 virtual void logString(const std::string& message); 00280 00287 virtual std::string createPrefix() = 0; 00288 00292 std::auto_ptr<Timer> mTimer; 00293 00294 std::string mId; 00295 00296 LAMA_LOG_DECL_STATIC_LOGGER(logger); 00297 00298 private: 00299 LogLevel::LogLevel mLogLevel; 00300 LoggerWriteBehaviour::LoggerWriteBehaviour mWriteBehaviour; 00301 bool mIgnoreRank; 00302 }; 00303 00304 template<typename T> 00305 void Logger::logType(LogLevel::LogLevel level, 00306 const std::string& message, 00307 T arg) 00308 { 00309 if (level <= mLogLevel) 00310 { 00311 std::stringstream intStream; 00312 intStream << message; 00313 intStream << arg; 00314 intStream << "\n"; 00315 00316 logString(level, intStream.str()); 00317 } 00318 } 00319 00320 } // namespace lama 00321 00322 #endif // LAMA_SOLVER_LOGGER_HPP_