/*******************************************************************************
* This file is part of SWIFT.
* Copyright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk)
* Matthieu Schaller (schaller@strw.leidenuniv.nl)
* 2016 John A. Regan (john.a.regan@durham.ac.uk)
* Tom Theuns (tom.theuns@durham.ac.uk)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Lesser General Public License
* along with this program. If not, see .
*
******************************************************************************/
/* Config parameters. */
/* This object's header. */
#include "timers.h"
/* Some standard headers. */
#include
/* Local includes. */
#include "clocks.h"
#include "error.h"
/* The timers. */
ticks timers[timer_count];
/* Timer names. */
const char* timers_names[timer_count] = {
"none",
"prepare",
"init",
"init_grav",
"drift_part",
"drift_gpart",
"drift_spart",
"drift_bpart",
"kick1",
"kick2",
"timestep",
"end_hydro_force",
"end_grav_force",
"dosort",
"doself_density",
"doself_gradient",
"doself_force",
"doself_limiter",
"doself_stars_density",
"doself_stars_feedback",
"doself_bh_density",
"doself_bh_swallow",
"doself_bh_feedback",
"doself_grav_pp",
"doself_sink_density",
"doself_sink_swallow",
"dopair_density",
"dopair_gradient",
"dopair_force",
"dopair_limiter",
"dopair_stars_density",
"dopair_stars_feedback",
"dopair_bh_density",
"dopair_bh_swallow",
"dopair_bh_feedback",
"dopair_grav_mm",
"dopair_grav_pp",
"dopair_sink_density",
"dopair_sink_swallow",
"dograv_external",
"dograv_down",
"dograv_mesh",
"dograv_top_level",
"dograv_long_range",
"dosub_self_density",
"dosub_self_gradient",
"dosub_self_force",
"dosub_self_limiter",
"dosub_self_stars_density",
"dosub_self_stars_feedback",
"dosub_self_bh_density",
"dosub_self_bh_swallow",
"dosub_self_bh_feedback",
"dosub_self_grav",
"dosub_self_sink_density",
"dosub_self_sink_swallow",
"dosub_pair_density",
"dosub_pair_gradient",
"dosub_pair_force",
"dosub_pair_limiter",
"dosub_pair_stars_density",
"dosub_pair_stars_feedback",
"dosub_pair_bh_density",
"dosub_pair_bh_swallow",
"dosub_pair_bh_feedback",
"dosub_pair_grav",
"dosub_pair_sink_density",
"dosub_pair_sink_swallow",
"doself_subset",
"dopair_subset",
"dopair_subset_naive",
"dosub_subset",
"do_ghost",
"do_extra_ghost",
"do_stars_ghost",
"do_black_holes_ghost",
"do_sinks_ghost",
"dorecv_part",
"dorecv_gpart",
"dorecv_spart",
"dorecv_bpart",
"do_limiter",
"do_cooling",
"do_star_formation",
"do_star_evol",
"gettask",
"qget",
"qsteal",
"locktree",
"runners",
"step",
"csds",
"do_stars_sort",
"do_stars_resort",
"fof_self",
"fof_pair",
"drift_sink",
"rt_ghost1",
"rt_ghost2",
"doself_rt_gradient",
"dopair_rt_gradient",
"dosub_self_rt_gradient",
"dosub_pair_rt_gradient",
"doself_rt_transport",
"dopair_rt_transport",
"dosub_self_rt_transport",
"dosub_pair_rt_transport",
"rt_tchem",
"rt_advance_cell_time",
"rt_collect_times",
"do_sync",
"neutrino_weighting",
};
/* File to store the timers */
static FILE* timers_file;
/**
* @brief Re-set all the timers.
*
*/
void timers_reset_all(void) {
for (int k = 0; k < timer_count; k++) timers[k] = 0;
}
/**
* @brief Outputs all the timers to the timers dump file.
*
* @param step The current step.
*/
void timers_print(int step) {
fprintf(timers_file, "%d\t", step);
for (int k = 0; k < timer_count; k++)
fprintf(timers_file, "%25.3f ", clocks_from_ticks(timers[k]));
fprintf(timers_file, "\n");
fflush(timers_file);
}
/**
* @brief Opens the file to contain the timers info and print a header
*
* @param rank The MPI rank of the file.
*/
void timers_open_file(int rank) {
char buff[100];
sprintf(buff, "timers_%d.txt", rank);
timers_file = fopen(buff, "w");
if (timers_file == NULL) error("Could not create file '%s'.", buff);
fprintf(timers_file, "# timers: \n# step |");
for (int k = 0; k < timer_count; k++)
fprintf(timers_file, "%25s ", timers_names[k]);
fprintf(timers_file, "\n");
}
/**
* @brief Close the file containing the timer info.
*/
void timers_close_file(void) { fclose(timers_file); }