diff --git a/bfps/cpp/fftw_interface.hpp b/bfps/cpp/fftw_interface.hpp index 682850c86aa4eb1c6326146459c3671338572542..7d56d3362969dca54b319ba1c90f1b4fa951abf9 100644 --- a/bfps/cpp/fftw_interface.hpp +++ b/bfps/cpp/fftw_interface.hpp @@ -41,6 +41,7 @@ #include <memory> #include <algorithm> #include <cassert> +#include <cstring> #endif template <class realtype> @@ -171,6 +172,7 @@ public: sizeBuffer *= n[rnk-1]+2; c2r_plan.buffer.reset(alloc_real(sizeBuffer)); + memset(c2r_plan.buffer.get(), 0, sizeof(real)*sizeBuffer); // Init the plan c2r_plan.plan_to_use = mpi_plan_dft_c2r(rnk, n, (complex*)c2r_plan.buffer.get(), @@ -178,7 +180,7 @@ public: comm, flags); c2r_plan.nb_real_to_copy = c2r_plan.local_n0/howmany; - c2r_plan.nb_complex_to_copy = c2r_plan.local_n0/howmany; + c2r_plan.nb_complex_to_copy = c2r_plan.local_n1/howmany; for(int idxrnk = 1 ; idxrnk < rnk-1 ; ++idxrnk){ c2r_plan.nb_real_to_copy *= n[idxrnk]; c2r_plan.nb_complex_to_copy *= n[idxrnk]; @@ -229,6 +231,7 @@ public: sizeBuffer *= n[rnk-1]+2; r2c_plan.buffer.reset(alloc_real(sizeBuffer)); + memset(r2c_plan.buffer.get(), 0, sizeof(real)*sizeBuffer); // Init the plan r2c_plan.plan_to_use = mpi_plan_dft_r2c(rnk, n, r2c_plan.buffer.get(), @@ -237,7 +240,7 @@ public: r2c_plan.nb_real_to_copy = r2c_plan.local_n0/howmany; - r2c_plan.nb_complex_to_copy = r2c_plan.local_n0/howmany; + r2c_plan.nb_complex_to_copy = r2c_plan.local_n1/howmany; for(int idxrnk = 1 ; idxrnk < rnk-1 ; ++idxrnk){ r2c_plan.nb_real_to_copy *= n[idxrnk]; r2c_plan.nb_complex_to_copy *= n[idxrnk]; @@ -452,6 +455,7 @@ public: sizeBuffer *= n[rnk-1]+2; c2r_plan.buffer.reset(alloc_real(sizeBuffer)); + memset(c2r_plan.buffer.get(), 0, sizeof(real)*sizeBuffer); // Init the plan c2r_plan.plan_to_use = mpi_plan_dft_c2r(rnk, n, (complex*)c2r_plan.buffer.get(), @@ -459,7 +463,7 @@ public: comm, flags); c2r_plan.nb_real_to_copy = c2r_plan.local_n0/howmany; - c2r_plan.nb_complex_to_copy = c2r_plan.local_n0/howmany; + c2r_plan.nb_complex_to_copy = c2r_plan.local_n1/howmany; for(int idxrnk = 1 ; idxrnk < rnk-1 ; ++idxrnk){ c2r_plan.nb_real_to_copy *= n[idxrnk]; c2r_plan.nb_complex_to_copy *= n[idxrnk]; @@ -510,6 +514,7 @@ public: sizeBuffer *= n[rnk-1]+2; r2c_plan.buffer.reset(alloc_real(sizeBuffer)); + memset(r2c_plan.buffer.get(), 0, sizeof(real)*sizeBuffer); // Init the plan r2c_plan.plan_to_use = mpi_plan_dft_r2c(rnk, n, r2c_plan.buffer.get(), @@ -518,7 +523,7 @@ public: r2c_plan.nb_real_to_copy = r2c_plan.local_n0/howmany; - r2c_plan.nb_complex_to_copy = r2c_plan.local_n0/howmany; + r2c_plan.nb_complex_to_copy = r2c_plan.local_n1/howmany; for(int idxrnk = 1 ; idxrnk < rnk-1 ; ++idxrnk){ r2c_plan.nb_real_to_copy *= n[idxrnk]; r2c_plan.nb_complex_to_copy *= n[idxrnk];