diff --git a/opm/parser/eclipse/CMakeLists.txt b/opm/parser/eclipse/CMakeLists.txt index 7afb99cf9..5dcf4bfed 100644 --- a/opm/parser/eclipse/CMakeLists.txt +++ b/opm/parser/eclipse/CMakeLists.txt @@ -15,6 +15,7 @@ endif() add_subdirectory( Applications ) set( log_source +OpmLog/TimerLog.cpp OpmLog/CounterLog.cpp OpmLog/LogUtil.cpp OpmLog/Logger.cpp @@ -108,6 +109,7 @@ EclipseState/SimulationConfig/ThresholdPressure.cpp) set( HEADER_FILES OpmLog/LogBackend.hpp +OpmLog/TimerLog.hpp OpmLog/CounterLog.hpp OpmLog/Logger.hpp OpmLog/OpmLog.hpp diff --git a/opm/parser/eclipse/OpmLog/TimerLog.cpp b/opm/parser/eclipse/OpmLog/TimerLog.cpp new file mode 100644 index 000000000..557d902ba --- /dev/null +++ b/opm/parser/eclipse/OpmLog/TimerLog.cpp @@ -0,0 +1,60 @@ +/* + Copyright 2014 Statoil ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + */ +#include +#include +#include + +#include +#include +#include +#include + + + +namespace Opm { + +TimerLog::TimerLog(const std::string& logFile) : StreamLog( logFile , StopTimer | StartTimer ) +{ + m_work.precision(8); +} + +TimerLog::TimerLog(std::ostream& os) : StreamLog( os , StopTimer | StartTimer ) +{ + m_work.precision(8); +} + + + +void TimerLog::addMessage(int64_t messageType , const std::string& msg ) { + if (messageType == StopTimer) { + clock_t stop = clock(); + double secondsElapsed = 1.0 * (m_start - stop) / CLOCKS_PER_SEC ; + + m_work.str(""); + m_work << std::fixed << msg << ": " << secondsElapsed << " seconds "; + StreamLog::addMessage( messageType , m_work.str()); + } else { + if (messageType == StartTimer) + m_start = clock(); + } +} + + + +} // namespace Opm diff --git a/opm/parser/eclipse/OpmLog/TimerLog.hpp b/opm/parser/eclipse/OpmLog/TimerLog.hpp new file mode 100644 index 000000000..dc338cfe9 --- /dev/null +++ b/opm/parser/eclipse/OpmLog/TimerLog.hpp @@ -0,0 +1,64 @@ +/* + Copyright 2014 Statoil ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + */ +#ifndef OPM_TIMERLOG_HPP +#define OPM_TIMERLOG_HPP + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +/* + This class is a simple demonstration of how the logging framework + can be used to create a simple very special case logging facility. +*/ + +namespace Opm { + +class TimerLog : public StreamLog { +public: + static const int64_t StartTimer = 4096; + static const int64_t StopTimer = 8192; + + TimerLog(const std::string& logFile); + TimerLog(std::ostream& os); + + void addMessage(int64_t messageFlag , + const std::string& message); + + void clear(); + ~TimerLog() {}; +private: + clock_t m_start; + std::ostringstream m_work; +}; + +typedef std::shared_ptr TimerLogPtr; +typedef std::shared_ptr TimerLogConstPtr; +} // namespace Opm + +#endif + diff --git a/opm/parser/eclipse/OpmLog/tests/OpmLogTests.cpp b/opm/parser/eclipse/OpmLog/tests/OpmLogTests.cpp index 0485971ac..7ea5cbebe 100644 --- a/opm/parser/eclipse/OpmLog/tests/OpmLogTests.cpp +++ b/opm/parser/eclipse/OpmLog/tests/OpmLogTests.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -185,6 +186,19 @@ BOOST_AUTO_TEST_CASE( CounterLogTesting) { } } +BOOST_AUTO_TEST_CASE(TestTimerLog) { + Logger logger; + std::ostringstream sstream; + std::shared_ptr timer = std::make_shared(sstream); + logger.addBackend( "TIMER" , timer ); + logger.addMessageType( TimerLog::StartTimer , "Start"); + logger.addMessageType( TimerLog::StopTimer , "Stop"); + + logger.addMessage( TimerLog::StartTimer , ""); + logger.addMessage( TimerLog::StopTimer , "This was fast"); + std::cout << sstream.str() << std::endl; +} + /*****************************************************************/