diff --git a/src/field_descriptor.cpp b/src/field_descriptor.cpp
index c9ad03e939da168bab92f0364e1e2ca052dd4f71..889ce04035316a692afe0cfbb0ef48acbfabcf9f 100644
--- a/src/field_descriptor.cpp
+++ b/src/field_descriptor.cpp
@@ -154,3 +154,11 @@ int field_descriptor::transpose(
     return EXIT_SUCCESS;
 }
 
+field_descriptor* field_descriptor::get_transpose()
+{
+    int n[this->ndims];
+    for (int i=0; i<this->ndims; i++)
+        n[i] = this->sizes[this->ndims - i - 1];
+    return new field_descriptor(this->ndims, n, this->mpi_dtype);
+}
+
diff --git a/src/field_descriptor.hpp b/src/field_descriptor.hpp
index ea0398e5fe2f05172a814158dbbcb9a8ed2a1859..786423167fdd3034d1d0a93095918e3e3cdf4833 100644
--- a/src/field_descriptor.hpp
+++ b/src/field_descriptor.hpp
@@ -31,6 +31,7 @@ class field_descriptor
         int write(
                 const char *fname,
                 void *buffer);
+        field_descriptor *get_transpose();
         int transpose(
                 float *input,
                 float *output);
diff --git a/src/transp.cpp b/src/transp.cpp
index 3f6c294e6947deb6499ddba8af4aaa79b1f1ce8b..08f0cd4c1c410da14115d5972b5e04d2bb537bc9 100644
--- a/src/transp.cpp
+++ b/src/transp.cpp
@@ -16,26 +16,15 @@ int main(int argc, char *argv[])
         case 3:
             if (myrank == 0)
                 printf("transposing 2D array from \"data0\" into \"data1\" with %d processes.\n", nprocs);
-            // dimensions
             n[0] = atoi(argv[1]);
             n[1] = atoi(argv[2]);
-            f0 = new field_descriptor(2, n, MPI_FLOAT);
-            n[0] = atoi(argv[2]);
-            n[1] = atoi(argv[1]);
-            f1 = new field_descriptor(2, n, MPI_FLOAT);
             break;
         case 4:
             if (myrank == 0)
                 printf("transposing 3D array from \"data0\" into \"data1\" with %d processes.\n", nprocs);
-            // dimensions
             n[0] = atoi(argv[1]);
             n[1] = atoi(argv[2]);
             n[2] = atoi(argv[3]);
-            f0 = new field_descriptor(3, n, MPI_FLOAT);
-            n[0] = atoi(argv[3]);
-            n[1] = atoi(argv[2]);
-            n[2] = atoi(argv[1]);
-            f1 = new field_descriptor(3, n, MPI_FLOAT);
             break;
         default:
             printf("you messed up the parameters, I'm not doing anything.\n");
@@ -43,6 +32,8 @@ int main(int argc, char *argv[])
             return EXIT_SUCCESS;
             break;
     }
+    f0 = new field_descriptor(argc - 1, n, MPI_FLOAT);
+    f1 = f0->get_transpose();
 
     float *a0, *a1;
     a0 = (float*)malloc(f0->local_size*sizeof(float));