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