1 /*
2  * Copyright (c) 2003, 2007-14 Matteo Frigo
3  * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
4  *
5  * The following statement of license applies *only* to this header file,
6  * and *not* to the other files distributed with FFTW or derived therefrom:
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
20  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
25  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /***************************** NOTE TO USERS *********************************
33  *
34  *                 THIS IS A HEADER FILE, NOT A MANUAL
35  *
36  *    If you want to know how to use FFTW, please read the manual,
37  *    online at http://www.fftw.org/doc/ and also included with FFTW.
38  *    For a quick start, see the manual's tutorial section.
39  *
40  *   (Reading header files to learn how to use a library is a habit
41  *    stemming from code lacking a proper manual.  Arguably, it's a
42  *    *bad* habit in most cases, because header files can contain
43  *    interfaces that are not part of the public, stable API.)
44  *
45  ****************************************************************************/
46 
47 #ifndef FFTW3_MPI_H
48 #define FFTW3_MPI_H
49 
50 #include <fftw3.h>
51 #include <mpi.h>
52 
53 #ifdef __cplusplus
54 extern "C"
55 {
56 #endif /* __cplusplus */
57 
58 struct fftw_mpi_ddim_do_not_use_me {
59      ptrdiff_t n;                     /* dimension size */
60      ptrdiff_t ib;                    /* input block */
61      ptrdiff_t ob;                    /* output block */
62 };
63 
64 /*
65   huge second-order macro that defines prototypes for all API
66   functions.  We expand this macro for each supported precision
67 
68   XM: name-mangling macro (MPI)
69   X: name-mangling macro (serial)
70   R: real data type
71   C: complex data type
72 */
73 
74 #define FFTW_MPI_DEFINE_API(XM, X, R, C)			\
75 								\
76 typedef struct fftw_mpi_ddim_do_not_use_me XM(ddim);		\
77 								\
78 FFTW_EXTERN void XM(init)(void);				\
79 FFTW_EXTERN void XM(cleanup)(void);				\
80 								\
81 FFTW_EXTERN ptrdiff_t XM(local_size_many_transposed)		\
82      (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
83       ptrdiff_t block0, ptrdiff_t block1, MPI_Comm comm,	\
84       ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
85       ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
86 FFTW_EXTERN ptrdiff_t XM(local_size_many)			\
87      (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
88       ptrdiff_t block0, MPI_Comm comm,				\
89       ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
90 FFTW_EXTERN ptrdiff_t XM(local_size_transposed)			\
91      (int rnk, const ptrdiff_t *n, MPI_Comm comm,		\
92       ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
93       ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
94 FFTW_EXTERN ptrdiff_t XM(local_size)				\
95      (int rnk, const ptrdiff_t *n, MPI_Comm comm,		\
96       ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
97 FFTW_EXTERN ptrdiff_t XM(local_size_many_1d)(			\
98      ptrdiff_t n0, ptrdiff_t howmany,				\
99      MPI_Comm comm, int sign, unsigned flags,			\
100      ptrdiff_t *local_ni, ptrdiff_t *local_i_start,		\
101      ptrdiff_t *local_no, ptrdiff_t *local_o_start);		\
102 FFTW_EXTERN ptrdiff_t XM(local_size_1d)(			\
103      ptrdiff_t n0, MPI_Comm comm, int sign, unsigned flags,	\
104      ptrdiff_t *local_ni, ptrdiff_t *local_i_start,		\
105      ptrdiff_t *local_no, ptrdiff_t *local_o_start);		\
106 FFTW_EXTERN ptrdiff_t XM(local_size_2d)(			\
107      ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,			\
108      ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
109 FFTW_EXTERN ptrdiff_t XM(local_size_2d_transposed)(		\
110      ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,			\
111      ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
112      ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
113 FFTW_EXTERN ptrdiff_t XM(local_size_3d)(			\
114      ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm,	\
115      ptrdiff_t *local_n0, ptrdiff_t *local_0_start);		\
116 FFTW_EXTERN ptrdiff_t XM(local_size_3d_transposed)(		\
117      ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm,	\
118      ptrdiff_t *local_n0, ptrdiff_t *local_0_start,		\
119      ptrdiff_t *local_n1, ptrdiff_t *local_1_start);		\
120 								\
121 FFTW_EXTERN X(plan) XM(plan_many_transpose)			\
122      (ptrdiff_t n0, ptrdiff_t n1,				\
123       ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1,	\
124       R *in, R *out, MPI_Comm comm, unsigned flags);		\
125 FFTW_EXTERN X(plan) XM(plan_transpose)				\
126      (ptrdiff_t n0, ptrdiff_t n1,				\
127       R *in, R *out, MPI_Comm comm, unsigned flags);		\
128 								\
129 FFTW_EXTERN X(plan) XM(plan_many_dft)				\
130      (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
131       ptrdiff_t block, ptrdiff_t tblock, C *in, C *out,		\
132       MPI_Comm comm, int sign, unsigned flags);			\
133 FFTW_EXTERN X(plan) XM(plan_dft)				\
134      (int rnk, const ptrdiff_t *n, C *in, C *out,		\
135       MPI_Comm comm, int sign, unsigned flags);			\
136 FFTW_EXTERN X(plan) XM(plan_dft_1d)				\
137      (ptrdiff_t n0, C *in, C *out,				\
138       MPI_Comm comm, int sign, unsigned flags);			\
139 FFTW_EXTERN X(plan) XM(plan_dft_2d)				\
140      (ptrdiff_t n0, ptrdiff_t n1, C *in, C *out,		\
141       MPI_Comm comm, int sign, unsigned flags);			\
142 FFTW_EXTERN X(plan) XM(plan_dft_3d)				\
143      (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, C *out,	\
144       MPI_Comm comm, int sign, unsigned flags);			\
145 								\
146 FFTW_EXTERN X(plan) XM(plan_many_r2r)				\
147      (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
148       ptrdiff_t iblock, ptrdiff_t oblock, R *in, R *out,	\
149       MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags);	\
150 FFTW_EXTERN X(plan) XM(plan_r2r)				\
151      (int rnk, const ptrdiff_t *n, R *in, R *out,		\
152       MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags);	\
153 FFTW_EXTERN X(plan) XM(plan_r2r_2d)				\
154      (ptrdiff_t n0, ptrdiff_t n1, R *in, R *out, MPI_Comm comm,	\
155       X(r2r_kind) kind0, X(r2r_kind) kind1, unsigned flags);	\
156 FFTW_EXTERN X(plan) XM(plan_r2r_3d)				\
157      (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,			\
158       R *in, R *out, MPI_Comm comm, X(r2r_kind) kind0,		\
159       X(r2r_kind) kind1, X(r2r_kind) kind2, unsigned flags);	\
160 								\
161 FFTW_EXTERN X(plan) XM(plan_many_dft_r2c)			\
162      (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
163       ptrdiff_t iblock, ptrdiff_t oblock, R *in, C *out,	\
164       MPI_Comm comm, unsigned flags);				\
165 FFTW_EXTERN X(plan) XM(plan_dft_r2c)				\
166      (int rnk, const ptrdiff_t *n, R *in, C *out,		\
167       MPI_Comm comm, unsigned flags);				\
168 FFTW_EXTERN X(plan) XM(plan_dft_r2c_2d)				\
169      (ptrdiff_t n0, ptrdiff_t n1, R *in, C *out,		\
170       MPI_Comm comm, unsigned flags);				\
171 FFTW_EXTERN X(plan) XM(plan_dft_r2c_3d)				\
172      (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R *in, C *out,	\
173       MPI_Comm comm, unsigned flags);				\
174 								\
175 FFTW_EXTERN X(plan) XM(plan_many_dft_c2r)			\
176      (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,		\
177       ptrdiff_t iblock, ptrdiff_t oblock, C *in, R *out,	\
178       MPI_Comm comm, unsigned flags);				\
179 FFTW_EXTERN X(plan) XM(plan_dft_c2r)				\
180      (int rnk, const ptrdiff_t *n, C *in, R *out,		\
181       MPI_Comm comm, unsigned flags);				\
182 FFTW_EXTERN X(plan) XM(plan_dft_c2r_2d)				\
183      (ptrdiff_t n0, ptrdiff_t n1, C *in, R *out,		\
184       MPI_Comm comm, unsigned flags);				\
185 FFTW_EXTERN X(plan) XM(plan_dft_c2r_3d)				\
186      (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, R *out,	\
187       MPI_Comm comm, unsigned flags);				\
188 								\
189 FFTW_EXTERN void XM(gather_wisdom)(MPI_Comm comm_);		\
190 FFTW_EXTERN void XM(broadcast_wisdom)(MPI_Comm comm_);          \
191 								\
192 FFTW_EXTERN void XM(execute_dft)(X(plan) p, C *in, C *out);	\
193 FFTW_EXTERN void XM(execute_dft_r2c)(X(plan) p, R *in, C *out);	\
194 FFTW_EXTERN void XM(execute_dft_c2r)(X(plan) p, C *in, R *out);	\
195 FFTW_EXTERN void XM(execute_r2r)(X(plan) p, R *in, R *out);
196 
197 
198 
199 /* end of FFTW_MPI_DEFINE_API macro */
200 
201 #define FFTW_MPI_MANGLE_DOUBLE(name) FFTW_MANGLE_DOUBLE(FFTW_CONCAT(mpi_,name))
202 #define FFTW_MPI_MANGLE_FLOAT(name) FFTW_MANGLE_FLOAT(FFTW_CONCAT(mpi_,name))
203 #define FFTW_MPI_MANGLE_LONG_DOUBLE(name) FFTW_MANGLE_LONG_DOUBLE(FFTW_CONCAT(mpi_,name))
204 
205 FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_DOUBLE, FFTW_MANGLE_DOUBLE, double, fftw_complex)
206 FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_FLOAT, FFTW_MANGLE_FLOAT, float, fftwf_complex)
207 FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_LONG_DOUBLE, FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex)
208 
209 #define FFTW_MPI_DEFAULT_BLOCK (0)
210 
211 /* MPI-specific flags */
212 #define FFTW_MPI_SCRAMBLED_IN (1U << 27)
213 #define FFTW_MPI_SCRAMBLED_OUT (1U << 28)
214 #define FFTW_MPI_TRANSPOSED_IN (1U << 29)
215 #define FFTW_MPI_TRANSPOSED_OUT (1U << 30)
216 
217 #ifdef __cplusplus
218 }  /* extern "C" */
219 #endif /* __cplusplus */
220 
221 #endif /* FFTW3_MPI_H */
222