26class ALIEN_EXPORT BaseSolverStater
43 virtual ~BaseSolverStater() {}
46 static Real getVirtualTimeCounter() {
return _getVirtualTime(); }
48 static Real getRealTimeCounter() {
return _getRealTime(); }
53 Sentry(Real& time_counter,
bool is_virtual =
false)
54 : m_counter(time_counter)
55 , m_is_virtual(is_virtual)
57 m_start_counter = m_is_virtual ? BaseSolverStater::getVirtualTimeCounter()
58 : BaseSolverStater::getRealTimeCounter();
63 Real end_counter = m_is_virtual ? BaseSolverStater::getVirtualTimeCounter()
64 : BaseSolverStater::getRealTimeCounter();
65 m_counter += end_counter - m_start_counter;
75 static Arccore::Real _getVirtualTime();
77 static Arccore::Real _getRealTime();
79 static void _errorInTimer(
const String& msg,
int retcode);
87 Integer m_suspend_count;
109 m_solver->getSolverStat().reset();
115 void startInitializationMeasure()
117 ALIEN_ASSERT((m_state == eNone), (
"Unexpected SolverStater state %d", m_state));
122 void stopInitializationMeasure()
124 ALIEN_ASSERT((m_state == eInit), (
"Unexpected SolverStater state %d", m_state));
128 auto& solver_stat = m_solver->getSolverStat();
130 solver_stat.m_initialization_cpu_time +=
m_cpu_time;
133 void startPrepareMeasure()
135 ALIEN_ASSERT((m_state == eNone), (
"Unexpected SolverStater state %d", m_state));
140 void suspendPrepareMeasure()
142 ALIEN_ASSERT((m_state == ePrepare), (
"Unexpected SolverStater state %d", m_state));
144 auto& solver_stat = m_solver->getSolverStat();
145 if (m_suspend_count == 0) {
147 solver_stat.m_last_prepare_cpu_time =
m_cpu_time;
151 solver_stat.m_last_prepare_cpu_time +=
m_cpu_time;
157 void stopPrepareMeasure()
159 if (m_state == ePrepare)
160 suspendPrepareMeasure();
161 ALIEN_ASSERT((m_suspend_count > 0), (
"Unexpected suspend count"));
163 auto& solver_stat = m_solver->getSolverStat();
165 solver_stat.m_last_prepare_cpu_time +=
m_cpu_time;
169 solver_stat.m_prepare_time += solver_stat.m_last_prepare_time;
170 solver_stat.m_prepare_cpu_time += solver_stat.m_last_prepare_cpu_time;
173 void startSolveMeasure()
175 ALIEN_ASSERT((m_state == eNone), (
"Unexpected SolverStater state %d", m_state));
180 void stopSolveMeasure()
182 ALIEN_ASSERT((m_state == eSolve), (
"Unexpected SolverStater state %d", m_state));
185 auto const& status = m_solver->getStatus();
186 auto& solver_stat = m_solver->getSolverStat();
188 solver_stat.m_last_solve_cpu_time =
m_cpu_time;
189 solver_stat.m_solve_time += solver_stat.m_last_solve_time;
190 solver_stat.m_solve_cpu_time += solver_stat.m_last_solve_cpu_time;
191 ++solver_stat.m_solve_count;
192 solver_stat.m_last_iteration_count = status.iteration_count;
193 solver_stat.m_iteration_count += solver_stat.m_last_iteration_count;
197 SolverT* m_solver =
nullptr;
202class SolverStatSentry
205 bool m_is_released =
false;
207 BaseSolverStater::eStateType m_state = BaseSolverStater::eNone;
211 : m_solver_stater(parent)
215 case BaseSolverStater::eInit:
216 m_solver_stater.reset();
217 m_solver_stater.startInitializationMeasure();
219 case BaseSolverStater::ePrepare:
220 m_solver_stater.startPrepareMeasure();
222 case BaseSolverStater::eSolve:
223 m_solver_stater.startSolveMeasure();
230 virtual ~SolverStatSentry() { release(); }
237 case BaseSolverStater::eInit:
238 m_solver_stater.stopInitializationMeasure();
240 case BaseSolverStater::ePrepare:
241 m_solver_stater.stopPrepareMeasure();
243 case BaseSolverStater::eSolve:
244 m_solver_stater.stopSolveMeasure();
249 m_is_released =
true;