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