diff --git a/src/engine.c b/src/engine.c index 5d23f431b9ee657cd857118b2cd59de6d842333f..5cf8986f2d26153a58b48e9a965a0a47ece70079 100644 --- a/src/engine.c +++ b/src/engine.c @@ -519,6 +519,8 @@ void engine_step ( struct engine *e , int sort_queues ) { e->step += 1; /* Does the time step need adjusting? */ + if ( e->dt == 0 ) + e->dt = e->dt_orig; while ( dt_min < e->dt ) { e->dt *= 0.5; e->step *= 2; @@ -529,6 +531,9 @@ void engine_step ( struct engine *e , int sort_queues ) { e->step /= 2; printf( "engine_step: dt_min is larger than twice the time step, adjusting to dt=%e.\n" , e->dt ); } + + /* Set the system time. */ + e->time = e->dt * e->step; TIMER_TOC2(timer_step); @@ -553,6 +558,7 @@ void engine_init ( struct engine *e , struct space *s , float dt , int nr_thread cpu_set_t cpuset; #endif int k; + float dt_min = dt; /* Store the values. */ e->s = s; @@ -571,11 +577,16 @@ void engine_init ( struct engine *e , struct space *s , float dt , int nr_thread e->barrier_count = 0; /* Run through the parts and get the minimum time step. */ + e->dt_orig = dt; for ( k = 0 ; k < s->nr_parts ; k++ ) - if ( s->parts[k].dt > 0.0f ) - while ( s->parts[k].dt < dt ) - dt *= 0.5; - e->dt_min = dt; + if ( s->parts[k].dt < dt_min ) + dt_min = s->parts[k].dt; + if ( dt_min == 0.0f ) + dt = 0.0f; + else + while ( dt > dt_min ) + dt *= 0.5f; + e->dt = dt; /* Allocate the queues. */ if ( posix_memalign( (void *)(&e->queues) , 64 , nr_queues * sizeof(struct queue) ) != 0 ) diff --git a/src/engine.h b/src/engine.h index cb96b81510da307fbe0b4c8a55aa5f058041a766..12c3d9d814e57c739e412f672e6e9ad36d22c378 100644 --- a/src/engine.h +++ b/src/engine.h @@ -57,11 +57,14 @@ struct engine { float dt_min; /* The system time step. */ - float dt; + float dt, dt_orig; /* The current step number. */ int step; + /* The current system time. */ + float time; + /* Data for the threads' barrier. */ pthread_mutex_t barrier_mutex; pthread_cond_t barrier_cond;