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