annotate Lib/fftw-3.2.1/api/.svn/text-base/f77funcs.h.svn-base @ 9:262e084a15a9

Vectorised everything and made use of unique_ptr so there should be no more memory leaks. Hurrah for RAII
author Geogaddi\David <d.m.ronan@qmul.ac.uk>
date Wed, 12 Aug 2015 22:25:06 +0100
parents 25bf17994ef1
children
rev   line source
d@0 1 /*
d@0 2 * Copyright (c) 2003, 2007-8 Matteo Frigo
d@0 3 * Copyright (c) 2003, 2007-8 Massachusetts Institute of Technology
d@0 4 *
d@0 5 * This program is free software; you can redistribute it and/or modify
d@0 6 * it under the terms of the GNU General Public License as published by
d@0 7 * the Free Software Foundation; either version 2 of the License, or
d@0 8 * (at your option) any later version.
d@0 9 *
d@0 10 * This program is distributed in the hope that it will be useful,
d@0 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d@0 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d@0 13 * GNU General Public License for more details.
d@0 14 *
d@0 15 * You should have received a copy of the GNU General Public License
d@0 16 * along with this program; if not, write to the Free Software
d@0 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
d@0 18 *
d@0 19 */
d@0 20
d@0 21 /* Functions in the FFTW Fortran API, mangled according to the
d@0 22 F77(...) macro. This file is designed to be #included by
d@0 23 f77api.c, possibly multiple times in order to support multiple
d@0 24 compiler manglings (via redefinition of F77). */
d@0 25
d@0 26 FFTW_VOIDFUNC F77(execute, EXECUTE)(X(plan) * const p)
d@0 27 WITH_ALIGNED_STACK({
d@0 28 plan *pln = (*p)->pln;
d@0 29 pln->adt->solve(pln, (*p)->prb);
d@0 30 })
d@0 31
d@0 32 FFTW_VOIDFUNC F77(destroy_plan, DESTROY_PLAN)(X(plan) *p)
d@0 33 {
d@0 34 X(destroy_plan)(*p);
d@0 35 }
d@0 36
d@0 37 FFTW_VOIDFUNC F77(cleanup, CLEANUP)(void)
d@0 38 {
d@0 39 X(cleanup)();
d@0 40 }
d@0 41
d@0 42 FFTW_VOIDFUNC F77(forget_wisdom, FORGET_WISDOM)(void)
d@0 43 {
d@0 44 X(forget_wisdom)();
d@0 45 }
d@0 46
d@0 47 FFTW_VOIDFUNC F77(export_wisdom, EXPORT_WISDOM)(void (*f77_write_char)(char *, void *),
d@0 48 void *data)
d@0 49 {
d@0 50 write_char_data ad;
d@0 51 ad.f77_write_char = f77_write_char;
d@0 52 ad.data = data;
d@0 53 X(export_wisdom)(write_char, (void *) &ad);
d@0 54 }
d@0 55
d@0 56 FFTW_VOIDFUNC F77(import_wisdom, IMPORT_WISDOM)(int *isuccess,
d@0 57 void (*f77_read_char)(int *, void *),
d@0 58 void *data)
d@0 59 {
d@0 60 read_char_data ed;
d@0 61 ed.f77_read_char = f77_read_char;
d@0 62 ed.data = data;
d@0 63 *isuccess = X(import_wisdom)(read_char, (void *) &ed);
d@0 64 }
d@0 65
d@0 66 FFTW_VOIDFUNC F77(import_system_wisdom, IMPORT_SYSTEM_WISDOM)(int *isuccess)
d@0 67 {
d@0 68 *isuccess = X(import_system_wisdom)();
d@0 69 }
d@0 70
d@0 71 FFTW_VOIDFUNC F77(print_plan, PRINT_PLAN)(X(plan) * const p)
d@0 72 {
d@0 73 X(print_plan)(*p);
d@0 74 fflush(stdout);
d@0 75 }
d@0 76
d@0 77 FFTW_VOIDFUNC F77(flops,FLOPS)(X(plan) *p, double *add, double *mul, double *fma)
d@0 78 {
d@0 79 X(flops)(*p, add, mul, fma);
d@0 80 }
d@0 81
d@0 82 /******************************** DFT ***********************************/
d@0 83
d@0 84 FFTW_VOIDFUNC F77(plan_dft, PLAN_DFT)(X(plan) *p, int *rank, const int *n,
d@0 85 C *in, C *out, int *sign, int *flags)
d@0 86 {
d@0 87 int *nrev = reverse_n(*rank, n);
d@0 88 *p = X(plan_dft)(*rank, nrev, in, out, *sign, *flags);
d@0 89 X(ifree0)(nrev);
d@0 90 }
d@0 91
d@0 92 FFTW_VOIDFUNC F77(plan_dft_1d, PLAN_DFT_1D)(X(plan) *p, int *n, C *in, C *out,
d@0 93 int *sign, int *flags)
d@0 94 {
d@0 95 *p = X(plan_dft_1d)(*n, in, out, *sign, *flags);
d@0 96 }
d@0 97
d@0 98 FFTW_VOIDFUNC F77(plan_dft_2d, PLAN_DFT_2D)(X(plan) *p, int *nx, int *ny,
d@0 99 C *in, C *out, int *sign, int *flags)
d@0 100 {
d@0 101 *p = X(plan_dft_2d)(*ny, *nx, in, out, *sign, *flags);
d@0 102 }
d@0 103
d@0 104 FFTW_VOIDFUNC F77(plan_dft_3d, PLAN_DFT_3D)(X(plan) *p, int *nx, int *ny, int *nz,
d@0 105 C *in, C *out,
d@0 106 int *sign, int *flags)
d@0 107 {
d@0 108 *p = X(plan_dft_3d)(*nz, *ny, *nx, in, out, *sign, *flags);
d@0 109 }
d@0 110
d@0 111 FFTW_VOIDFUNC F77(plan_many_dft, PLAN_MANY_DFT)(X(plan) *p, int *rank, const int *n,
d@0 112 int *howmany,
d@0 113 C *in, const int *inembed,
d@0 114 int *istride, int *idist,
d@0 115 C *out, const int *onembed,
d@0 116 int *ostride, int *odist,
d@0 117 int *sign, int *flags)
d@0 118 {
d@0 119 int *nrev = reverse_n(*rank, n);
d@0 120 int *inembedrev = reverse_n(*rank, inembed);
d@0 121 int *onembedrev = reverse_n(*rank, onembed);
d@0 122 *p = X(plan_many_dft)(*rank, nrev, *howmany,
d@0 123 in, inembedrev, *istride, *idist,
d@0 124 out, onembedrev, *ostride, *odist,
d@0 125 *sign, *flags);
d@0 126 X(ifree0)(onembedrev);
d@0 127 X(ifree0)(inembedrev);
d@0 128 X(ifree0)(nrev);
d@0 129 }
d@0 130
d@0 131 FFTW_VOIDFUNC F77(plan_guru_dft, PLAN_GURU_DFT)(X(plan) *p, int *rank, const int *n,
d@0 132 const int *is, const int *os,
d@0 133 int *howmany_rank, const int *h_n,
d@0 134 const int *h_is, const int *h_os,
d@0 135 C *in, C *out, int *sign, int *flags)
d@0 136 {
d@0 137 X(iodim) *dims = make_dims(*rank, n, is, os);
d@0 138 X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os);
d@0 139 *p = X(plan_guru_dft)(*rank, dims, *howmany_rank, howmany_dims,
d@0 140 in, out, *sign, *flags);
d@0 141 X(ifree0)(howmany_dims);
d@0 142 X(ifree0)(dims);
d@0 143 }
d@0 144
d@0 145 FFTW_VOIDFUNC F77(plan_guru_split_dft, PLAN_GURU_SPLIT_DFT)(X(plan) *p, int *rank, const int *n,
d@0 146 const int *is, const int *os,
d@0 147 int *howmany_rank, const int *h_n,
d@0 148 const int *h_is, const int *h_os,
d@0 149 R *ri, R *ii, R *ro, R *io, int *flags)
d@0 150 {
d@0 151 X(iodim) *dims = make_dims(*rank, n, is, os);
d@0 152 X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os);
d@0 153 *p = X(plan_guru_split_dft)(*rank, dims, *howmany_rank, howmany_dims,
d@0 154 ri, ii, ro, io, *flags);
d@0 155 X(ifree0)(howmany_dims);
d@0 156 X(ifree0)(dims);
d@0 157 }
d@0 158
d@0 159 FFTW_VOIDFUNC F77(execute_dft, EXECUTE_DFT)(X(plan) * const p, C *in, C *out)
d@0 160 WITH_ALIGNED_STACK({
d@0 161 plan_dft *pln = (plan_dft *) (*p)->pln;
d@0 162 if ((*p)->sign == FFT_SIGN)
d@0 163 pln->apply((plan *) pln, in[0], in[0]+1, out[0], out[0]+1);
d@0 164 else
d@0 165 pln->apply((plan *) pln, in[0]+1, in[0], out[0]+1, out[0]);
d@0 166 })
d@0 167
d@0 168 FFTW_VOIDFUNC F77(execute_split_dft, EXECUTE_SPLIT_DFT)(X(plan) * const p,
d@0 169 R *ri, R *ii, R *ro, R *io)
d@0 170 WITH_ALIGNED_STACK({
d@0 171 plan_dft *pln = (plan_dft *) (*p)->pln;
d@0 172 pln->apply((plan *) pln, ri, ii, ro, io);
d@0 173 })
d@0 174
d@0 175 /****************************** DFT r2c *********************************/
d@0 176
d@0 177 FFTW_VOIDFUNC F77(plan_dft_r2c, PLAN_DFT_R2C)(X(plan) *p, int *rank, const int *n,
d@0 178 R *in, C *out, int *flags)
d@0 179 {
d@0 180 int *nrev = reverse_n(*rank, n);
d@0 181 *p = X(plan_dft_r2c)(*rank, nrev, in, out, *flags);
d@0 182 X(ifree0)(nrev);
d@0 183 }
d@0 184
d@0 185 FFTW_VOIDFUNC F77(plan_dft_r2c_1d, PLAN_DFT_R2C_1D)(X(plan) *p, int *n, R *in, C *out,
d@0 186 int *flags)
d@0 187 {
d@0 188 *p = X(plan_dft_r2c_1d)(*n, in, out, *flags);
d@0 189 }
d@0 190
d@0 191 FFTW_VOIDFUNC F77(plan_dft_r2c_2d, PLAN_DFT_R2C_2D)(X(plan) *p, int *nx, int *ny,
d@0 192 R *in, C *out, int *flags)
d@0 193 {
d@0 194 *p = X(plan_dft_r2c_2d)(*ny, *nx, in, out, *flags);
d@0 195 }
d@0 196
d@0 197 FFTW_VOIDFUNC F77(plan_dft_r2c_3d, PLAN_DFT_R2C_3D)(X(plan) *p,
d@0 198 int *nx, int *ny, int *nz,
d@0 199 R *in, C *out,
d@0 200 int *flags)
d@0 201 {
d@0 202 *p = X(plan_dft_r2c_3d)(*nz, *ny, *nx, in, out, *flags);
d@0 203 }
d@0 204
d@0 205 FFTW_VOIDFUNC F77(plan_many_dft_r2c, PLAN_MANY_DFT_R2C)(
d@0 206 X(plan) *p, int *rank, const int *n,
d@0 207 int *howmany,
d@0 208 R *in, const int *inembed, int *istride, int *idist,
d@0 209 C *out, const int *onembed, int *ostride, int *odist,
d@0 210 int *flags)
d@0 211 {
d@0 212 int *nrev = reverse_n(*rank, n);
d@0 213 int *inembedrev = reverse_n(*rank, inembed);
d@0 214 int *onembedrev = reverse_n(*rank, onembed);
d@0 215 *p = X(plan_many_dft_r2c)(*rank, nrev, *howmany,
d@0 216 in, inembedrev, *istride, *idist,
d@0 217 out, onembedrev, *ostride, *odist,
d@0 218 *flags);
d@0 219 X(ifree0)(onembedrev);
d@0 220 X(ifree0)(inembedrev);
d@0 221 X(ifree0)(nrev);
d@0 222 }
d@0 223
d@0 224 FFTW_VOIDFUNC F77(plan_guru_dft_r2c, PLAN_GURU_DFT_R2C)(
d@0 225 X(plan) *p, int *rank, const int *n,
d@0 226 const int *is, const int *os,
d@0 227 int *howmany_rank, const int *h_n,
d@0 228 const int *h_is, const int *h_os,
d@0 229 R *in, C *out, int *flags)
d@0 230 {
d@0 231 X(iodim) *dims = make_dims(*rank, n, is, os);
d@0 232 X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os);
d@0 233 *p = X(plan_guru_dft_r2c)(*rank, dims, *howmany_rank, howmany_dims,
d@0 234 in, out, *flags);
d@0 235 X(ifree0)(howmany_dims);
d@0 236 X(ifree0)(dims);
d@0 237 }
d@0 238
d@0 239 FFTW_VOIDFUNC F77(plan_guru_split_dft_r2c, PLAN_GURU_SPLIT_DFT_R2C)(
d@0 240 X(plan) *p, int *rank, const int *n,
d@0 241 const int *is, const int *os,
d@0 242 int *howmany_rank, const int *h_n,
d@0 243 const int *h_is, const int *h_os,
d@0 244 R *in, R *ro, R *io, int *flags)
d@0 245 {
d@0 246 X(iodim) *dims = make_dims(*rank, n, is, os);
d@0 247 X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os);
d@0 248 *p = X(plan_guru_split_dft_r2c)(*rank, dims, *howmany_rank, howmany_dims,
d@0 249 in, ro, io, *flags);
d@0 250 X(ifree0)(howmany_dims);
d@0 251 X(ifree0)(dims);
d@0 252 }
d@0 253
d@0 254 FFTW_VOIDFUNC F77(execute_dft_r2c, EXECUTE_DFT_R2C)(X(plan) * const p, R *in, C *out)
d@0 255 WITH_ALIGNED_STACK({
d@0 256 plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln;
d@0 257 problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb;
d@0 258 pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), out[0], out[0]+1);
d@0 259 })
d@0 260
d@0 261 FFTW_VOIDFUNC F77(execute_split_dft_r2c, EXECUTE_SPLIT_DFT_R2C)(X(plan) * const p,
d@0 262 R *in, R *ro, R *io)
d@0 263 WITH_ALIGNED_STACK({
d@0 264 plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln;
d@0 265 problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb;
d@0 266 pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), ro, io);
d@0 267 })
d@0 268
d@0 269 /****************************** DFT c2r *********************************/
d@0 270
d@0 271 FFTW_VOIDFUNC F77(plan_dft_c2r, PLAN_DFT_C2R)(X(plan) *p, int *rank, const int *n,
d@0 272 C *in, R *out, int *flags)
d@0 273 {
d@0 274 int *nrev = reverse_n(*rank, n);
d@0 275 *p = X(plan_dft_c2r)(*rank, nrev, in, out, *flags);
d@0 276 X(ifree0)(nrev);
d@0 277 }
d@0 278
d@0 279 FFTW_VOIDFUNC F77(plan_dft_c2r_1d, PLAN_DFT_C2R_1D)(X(plan) *p, int *n, C *in, R *out,
d@0 280 int *flags)
d@0 281 {
d@0 282 *p = X(plan_dft_c2r_1d)(*n, in, out, *flags);
d@0 283 }
d@0 284
d@0 285 FFTW_VOIDFUNC F77(plan_dft_c2r_2d, PLAN_DFT_C2R_2D)(X(plan) *p, int *nx, int *ny,
d@0 286 C *in, R *out, int *flags)
d@0 287 {
d@0 288 *p = X(plan_dft_c2r_2d)(*ny, *nx, in, out, *flags);
d@0 289 }
d@0 290
d@0 291 FFTW_VOIDFUNC F77(plan_dft_c2r_3d, PLAN_DFT_C2R_3D)(X(plan) *p,
d@0 292 int *nx, int *ny, int *nz,
d@0 293 C *in, R *out,
d@0 294 int *flags)
d@0 295 {
d@0 296 *p = X(plan_dft_c2r_3d)(*nz, *ny, *nx, in, out, *flags);
d@0 297 }
d@0 298
d@0 299 FFTW_VOIDFUNC F77(plan_many_dft_c2r, PLAN_MANY_DFT_C2R)(
d@0 300 X(plan) *p, int *rank, const int *n,
d@0 301 int *howmany,
d@0 302 C *in, const int *inembed, int *istride, int *idist,
d@0 303 R *out, const int *onembed, int *ostride, int *odist,
d@0 304 int *flags)
d@0 305 {
d@0 306 int *nrev = reverse_n(*rank, n);
d@0 307 int *inembedrev = reverse_n(*rank, inembed);
d@0 308 int *onembedrev = reverse_n(*rank, onembed);
d@0 309 *p = X(plan_many_dft_c2r)(*rank, nrev, *howmany,
d@0 310 in, inembedrev, *istride, *idist,
d@0 311 out, onembedrev, *ostride, *odist,
d@0 312 *flags);
d@0 313 X(ifree0)(onembedrev);
d@0 314 X(ifree0)(inembedrev);
d@0 315 X(ifree0)(nrev);
d@0 316 }
d@0 317
d@0 318 FFTW_VOIDFUNC F77(plan_guru_dft_c2r, PLAN_GURU_DFT_C2R)(
d@0 319 X(plan) *p, int *rank, const int *n,
d@0 320 const int *is, const int *os,
d@0 321 int *howmany_rank, const int *h_n,
d@0 322 const int *h_is, const int *h_os,
d@0 323 C *in, R *out, int *flags)
d@0 324 {
d@0 325 X(iodim) *dims = make_dims(*rank, n, is, os);
d@0 326 X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os);
d@0 327 *p = X(plan_guru_dft_c2r)(*rank, dims, *howmany_rank, howmany_dims,
d@0 328 in, out, *flags);
d@0 329 X(ifree0)(howmany_dims);
d@0 330 X(ifree0)(dims);
d@0 331 }
d@0 332
d@0 333 FFTW_VOIDFUNC F77(plan_guru_split_dft_c2r, PLAN_GURU_SPLIT_DFT_C2R)(
d@0 334 X(plan) *p, int *rank, const int *n,
d@0 335 const int *is, const int *os,
d@0 336 int *howmany_rank, const int *h_n,
d@0 337 const int *h_is, const int *h_os,
d@0 338 R *ri, R *ii, R *out, int *flags)
d@0 339 {
d@0 340 X(iodim) *dims = make_dims(*rank, n, is, os);
d@0 341 X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os);
d@0 342 *p = X(plan_guru_split_dft_c2r)(*rank, dims, *howmany_rank, howmany_dims,
d@0 343 ri, ii, out, *flags);
d@0 344 X(ifree0)(howmany_dims);
d@0 345 X(ifree0)(dims);
d@0 346 }
d@0 347
d@0 348 FFTW_VOIDFUNC F77(execute_dft_c2r, EXECUTE_DFT_C2R)(X(plan) * const p, C *in, R *out)
d@0 349 WITH_ALIGNED_STACK({
d@0 350 plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln;
d@0 351 problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb;
d@0 352 pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), in[0], in[0]+1);
d@0 353 })
d@0 354
d@0 355 FFTW_VOIDFUNC F77(execute_split_dft_c2r, EXECUTE_SPLIT_DFT_C2R)(X(plan) * const p,
d@0 356 R *ri, R *ii, R *out)
d@0 357 WITH_ALIGNED_STACK({
d@0 358 plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln;
d@0 359 problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb;
d@0 360 pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), ri, ii);
d@0 361 })
d@0 362
d@0 363 /****************************** r2r *********************************/
d@0 364
d@0 365 FFTW_VOIDFUNC F77(plan_r2r, PLAN_R2R)(X(plan) *p, int *rank, const int *n,
d@0 366 R *in, R *out,
d@0 367 int *kind, int *flags)
d@0 368 {
d@0 369 int *nrev = reverse_n(*rank, n);
d@0 370 X(r2r_kind) *k = ints2kinds(*rank, kind);
d@0 371 *p = X(plan_r2r)(*rank, nrev, in, out, k, *flags);
d@0 372 X(ifree0)(k);
d@0 373 X(ifree0)(nrev);
d@0 374 }
d@0 375
d@0 376 FFTW_VOIDFUNC F77(plan_r2r_1d, PLAN_R2R_1D)(X(plan) *p, int *n, R *in, R *out,
d@0 377 int *kind, int *flags)
d@0 378 {
d@0 379 *p = X(plan_r2r_1d)(*n, in, out, (X(r2r_kind)) *kind, *flags);
d@0 380 }
d@0 381
d@0 382 FFTW_VOIDFUNC F77(plan_r2r_2d, PLAN_R2R_2D)(X(plan) *p, int *nx, int *ny,
d@0 383 R *in, R *out,
d@0 384 int *kindx, int *kindy, int *flags)
d@0 385 {
d@0 386 *p = X(plan_r2r_2d)(*ny, *nx, in, out,
d@0 387 (X(r2r_kind)) *kindy, (X(r2r_kind)) *kindx, *flags);
d@0 388 }
d@0 389
d@0 390 FFTW_VOIDFUNC F77(plan_r2r_3d, PLAN_R2R_3D)(X(plan) *p,
d@0 391 int *nx, int *ny, int *nz,
d@0 392 R *in, R *out,
d@0 393 int *kindx, int *kindy, int *kindz,
d@0 394 int *flags)
d@0 395 {
d@0 396 *p = X(plan_r2r_3d)(*nz, *ny, *nx, in, out,
d@0 397 (X(r2r_kind)) *kindz, (X(r2r_kind)) *kindy,
d@0 398 (X(r2r_kind)) *kindx, *flags);
d@0 399 }
d@0 400
d@0 401 FFTW_VOIDFUNC F77(plan_many_r2r, PLAN_MANY_R2R)(
d@0 402 X(plan) *p, int *rank, const int *n,
d@0 403 int *howmany,
d@0 404 R *in, const int *inembed, int *istride, int *idist,
d@0 405 R *out, const int *onembed, int *ostride, int *odist,
d@0 406 int *kind, int *flags)
d@0 407 {
d@0 408 int *nrev = reverse_n(*rank, n);
d@0 409 int *inembedrev = reverse_n(*rank, inembed);
d@0 410 int *onembedrev = reverse_n(*rank, onembed);
d@0 411 X(r2r_kind) *k = ints2kinds(*rank, kind);
d@0 412 *p = X(plan_many_r2r)(*rank, nrev, *howmany,
d@0 413 in, inembedrev, *istride, *idist,
d@0 414 out, onembedrev, *ostride, *odist,
d@0 415 k, *flags);
d@0 416 X(ifree0)(k);
d@0 417 X(ifree0)(onembedrev);
d@0 418 X(ifree0)(inembedrev);
d@0 419 X(ifree0)(nrev);
d@0 420 }
d@0 421
d@0 422 FFTW_VOIDFUNC F77(plan_guru_r2r, PLAN_GURU_R2R)(
d@0 423 X(plan) *p, int *rank, const int *n,
d@0 424 const int *is, const int *os,
d@0 425 int *howmany_rank, const int *h_n,
d@0 426 const int *h_is, const int *h_os,
d@0 427 R *in, R *out, int *kind, int *flags)
d@0 428 {
d@0 429 X(iodim) *dims = make_dims(*rank, n, is, os);
d@0 430 X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os);
d@0 431 X(r2r_kind) *k = ints2kinds(*rank, kind);
d@0 432 *p = X(plan_guru_r2r)(*rank, dims, *howmany_rank, howmany_dims,
d@0 433 in, out, k, *flags);
d@0 434 X(ifree0)(k);
d@0 435 X(ifree0)(howmany_dims);
d@0 436 X(ifree0)(dims);
d@0 437 }
d@0 438
d@0 439 FFTW_VOIDFUNC F77(execute_r2r, EXECUTE_R2R)(X(plan) * const p, R *in, R *out)
d@0 440 WITH_ALIGNED_STACK({
d@0 441 plan_rdft *pln = (plan_rdft *) (*p)->pln;
d@0 442 pln->apply((plan *) pln, in, out);
d@0 443 })