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));