222 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			222 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2003, 2007-14 Matteo Frigo
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The following statement of license applies *only* to this header file,
							 | 
						||
| 
								 | 
							
								 * and *not* to the other files distributed with FFTW or derived therefrom:
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * Redistribution and use in source and binary forms, with or without
							 | 
						||
| 
								 | 
							
								 * modification, are permitted provided that the following conditions
							 | 
						||
| 
								 | 
							
								 * are met:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 1. Redistributions of source code must retain the above copyright
							 | 
						||
| 
								 | 
							
								 *    notice, this list of conditions and the following disclaimer.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 2. Redistributions in binary form must reproduce the above copyright
							 | 
						||
| 
								 | 
							
								 *    notice, this list of conditions and the following disclaimer in the
							 | 
						||
| 
								 | 
							
								 *    documentation and/or other materials provided with the distribution.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
							 | 
						||
| 
								 | 
							
								 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
							 | 
						||
| 
								 | 
							
								 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
							 | 
						||
| 
								 | 
							
								 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
							 | 
						||
| 
								 | 
							
								 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
							 | 
						||
| 
								 | 
							
								 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
							 | 
						||
| 
								 | 
							
								 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
							 | 
						||
| 
								 | 
							
								 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
							 | 
						||
| 
								 | 
							
								 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
							 | 
						||
| 
								 | 
							
								 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
							 | 
						||
| 
								 | 
							
								 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/***************************** NOTE TO USERS *********************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *                 THIS IS A HEADER FILE, NOT A MANUAL
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *    If you want to know how to use FFTW, please read the manual,
							 | 
						||
| 
								 | 
							
								 *    online at http://www.fftw.org/doc/ and also included with FFTW.
							 | 
						||
| 
								 | 
							
								 *    For a quick start, see the manual's tutorial section.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   (Reading header files to learn how to use a library is a habit
							 | 
						||
| 
								 | 
							
								 *    stemming from code lacking a proper manual.  Arguably, it's a
							 | 
						||
| 
								 | 
							
								 *    *bad* habit in most cases, because header files can contain
							 | 
						||
| 
								 | 
							
								 *    interfaces that are not part of the public, stable API.)
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 ****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef FFTW3_MPI_H
							 | 
						||
| 
								 | 
							
								#define FFTW3_MPI_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <fftw3.h>
							 | 
						||
| 
								 | 
							
								#include <mpi.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C"
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#endif /* __cplusplus */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct fftw_mpi_ddim_do_not_use_me {
							 | 
						||
| 
								 | 
							
								     ptrdiff_t n;                     /* dimension size */
							 | 
						||
| 
								 | 
							
								     ptrdiff_t ib;                    /* input block */
							 | 
						||
| 
								 | 
							
								     ptrdiff_t ob;                    /* output block */
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								  huge second-order macro that defines prototypes for all API
							 | 
						||
| 
								 | 
							
								  functions.  We expand this macro for each supported precision
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								  XM: name-mangling macro (MPI)
							 | 
						||
| 
								 | 
							
								  X: name-mangling macro (serial)
							 | 
						||
| 
								 | 
							
								  R: real data type
							 | 
						||
| 
								 | 
							
								  C: complex data type
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_DEFINE_API(XM, X, R, C)			\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								typedef struct fftw_mpi_ddim_do_not_use_me XM(ddim);		\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(init)(void);				\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(cleanup)(void);				\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_many_transposed)		\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t block0, ptrdiff_t block1, MPI_Comm comm,	\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_many)			\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t block0, MPI_Comm comm,				\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_transposed)			\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, MPI_Comm comm,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size)				\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, MPI_Comm comm,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_many_1d)(			\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t n0, ptrdiff_t howmany,				\
							 | 
						||
| 
								 | 
							
								     MPI_Comm comm, int sign, unsigned flags,			\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_ni, ptrdiff_t *local_i_start,		\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_no, ptrdiff_t *local_o_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_1d)(			\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t n0, MPI_Comm comm, int sign, unsigned flags,	\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_ni, ptrdiff_t *local_i_start,		\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_no, ptrdiff_t *local_o_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_2d)(			\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,			\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_2d_transposed)(		\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,			\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_3d)(			\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm,	\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN ptrdiff_t XM(local_size_3d_transposed)(		\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm,	\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
							 | 
						||
| 
								 | 
							
								     ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_many_transpose)			\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1,				\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1,	\
							 | 
						||
| 
								 | 
							
								      R *in, R *out, MPI_Comm comm, unsigned flags);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_transpose)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1,				\
							 | 
						||
