def nufft3d1(x,y,z,c,isign,eps,ms,mt,mu,f,debug=0,spread_debug=0,spread_sort=2,fftw=0,modeord=0,chkbnds=1,upsampfac=2.0): """3D type-1 (aka adjoint) complex nonuniform fast Fourier transform :: nj-1 f(k1,k2,k3) = SUM c[j] exp(+/-i (k1 x(j) + k2 y[j] + k3 z[j])), j=0 for -ms/2 <= k1 <= (ms-1)/2, -mt/2 <= k2 <= (mt-1)/2, -mu/2 <= k3 <= (mu-1)/2 Args: x (float[nj]): nonuniform source x-coords, valid only in [-3pi,3pi] y (float[nj]): nonuniform source y-coords, valid only in [-3pi,3pi] z (float[nj]): nonuniform source z-coords, valid only in [-3pi,3pi] c (complex[nj]): source strengths isign (int): if >=0, uses + sign in exponential, otherwise - sign eps (float): precision requested (>1e-16) ms (int): number of Fourier modes in x-direction, may be even or odd; in either case the modes are integers lying in [-ms/2, (ms-1)/2] mt (int): number of Fourier modes in y-direction, may be even or odd; in either case the modes are integers lying in [-mt/2, (mt-1)/2] mu (int): number of Fourier modes in z-direction, may be even or odd; in either case the modes are integers lying in [-mu/2, (mu-1)/2] f (complex[ms,mt,mu]): output Fourier mode values. Should be initialized as a Fortran-ordered (ie ms fastest) numpy array of the correct size debug (int, optional): 0 (silent), 1 (print timing breakdown) spread_debug (int, optional): 0 (silent), 1, 2... (prints spreader info) spread_sort (int, optional): 0 (don't sort NU pts in spreader), 1 (sort), 2 (heuristic decision to sort) fftw (int, optional): 0 (use FFTW_ESTIMATE), 1 (use FFTW_MEASURE) modeord (int, optional): 0 (CMCL increasing mode ordering), 1 (FFT ordering) chkbnds (int, optional): 0 (don't check NU points valid), 1 (do) upsampfac (float): either 2.0 (default), or 1.25 (low RAM & small FFT size) .. note:: The output is written into the f array. Returns: int: 0 if success, 1 if eps too small, 2 if size of arrays to malloc exceed MAX_NF, 4 at least one NU point out of range (if chkbnds true) Example: see ``python_tests/accuracy_speed_tests.py`` """ # f is the output and must have dtype=np.complex128 x=x.astype(np.float64,copy=False) #copies only if type changes y=y.astype(np.float64,copy=False) #copies only if type changes z=z.astype(np.float64,copy=False) #copies only if type changes c=c.astype(np.complex128,copy=False) #copies only if type changes return finufftpy_cpp.finufft3d1_cpp(x,y,z,c,isign,eps,ms,mt,mu,f,debug,spread_debug,spread_sort,fftw,modeord,chkbnds,upsampfac)
def finufft3d1(x, y, z, c, isign, eps, ms, mt, mu, f, debug=0, spread_debug=0, spread_sort=1, fftw=0, modeord=0, chkbnds=1): """3D type-1 (aka adjoint) complex nonuniform fast Fourier transform nj f(k1,k2,k3) = SUM c[j] exp(+/-i (k1 x(j) + k2 y[j] + k3 z[j])), j=1 for -ms/2 <= k1 <= (ms-1)/2, -mt/2 <= k2 <= (mt-1)/2, -mu/2 <= k3 <= (mu-1)/2 Inputs: x (float[nj]): nonuniform source x-coords, valid only in [-3pi,3pi] y (float[nj]): nonuniform source y-coords, valid only in [-3pi,3pi] z (float[nj]): nonuniform source z-coords, valid only in [-3pi,3pi] c (complex[nj]): source strengths isign (int): if >=0, uses + sign in exponential, otherwise - sign. eps (float): precision requested (>1e-16) ms,mt,mu (int): numbers of Fourier modes requested in x-, y-, and z- directions. Each may be even or odd; in either case the modes are integers lying in [-m/2, (m-1)/2] Optional inputs: debug (int): 0 (silent), 1 (print timing breakdown). spread_debug (int): 0 (spreader silent), 1, 2... (print spreader info) spread_sort (int): 0 (don't sort NU pts in spreader), 1 (sort) fftw (int): 0 (use FFTW_ESTIMATE), 1 (use FFTW_MEASURE), ... modeord (int): 0 (CMCL increasing mode ordering), 1 (FFT ordering) chkbnds (int): 0 (don't check NU points valid), 1 (do). Outputs: f (complex[ms,mt,mu]): Fourier mode values, stored ms fastest. mode ordering in each dimension given by modeord. Returns: error status, 0 : success 1 : eps too small 2 : size of arrays to malloc exceed MAX_NF 4 : if chkbnds, at least one NU point out of range Example: see python_tests/accuracy_speed_tests.py """ # f is the output and must have dtype=np.complex128 x = x.astype(np.float64, copy=False) #copies only if type changes y = y.astype(np.float64, copy=False) #copies only if type changes z = z.astype(np.float64, copy=False) #copies only if type changes c = c.astype(np.complex128, copy=False) #copies only if type changes return finufftpy_cpp.finufft3d1_cpp(x, y, z, c, isign, eps, ms, mt, mu, f, debug, spread_debug, spread_sort, fftw, modeord, chkbnds)