diff --git a/src/lbm/PerformanceLogger.h b/src/lbm/PerformanceLogger.h index 2681d271dde4a4c842c2c8733181155d57c5744b..5628f744f467c5b530780b8807c96c5b22969b6c 100644 --- a/src/lbm/PerformanceLogger.h +++ b/src/lbm/PerformanceLogger.h @@ -33,6 +33,8 @@ #include "field/FlagUID.h" +#include "timeloop/ITimeloop.h" + #include <limits> namespace walberla { @@ -57,9 +59,23 @@ public: const Set<SUID> & requiredSelectors = Set<SUID>::emptySet(), const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() ); + PerformanceLogger( const shared_ptr< StructuredBlockStorage > & blocks, + const ConstBlockDataID & flagFieldId, const Set< FlagUID > & fluid, + const timeloop::ITimeloop * const timeloop, + const uint_t interval, + const Set<SUID> & requiredSelectors = Set<SUID>::emptySet(), + const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() ); + void operator()(); void logOverallResultsOnRoot() const; + void enableRefreshCellCountOnCall() { refreshCellCountOnCall_ = true; } + void disableRefreshCellCountOnCall() { refreshCellCountOnCall_ = false; } + + void getBestResultsForSQLOnRoot( std::map< std::string, int > & integerProperties, + std::map< std::string, double > & realProperties, + std::map< std::string, std::string > & stringProperties ); + private: enum Mode { MIN, MAX, AVG, LAST }; real_t getTiming( Mode mode ) const; @@ -68,6 +84,8 @@ private: uint_t interval_; uint_t timestep_; WcTimer timer_; + bool refreshCellCountOnCall_; + const timeloop::ITimeloop * timeloop_; }; // class PerformanceLogger @@ -79,7 +97,19 @@ PerformanceLogger<FlagField_T>::PerformanceLogger( const shared_ptr< StructuredB const Set<SUID> & requiredSelectors /*= Set<SUID>::emptySet()*/, const Set<SUID> & incompatibleSelectors /*= Set<SUID>::emptySet()*/ ) : performanceEvaluation_( blocks, flagFieldId, fluid, requiredSelectors, incompatibleSelectors ), - interval_(interval), timestep_(1) + interval_(interval), timestep_(1), refreshCellCountOnCall_(false), timeloop_(NULL) +{ +} + +template< typename FlagField_T > +PerformanceLogger<FlagField_T>::PerformanceLogger( const shared_ptr< StructuredBlockStorage > & blocks, + const ConstBlockDataID & flagFieldId, const Set< FlagUID > & fluid, + const timeloop::ITimeloop * const timeloop, + const uint_t interval, + const Set<SUID> & requiredSelectors /*= Set<SUID>::emptySet()*/, + const Set<SUID> & incompatibleSelectors /*= Set<SUID>::emptySet()*/ ) + : performanceEvaluation_( blocks, flagFieldId, fluid, requiredSelectors, incompatibleSelectors ), + interval_( interval ), timestep_( 1 ), refreshCellCountOnCall_( false ), timeloop_( timeloop ) { } @@ -106,13 +136,19 @@ real_t PerformanceLogger<FlagField_T>::getTiming( Mode mode ) const template< typename FlagField_T > void PerformanceLogger<FlagField_T>::operator()() { - if( timestep_ == interval_ ) + if( timeloop_ ) + timestep_ = timeloop_->getCurrentTimeStep() + uint_t(1); + + if( timestep_ % interval_ == 0 ) { WALBERLA_MPI_BARRIER(); timer_.end(); + + if( refreshCellCountOnCall_ ) + performanceEvaluation_.refresh(); + performanceEvaluation_.logResultOnRoot( interval_, getTiming( LAST ) ); timer_.start(); - timestep_ = 0; } ++timestep_; @@ -126,6 +162,14 @@ void PerformanceLogger<FlagField_T>::logOverallResultsOnRoot() const WALBERLA_LOG_RESULT_ON_ROOT( "Avg Performance:\n" << performanceEvaluation_.loggingString( interval_, getTiming( AVG ) ); ); } +template< typename FlagField_T > +void PerformanceLogger<FlagField_T>::getBestResultsForSQLOnRoot( std::map< std::string, int > & integerProperties, + std::map< std::string, double > & realProperties, + std::map< std::string, std::string > & stringProperties ) +{ + performanceEvaluation_.getResultsForSQLOnRoot( integerProperties, realProperties, stringProperties, interval_, getTiming( MAX ) ); +} + } // namespace lbm } // namespace walberla