From 4fe80ee1333f14db784fb8ab8fe411d75910278c Mon Sep 17 00:00:00 2001 From: Pedro Gonnet <pedro.gonnet@durham.ac.uk> Date: Sat, 6 Apr 2013 20:08:27 +0000 Subject: [PATCH] more civilized way of dealing with fixed time-steps. Former-commit-id: 3102b06a40327392ec4313bba788536ce71697ec --- src/engine.c | 45 ++++++++++++++++++++++++++------------------- src/engine.h | 1 + src/queue.c | 9 +++------ 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/engine.c b/src/engine.c index 43e3c21b4b..c75ca2e5dd 100644 --- a/src/engine.c +++ b/src/engine.c @@ -411,10 +411,13 @@ void engine_step ( struct engine *e , int sort_queues ) { TIMER_TIC2 /* Get the maximum dt. */ - dt_step = 2.0f*dt; - for ( k = 0 ; k < 32 && (e->step & (1 << k)) == 0 ; k++ ) - dt_step *= 2; - // dt_step = FLT_MAX; + if ( e->policy & engine_policy_fixdt ) + dt_step = FLT_MAX; + else { + dt_step = 2.0f*dt; + for ( k = 0 ; k < 32 && (e->step & (1 << k)) == 0 ; k++ ) + dt_step *= 2; + } /* Set the maximum dt. */ e->dt_step = dt_step; @@ -493,24 +496,28 @@ void engine_step ( struct engine *e , int sort_queues ) { e->step += 1; /* Does the time step need adjusting? */ - if ( e->dt == 0 ) { + if ( e->policy & engine_policy_fixdt ) e->dt = e->dt_orig; - while ( dt_min < e->dt ) - e->dt *= 0.5; - while ( dt_min > 2*e->dt ) - e->dt *= 2.0; - printf( "engine_step: dt_min=%.3e, adjusting time step to dt=%e.\n" , dt_min , e->dt ); - } else { - while ( dt_min < e->dt ) { - e->dt *= 0.5; - e->step *= 2; - printf( "engine_step: dt_min dropped below time step, adjusting to dt=%e.\n" , e->dt ); + if ( e->dt == 0 ) { + e->dt = e->dt_orig; + while ( dt_min < e->dt ) + e->dt *= 0.5; + while ( dt_min > 2*e->dt ) + e->dt *= 2.0; + printf( "engine_step: dt_min=%.3e, adjusting time step to dt=%e.\n" , dt_min , e->dt ); } - while ( dt_min > 2*e->dt && (e->step & 1) == 0 ) { - e->dt *= 2.0; - e->step /= 2; - printf( "engine_step: dt_min is larger than twice the time step, adjusting to dt=%e.\n" , e->dt ); + else { + while ( dt_min < e->dt ) { + e->dt *= 0.5; + e->step *= 2; + printf( "engine_step: dt_min dropped below time step, adjusting to dt=%e.\n" , e->dt ); + } + while ( dt_min > 2*e->dt && (e->step & 1) == 0 ) { + e->dt *= 2.0; + e->step /= 2; + printf( "engine_step: dt_min is larger than twice the time step, adjusting to dt=%e.\n" , e->dt ); + } } } diff --git a/src/engine.h b/src/engine.h index 12c3d9d814..5d332ad88a 100644 --- a/src/engine.h +++ b/src/engine.h @@ -25,6 +25,7 @@ #define engine_policy_steal 2 #define engine_policy_keep 4 #define engine_policy_block 8 +#define engine_policy_fixdt 16 #define engine_queue_scale 1.2 diff --git a/src/queue.c b/src/queue.c index e1a41a9b73..664011f170 100644 --- a/src/queue.c +++ b/src/queue.c @@ -89,17 +89,14 @@ int queue_counter[ queue_counter_count ]; void queue_insert ( struct queue *q , struct task *t ) { - int k; - /* Lock the queue. */ if ( lock_lock( &q->lock ) != 0 ) error( "Failed to get queue lock." ); - /* Bubble-up the tasks. */ - for ( k = q->count ; k > q->next ; k-- ) - q->tid[k] = q->tid[k-1]; - q->tid[ q->next ] = t - q->tasks; + /* Swap next task to end. */ + q->tid[ q->count ] = q->tid[ q->next ]; q->count += 1; + q->tid[ q->next ] = t - q->tasks; q->next += 1; /* Unlock the queue. */ -- GitLab