mpi4py / mpi4py-fft

mpi4py-fft is a Python package for computing Fast Fourier Transforms (FFTs).
Other
50 stars 12 forks source link

using PFFT is causing error, not sure why! #31

Open ahmad681 opened 1 year ago

ahmad681 commented 1 year ago

Hi,

I am following the example as in this thread just to make sure that everything works fine, from mpi4py import MPI from mpi4py_fft import PFFT, newDistArray FFT = PFFT(MPI.COMM_WORLD, [64, 64, 64]) u = newDistArray(FFT, False, rank=1) u_hat = newDistArray(FFT, True, rank=1)

but when I call PFFT(), the following error occurs,

PFFT(MPI.COMM_WORLD, [64, 64, 64]) Traceback (most recent call last): File "", line 1, in File "/home/ahmad68/.conda/envs/kmc/lib/python3.9/site-packages/mpi4py_fft/mpifft.py", line 315, in init xfftn = FFT(pencil.subshape, axes, dtype, padding, backend=backend, File "/home/ahmad68/.conda/envs/kmc/lib/python3.9/site-packages/mpi4py_fft/libfft.py", line 387, in init self.fwd, self.bck = plan(self.shape, self.axes, self.dtype, transforms, kw) File "/home/ahmad68/.conda/envs/kmc/lib/python3.9/site-packages/mpi4py_fft/libfft.py", line 73, in _Xfftn_plan_fftw xfftn_fwd = plan_fwd(U, s=s, axes=axes, threads=threads, flags=flags) File "/home/ahmad68/.conda/envs/kmc/lib/python3.9/site-packages/mpi4py_fft/fftw/xfftn.py", line 239, in rfftn return get_planned_FFT(input_array, output_array, axes, kind, threads, File "/home/ahmad68/.conda/envs/kmc/lib/python3.9/site-packages/mpi4py_fft/fftw/factory.py", line 106, in get_planned_FFT return _fft.FFT(input_array, output_array, axes, kind, threads, flags, File "mpi4py_fft/fftw/fftw_xfftn.pyx", line 153, in mpi4py_fft.fftw.fftw_xfftn.FFT.cinit RuntimeError: Failure creating FFTW plan

thanks a lot,

ahmad681 commented 1 year ago

okay, I need to update this thread here, because I found out something very interesting. For some reason, PFFT is working with 2D arrays, but not in 3D array in the above case.

check out what I did below:

N = np.array([12, 20], dtype=int)

fft = PFFT(MPI.COMM_WORLD, N) fft <mpi4py_fft.mpifft.PFFT object at 0x2b345bf11ca0> u = newDistArray(fft, False) u[:] = np.random.random(u.shape).astype(u.dtype) u DistArray([[4.75179700e-01, 9.00272237e-01, 3.88389825e-02, 4.43223852e-01, 7.23486523e-01, 8.30510648e-01, 7.08455979e-02, 9.33153804e-01, 6.34450773e-01, 1.86274467e-01, 3.69390196e-01, 9.54890093e-01, 1.63599955e-01, 7.22375929e-01, 2.55018437e-01, 2.10975215e-01, 3.07019292e-01, 9.70251033e-01, 2.67878129e-01, 8.08412438e-01], [6.41010458e-01, 1.55316525e-01, 3.92985548e-01, 7.58982528e-01, 1.96172347e-01, 3.23822164e-01, 1.69856368e-01, 9.65051374e-01, 6.30040654e-01, .....

and then use fft, it works just fine!! u_hat = fft.forward(u)

u_hat array([[ 5.11894971e-01+0.00000000e+00j, 4.48722376e-04+3.38932184e-03j, 3.94412372e-03-4.13485466e-03j, -9.87726800e-03+5.53170883e-03j, 2.82209364e-02+3.43406317e-03j, 1.36319628e-02+1.20846741e-02j, 1.65555488e-02+7.51500775e-03j, 6.57208898e-03+3.25532557e-02j, 9.55557523e-03+4.51506201e-03j, -1.87489759e-02-2.10101392e-02j, 2.34454729e-03+0.00000000e+00j], [ 2.61748776e-03+6.02150010e-03j, 1.61801892e-02-3.11565343e-02j, 3.82726088e-03+2.90338948e-03j, 1.59308433e-02+1.27080990e-02j, 1.27047548e-03+1.85205872e-03j, 2.40894550e-02+7.90008996e-04j, -3.67148183e-03-1.58069722e-02j, -1.74244746e-02-8.15838596e-03j, -1.09787065e-02-3.50970431e-03j, 7.52425847e-03+1.20733633e-03j, -1.35393618e-02-5.06389990e-03j], .....

sorry for typing twice here

mikaem commented 1 year ago

Hi I cannot reproduce this error.

ahmad681 commented 1 year ago

Hi Mikael, thanks for the reply. yeah I honestly do not understand what's going on, haha. if it works for you, then maybe it is something that has to do with my envionment. Let me tell you about the environment I am using:

environment: gcc 9.3.0 openmpi 3.1.6 Python 3.9.16 FFTW 3.3.8

packages being used installed via pip: numpy 1.21.5 mpi4py 3.1.3 mpi4py-fft 2.0.5 pyfftw 0.13.1 h5py 3.9.0 h5df5 1.10.6

I also tried to trace the error to the file fftw_xfftn.pyx line 152 i may need your help to understand what this means, maybe I can try to see what's going on from my end and update this thread if I figure it out. in line 152-153 if self._plan == NULL: raise RuntimeError("Failure creating FFTW plan") what does self object refer to, what is _plan? also what does NULL mean? the way I understand FFTW plans is like a pointer that stores the N-D array somehow and FFTW use that informaton to compute the transforms later, correct?

Ahmad