From 03fe6cb298fb77f18975f4dfa1dfaff415b06307 Mon Sep 17 00:00:00 2001
From: Chichi Lalescu <clalesc1@jhu.edu>
Date: Fri, 20 Feb 2015 11:59:23 -0500
Subject: [PATCH] use less memory

i.e. use just one temporary arrya for interleave and Morton shuffling.
---
 src/Morton_shuffler.cpp  | 5 +----
 src/Morton_shuffler.hpp  | 5 ++++-
 src/RMHD_converter.cpp   | 2 +-
 src/field_descriptor.cpp | 1 +
 test.ipynb               | 6 +++---
 5 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/Morton_shuffler.cpp b/src/Morton_shuffler.cpp
index 670ce2cf..b771b69b 100644
--- a/src/Morton_shuffler.cpp
+++ b/src/Morton_shuffler.cpp
@@ -55,11 +55,9 @@ Morton_shuffler::~Morton_shuffler()
 
 int Morton_shuffler::shuffle(
         float *a,
+        float *rtmp,
         const char *base_fname)
 {
-    // array where shuffled data will be placed
-    float *rtmp = fftwf_alloc_real(this->drcubbie->local_size);
-
     // shuffle into z order
     ptrdiff_t z, zz;
     int rid, zid;
@@ -125,7 +123,6 @@ int Morton_shuffler::shuffle(
             base_fname,
             this->out_group*this->doutput->sizes[0]);
     this->doutput->write(temp_char, rtmp);
-    fftwf_free(rtmp);
     return EXIT_SUCCESS;
 }
 
diff --git a/src/Morton_shuffler.hpp b/src/Morton_shuffler.hpp
index 3e98ac32..431b437d 100644
--- a/src/Morton_shuffler.hpp
+++ b/src/Morton_shuffler.hpp
@@ -70,7 +70,10 @@ class Morton_shuffler
                 int nfiles);
         ~Morton_shuffler();
 
-        int shuffle(float *a, const char *base_fname);
+        int shuffle(
+                float *regular_data,
+                float *shuffled_data,
+                const char *base_fname);
 };
 
 #endif//MORTON_SHUFFLER
diff --git a/src/RMHD_converter.cpp b/src/RMHD_converter.cpp
index d368980d..3f8e1749 100644
--- a/src/RMHD_converter.cpp
+++ b/src/RMHD_converter.cpp
@@ -133,7 +133,7 @@ int RMHD_converter::convert(
     // mix components
     this->f3r->interleave(this->r3, rtmp, 2);
 
-    this->s->shuffle(rtmp, ofile);
+    this->s->shuffle(rtmp, this->r3, ofile);
 
     fftwf_free(rtmp);
     return EXIT_SUCCESS;
diff --git a/src/field_descriptor.cpp b/src/field_descriptor.cpp
index df101d1b..df6fe39d 100644
--- a/src/field_descriptor.cpp
+++ b/src/field_descriptor.cpp
@@ -232,6 +232,7 @@ int field_descriptor::interleave(
         float *output,
         int dim)
 {
+    // TODO: implement inplace interleaver
     for (int k = 0; k < this->local_size; k++)
         for (int j = 0; j < dim; j++)
                 output[k*dim + j] = input[j*this->local_size + k];
diff --git a/test.ipynb b/test.ipynb
index da3b33fc..8a3ffb29 100644
--- a/test.ipynb
+++ b/test.ipynb
@@ -1,7 +1,7 @@
 {
  "metadata": {
   "name": "",
-  "signature": "sha256:3746adfc6567f394973ab357f8a68759f766ba127e0a9a388298c16ebbafbe4e"
+  "signature": "sha256:b66beda6c64119cb0725443436f940cc3d6a7269d12b4d537c8d44881b89be2c"
  },
  "nbformat": 3,
  "nbformat_minor": 0,
@@ -195,7 +195,7 @@
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 5
+     "prompt_number": 23
     },
     {
      "cell_type": "code",
@@ -226,7 +226,7 @@
        ]
       }
      ],
-     "prompt_number": 6
+     "prompt_number": 24
     },
     {
      "cell_type": "code",
-- 
GitLab