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)
Exemple #2
0
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)