diff --git a/src/field_descriptor.cpp b/src/field_descriptor.cpp
index 7c1cd5f7b39c1a90796f492b8d5572022206c683..f450f9543e463cd11c2932368d0aac19c2b1bf19 100644
--- a/src/field_descriptor.cpp
+++ b/src/field_descriptor.cpp
@@ -148,37 +148,28 @@ int field_descriptor::transpose(
     // for 3D transposition, the input data is messed up
     fftwf_plan tplan;
     ptrdiff_t dim1;
-    switch (this->ndims)
+    if (this->ndims == 3)
     {
-        case 2:
-            dim1 = this->sizes[1];
-            break;
-        case 3:
-            // transpose the two local dimensions 1 and 2
-            dim1 = this->sizes[1]*this->sizes[2];
-            float *atmp;
-            atmp = (float*)malloc(dim1*sizeof(float));
-            for (int k = 0; k < this->subsizes[0]; k++)
-            {
-                // put transposed slice in atmp
-                for (int j = 0; j < this->sizes[1]; j++)
-                    for (int i = 0; i < this->sizes[2]; i++)
-                        atmp[i*this->sizes[1] + j] =
-                            input[(k*this->sizes[1] + j)*this->sizes[2] + i];
-                // copy back transposed slice
-                for (int j = 0; j < this->sizes[2]; j++)
-                    for (int i = 0; i < this->sizes[1]; i++)
-                        input[(k*this->sizes[2] + j)*this->sizes[1] + i] =
-                            atmp[j*this->sizes[1] + i];
-            }
-            free(atmp);
-            break;
-        default:
-            return EXIT_FAILURE;
-            break;
+        // transpose the two local dimensions 1 and 2
+        float *atmp;
+        atmp = fftwf_alloc_real(this->slice_size);
+        for (int k = 0; k < this->subsizes[0]; k++)
+        {
+            // put transposed slice in atmp
+            for (int j = 0; j < this->sizes[1]; j++)
+                for (int i = 0; i < this->sizes[2]; i++)
+                    atmp[i*this->sizes[1] + j] =
+                        input[(k*this->sizes[1] + j)*this->sizes[2] + i];
+            // copy back transposed slice
+            std::copy(
+                    atmp,
+                    atmp + this->slice_size,
+                    input + k*this->slice_size);
+        }
+        fftwf_free(atmp);
     }
     tplan = fftwf_mpi_plan_transpose(
-            this->sizes[0], dim1,
+            this->sizes[0], this->slice_size,
             input, output,
             this->comm,
             FFTW_ESTIMATE);
diff --git a/test.ipynb b/test.ipynb
index 23c546cd9bf40a49e4f81bd0fcc07f3f2cd6d554..6d762e04551052ab9d8c7e7f9b7080c5cf5304c5 100644
--- a/test.ipynb
+++ b/test.ipynb
@@ -1,7 +1,7 @@
 {
  "metadata": {
   "name": "",
-  "signature": "sha256:e257a2ed63efdfaaad53572bf411ce350bc2da0748cbff2374ba511f3a837cbc"
+  "signature": "sha256:9cf3a6ad81b4021d61957c3d2805faad24a447da957672fc0268ff9b398c6dee"
  },
  "nbformat": 3,
  "nbformat_minor": 0,
@@ -187,7 +187,7 @@
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 51
+     "prompt_number": 54
     },
     {
      "cell_type": "code",
@@ -215,11 +215,11 @@
        "output_type": "stream",
        "stream": "stdout",
        "text": [
-        "3.09944e-06\n"
+        "2.86102e-06\n"
        ]
       }
      ],
-     "prompt_number": 52
+     "prompt_number": 55
     },
     {
      "cell_type": "code",