| cannam@167 | 1 /* | 
| cannam@167 | 2  * Copyright (c) 2003, 2007-14 Matteo Frigo | 
| cannam@167 | 3  * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology | 
| cannam@167 | 4  * | 
| cannam@167 | 5  * This program is free software; you can redistribute it and/or modify | 
| cannam@167 | 6  * it under the terms of the GNU General Public License as published by | 
| cannam@167 | 7  * the Free Software Foundation; either version 2 of the License, or | 
| cannam@167 | 8  * (at your option) any later version. | 
| cannam@167 | 9  * | 
| cannam@167 | 10  * This program is distributed in the hope that it will be useful, | 
| cannam@167 | 11  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| cannam@167 | 12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| cannam@167 | 13  * GNU General Public License for more details. | 
| cannam@167 | 14  * | 
| cannam@167 | 15  * You should have received a copy of the GNU General Public License | 
| cannam@167 | 16  * along with this program; if not, write to the Free Software | 
| cannam@167 | 17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | 
| cannam@167 | 18  * | 
| cannam@167 | 19  */ | 
| cannam@167 | 20 | 
| cannam@167 | 21 #include "ifftw-mpi.h" | 
| cannam@167 | 22 | 
| cannam@167 | 23 /* r2c and c2r transforms.  The sz dtensor, as usual, gives the size | 
| cannam@167 | 24    of the "logical" complex array.  For the last dimension N, however, | 
| cannam@167 | 25    only N/2+1 complex numbers are stored for the complex data.  Moreover, | 
| cannam@167 | 26    for the real data, the last dimension is *always* padded to a size | 
| cannam@167 | 27    2*(N/2+1).  (Contrast this with the serial API, where there is only | 
| cannam@167 | 28    padding for in-place plans.) */ | 
| cannam@167 | 29 | 
| cannam@167 | 30 /* problem.c: */ | 
| cannam@167 | 31 typedef struct { | 
| cannam@167 | 32      problem super; | 
| cannam@167 | 33      dtensor *sz; | 
| cannam@167 | 34      INT vn; /* vector length (vector stride 1) */ | 
| cannam@167 | 35      R *I, *O; /* contiguous interleaved arrays */ | 
| cannam@167 | 36 | 
| cannam@167 | 37      rdft_kind kind; /* assert(kind < DHT) */ | 
| cannam@167 | 38      unsigned flags; /* TRANSPOSED_IN/OUT meaningful for rnk>1 only | 
| cannam@167 | 39 			SCRAMBLED_IN/OUT meaningful for 1d transforms only */ | 
| cannam@167 | 40 | 
| cannam@167 | 41      MPI_Comm comm; | 
| cannam@167 | 42 } problem_mpi_rdft2; | 
| cannam@167 | 43 | 
| cannam@167 | 44 problem *XM(mkproblem_rdft2)(const dtensor *sz, INT vn, | 
| cannam@167 | 45 			     R *I, R *O, MPI_Comm comm, | 
| cannam@167 | 46 			     rdft_kind kind, unsigned flags); | 
| cannam@167 | 47 problem *XM(mkproblem_rdft2_d)(dtensor *sz, INT vn, | 
| cannam@167 | 48 			       R *I, R *O, MPI_Comm comm, | 
| cannam@167 | 49 			       rdft_kind kind, unsigned flags); | 
| cannam@167 | 50 | 
| cannam@167 | 51 /* solve.c: */ | 
| cannam@167 | 52 void XM(rdft2_solve)(const plan *ego_, const problem *p_); | 
| cannam@167 | 53 | 
| cannam@167 | 54 /* plans have same operands as rdft plans, so just re-use */ | 
| cannam@167 | 55 typedef plan_rdft plan_mpi_rdft2; | 
| cannam@167 | 56 #define MKPLAN_MPI_RDFT2(type, adt, apply) \ | 
| cannam@167 | 57   (type *)X(mkplan_rdft)(sizeof(type), adt, apply) | 
| cannam@167 | 58 | 
| cannam@167 | 59 int XM(rdft2_serial_applicable)(const problem_mpi_rdft2 *p); | 
| cannam@167 | 60 | 
| cannam@167 | 61 /* various solvers */ | 
| cannam@167 | 62 void XM(rdft2_rank_geq2_register)(planner *p); | 
| cannam@167 | 63 void XM(rdft2_rank_geq2_transposed_register)(planner *p); | 
| cannam@167 | 64 void XM(rdft2_serial_register)(planner *p); |