diff --git a/src/engine.c b/src/engine.c index 272d5c0c9ff07b98befed3c68810d4c909e78c57..d842f4835c51b29f9b017867c30e12ee78df5d32 100644 --- a/src/engine.c +++ b/src/engine.c @@ -28,6 +28,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <time.h> #include <unistd.h> #include <stdbool.h> @@ -1464,6 +1465,29 @@ void engine_init_particles(struct engine *e) { e->step = -1; } + +/** + * brief Get difference in milli-seconds between two timespecs. + * + * @param start the start time. + * @param end the end time. + * + * @return the difference in milli-secinds. + */ +static double time_diff(struct timespec start, struct timespec end) +{ + struct timespec temp; + if ((end.tv_nsec-start.tv_nsec)<0) { + temp.tv_sec = end.tv_sec-start.tv_sec-1; + temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; + } else { + temp.tv_sec = end.tv_sec-start.tv_sec; + temp.tv_nsec = end.tv_nsec-start.tv_nsec; + } + return (double)temp.tv_sec*1000.0 + (double)temp.tv_nsec*1.0E-6; +} + + /** * @brief Let the #engine loose to compute the forces. * @@ -1482,6 +1506,9 @@ void engine_step(struct engine *e) { TIMER_TIC2; + struct timespec time1, time2; + clock_gettime(CLOCK_REALTIME, &time1); + /* Collect the cell data. */ for (k = 0; k < s->nr_cells; k++) if (s->cells[k].nodeID == e->nodeID) { @@ -1553,8 +1580,8 @@ void engine_step(struct engine *e) { if (e->nodeID == 0) { /* Print some information to the screen */ - printf("%d %e %e %d %.3f\n", e->step, e->time, e->timeStep, updates, - e->wallclock_time); + printf("%d %e %e %d %.3f %.3f\n", e->step, e->time, e->timeStep, updates, + e->wallclock_time, e->wallclock_time_ticks); fflush(stdout); /* Write some energy statistics */ @@ -1620,7 +1647,11 @@ void engine_step(struct engine *e) { TIMER_TOC2(timer_step); - e->wallclock_time = ((double)timers[timer_count - 1]) / CPU_TPS * 1000; + clock_gettime(CLOCK_REALTIME, &time2); + + e->wallclock_time_ticks = ((double)timers[timer_count - 1]) / CPU_TPS * 1000; + + e->wallclock_time = (float) time_diff(time1, time2); // printParticle(e->s->parts, e->s->xparts,1000, e->s->nr_parts); // printParticle(e->s->parts, e->s->xparts,515050, e->s->nr_parts); } diff --git a/src/engine.h b/src/engine.h index 13c7ec40612713d3771543150763da6924144c1a..bba53092e2d77d05cc576d948b2f3b3e4cd0152f 100644 --- a/src/engine.h +++ b/src/engine.h @@ -147,6 +147,7 @@ struct engine { /* Wallclock time of the last time-step */ float wallclock_time; + float wallclock_time_ticks; /* Force the engine to rebuild? */ int forcerebuild;