From 0025151f51e76298ecca20c2e46aea92350a12d3 Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <pedro.gonnet@durham.ac.uk>
Date: Thu, 30 Aug 2012 22:24:49 +0000
Subject: [PATCH] make sorting more memory-efficient.

Former-commit-id: 0b8d1b961353602dc0ec66a399cd1c4a7efb8f4c
---
 runner.c | 75 ++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 48 insertions(+), 27 deletions(-)

diff --git a/runner.c b/runner.c
index 094886251d..05c0d13e72 100644
--- a/runner.c
+++ b/runner.c
@@ -882,7 +882,7 @@ void runner_dosort ( struct runner_thread *rt , struct cell *c , int flags ) {
     int j, k, count = c->count;
     int cone, ctwo;
     int i, ind, off[8], inds[8], temp_i;
-    float shift[3];
+    // float shift[3];
     float buff[8];
     struct cell *temp_c;
     TIMER_TIC
@@ -997,36 +997,57 @@ void runner_dosort ( struct runner_thread *rt , struct cell *c , int flags ) {
     
         } /* progeny? */
         
+    /* Otherwise, just sort. */
+    // else {
+    // 
+    //     /* Loop over the different cell axes. */
+    //     for ( j = 0 ; j < 13 ; j++ ) {
+    //     
+    //         /* Has this sort array been flagged? */
+    //         if ( !( flags & (1 << j) ) )
+    //             continue;
+    //     
+    //         /* Get the shift vector. */
+    //         shift[0] = runner_shift[ 3*j + 0 ];
+    //         shift[1] = runner_shift[ 3*j + 1 ];
+    //         shift[2] = runner_shift[ 3*j + 2 ];
+    //         
+    //         /* Fill the sort array. */
+    //         finger = &c->sort[ j*(count + 1) ];
+    //         for ( k = 0 ; k < count ; k++ ) {
+    //             finger[k].i = k;
+    //             finger[k].d = parts[k].x[0]*shift[0] + parts[k].x[1]*shift[1] + parts[k].x[2]*shift[2];
+    //             }
+    //             
+    //         /* Add the sentinel. */
+    //         finger[ c->count ].d = FLT_MAX;
+    //         finger[ c->count ].i = 0;
+    //             
+    //         /* Sort descending. */
+    //         runner_dosort_ascending( finger , c->count );
+    //     
+    //         }
+    //         
+    //     }
+        
     /* Otherwise, just sort. */
     else {
     
-        /* Loop over the different cell axes. */
-        for ( j = 0 ; j < 13 ; j++ ) {
-        
-            /* Has this sort array been flagged? */
-            if ( !( flags & (1 << j) ) )
-                continue;
-        
-            /* Get the shift vector. */
-            shift[0] = runner_shift[ 3*j + 0 ];
-            shift[1] = runner_shift[ 3*j + 1 ];
-            shift[2] = runner_shift[ 3*j + 2 ];
-            
-            /* Fill the sort array. */
-            finger = &c->sort[ j*(count + 1) ];
-            for ( k = 0 ; k < count ; k++ ) {
-                finger[k].i = k;
-                finger[k].d = parts[k].x[0]*shift[0] + parts[k].x[1]*shift[1] + parts[k].x[2]*shift[2];
+        /* Fill the sort array. */
+        for ( k = 0 ; k < count ; k++ )
+            for ( j = 0 ; j < 13 ; j++ )
+                if ( flags & (1 << j) ) {
+                    c->sort[ j*(count + 1) + k].i = k;
+                    c->sort[ j*(count + 1) + k].d = parts[k].x[0]*runner_shift[ 3*j + 0 ] + parts[k].x[1]*runner_shift[ 3*j + 1 ] + parts[k].x[2]*runner_shift[ 3*j + 2 ];
+                    }
+
+        /* Add the sentinel and sort. */
+        for ( j = 0 ; j < 13 ; j++ )
+            if ( flags & (1 << j) ) {
+                c->sort[ j*(count + 1) + c->count ].d = FLT_MAX;
+                c->sort[ j*(count + 1) + c->count ].i = 0;
+                runner_dosort_ascending( &c->sort[ j*(count + 1) ] , c->count );
                 }
-                
-            /* Add the sentinel. */
-            finger[ c->count ].d = FLT_MAX;
-            finger[ c->count ].i = 0;
-                
-            /* Sort descending. */
-            runner_dosort_ascending( finger , c->count );
-        
-            }
             
         }
         
-- 
GitLab