| 
								 | 
							
								      R *in, R *out, MPI_Comm comm, unsigned flags);		\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_many_dft)				\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t block, ptrdiff_t tblock, C *in, C *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, int sign, unsigned flags);			\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft)				\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, C *in, C *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, int sign, unsigned flags);			\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_1d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, C *in, C *out,				\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, int sign, unsigned flags);			\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_2d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, C *in, C *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, int sign, unsigned flags);			\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_3d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, C *out,	\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, int sign, unsigned flags);			\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_many_r2r)				\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t iblock, ptrdiff_t oblock, R *in, R *out,	\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags);	\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_r2r)				\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, R *in, R *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags);	\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_r2r_2d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, R *in, R *out, MPI_Comm comm,	\
							 | 
						||
| 
								 | 
							
								      X(r2r_kind) kind0, X(r2r_kind) kind1, unsigned flags);	\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_r2r_3d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,			\
							 | 
						||
| 
								 | 
							
								      R *in, R *out, MPI_Comm comm, X(r2r_kind) kind0,		\
							 | 
						||
| 
								 | 
							
								      X(r2r_kind) kind1, X(r2r_kind) kind2, unsigned flags);	\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_many_dft_r2c)			\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t iblock, ptrdiff_t oblock, R *in, C *out,	\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_r2c)				\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, R *in, C *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_r2c_2d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, R *in, C *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_r2c_3d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R *in, C *out,	\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_many_dft_c2r)			\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
							 | 
						||
| 
								 | 
							
								      ptrdiff_t iblock, ptrdiff_t oblock, C *in, R *out,	\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_c2r)				\
							 | 
						||
| 
								 | 
							
								     (int rnk, const ptrdiff_t *n, C *in, R *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_c2r_2d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, C *in, R *out,		\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN X(plan) XM(plan_dft_c2r_3d)				\
							 | 
						||
| 
								 | 
							
								     (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, R *out,	\
							 | 
						||
| 
								 | 
							
								      MPI_Comm comm, unsigned flags);				\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(gather_wisdom)(MPI_Comm comm_);		\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(broadcast_wisdom)(MPI_Comm comm_);          \
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(execute_dft)(X(plan) p, C *in, C *out);	\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(execute_dft_r2c)(X(plan) p, R *in, C *out);	\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(execute_dft_c2r)(X(plan) p, C *in, R *out);	\
							 | 
						||
| 
								 | 
							
								FFTW_EXTERN void XM(execute_r2r)(X(plan) p, R *in, R *out); 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* end of FFTW_MPI_DEFINE_API macro */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_MANGLE_DOUBLE(name) FFTW_MANGLE_DOUBLE(FFTW_CONCAT(mpi_,name))
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_MANGLE_FLOAT(name) FFTW_MANGLE_FLOAT(FFTW_CONCAT(mpi_,name))
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_MANGLE_LONG_DOUBLE(name) FFTW_MANGLE_LONG_DOUBLE(FFTW_CONCAT(mpi_,name))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_DOUBLE, FFTW_MANGLE_DOUBLE, double, fftw_complex)
							 | 
						||
| 
								 | 
							
								FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_FLOAT, FFTW_MANGLE_FLOAT, float, fftwf_complex)
							 | 
						||
| 
								 | 
							
								FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_LONG_DOUBLE, FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_DEFAULT_BLOCK (0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* MPI-specific flags */
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_SCRAMBLED_IN (1U << 27)
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_SCRAMBLED_OUT (1U << 28)
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_TRANSPOSED_IN (1U << 29)
							 | 
						||
| 
								 | 
							
								#define FFTW_MPI_TRANSPOSED_OUT (1U << 30)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}  /* extern "C" */
							 | 
						||
| 
								 | 
							
								#endif /* __cplusplus */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* FFTW3_MPI_H */
							 |