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