diff --git a/src/field_descriptor.cpp b/src/field_descriptor.cpp
index a11e81df97eedb3f233606e4cda32d12b2c64059..df101d1b75bd62d8bc7b5ecd00d5b0405bd34045 100644
--- a/src/field_descriptor.cpp
+++ b/src/field_descriptor.cpp
@@ -227,6 +227,17 @@ int field_descriptor::transpose(
     return EXIT_SUCCESS;
 }
 
+int field_descriptor::interleave(
+        float *input,
+        float *output,
+        int dim)
+{
+    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];
+    return EXIT_SUCCESS;
+}
+
 field_descriptor* field_descriptor::get_transpose()
 {
     int n[this->ndims];
diff --git a/src/field_descriptor.hpp b/src/field_descriptor.hpp
index b8e9c36c00cc8d09d4616613a47cbdbff2893fed..920920997019024f713a9262d061dfcb33c065a1 100644
--- a/src/field_descriptor.hpp
+++ b/src/field_descriptor.hpp
@@ -54,6 +54,11 @@ class field_descriptor
                 fftwf_complex *input,
                 fftwf_complex *output = NULL);
 
+        int interleave(
+                float *input,
+                float *output,
+                int dim);
+
         inline int rank(int i0)
         {
             return i0 / this->subsizes[0];