3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
9 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11 * Copyright (c) 2001-2012, The GROMACS development team,
12 * check out http://www.gromacs.org for more information.
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * If you want to redistribute modifications, please consider that
20 * scientific software is very special. Version control is crucial -
21 * bugs must be traceable. We will be happy to consider code for
22 * inclusion in the official distribution, but derived work must not
23 * be called official GROMACS. Details are found in the README & COPYING
24 * files - if they are missing, get the official version at www.gromacs.org.
26 * To help us fund GROMACS development, we humbly ask that you cite
27 * the papers on the package - you can find them in the top README file.
29 * For more info, check our website at http://www.gromacs.org
32 * Groningen Machine for Chemical Simulation
34 ************************************************************
36 Copy of fftpack from Numpy with very minor modifications:
37 - usage of fftpack.h (replacement for Treal define)
38 - [cr]fft[ifb]1 non-static
39 - Added Copyright headers
40 - Added fftpack_ prefix
42 Original version is from Numpy 1.6
44 ************************************************************
46 Copyright (c) 2005-2011, NumPy Developers.
49 Redistribution and use in source and binary forms, with or without
50 modification, are permitted provided that the following conditions are
53 * Redistributions of source code must retain the above copyright
54 notice, this list of conditions and the following disclaimer.
56 * Redistributions in binary form must reproduce the above
57 copyright notice, this list of conditions and the following
58 disclaimer in the documentation and/or other materials provided
59 with the distribution.
61 * Neither the name of the NumPy Developers nor the names of any
62 contributors may be used to endorse or promote products derived
63 from this software without specific prior written permission.
65 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
66 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
67 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
68 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
69 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
70 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
71 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
72 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
73 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
74 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
75 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
77 fftpack.c : A set of FFT routines in C.
78 Algorithmically based on Fortran-77 FFTPACK by Paul N. Swarztrauber (Version 4, 1985).
82 /* isign is +1 for backward and -1 for forward transforms */
91 #define MAXFAC 13 /* maximum number of factors in factorization of n */
92 #define NSPECIAL 4 /* number of factors for which we have special-case routines */
99 /* ----------------------------------------------------------------------
100 passf2, passf3, passf4, passf5, passf. Complex FFT passes fwd and bwd.
101 ---------------------------------------------------------------------- */
103 static void passf2(int ido, int l1, const Treal cc[], Treal ch[], const Treal wa1[], int isign)
104 /* isign==+1 for backward transform */
109 for (k=0; k<l1; k++) {
112 ch[ah] = ref(cc,ac) + ref(cc,ac + ido);
113 ch[ah + ido*l1] = ref(cc,ac) - ref(cc,ac + ido);
114 ch[ah+1] = ref(cc,ac+1) + ref(cc,ac + ido + 1);
115 ch[ah + ido*l1 + 1] = ref(cc,ac+1) - ref(cc,ac + ido + 1);
118 for (k=0; k<l1; k++) {
119 for (i=0; i<ido-1; i+=2) {
122 ch[ah] = ref(cc,ac) + ref(cc,ac + ido);
123 tr2 = ref(cc,ac) - ref(cc,ac + ido);
124 ch[ah+1] = ref(cc,ac+1) + ref(cc,ac + 1 + ido);
125 ti2 = ref(cc,ac+1) - ref(cc,ac + 1 + ido);
126 ch[ah+l1*ido+1] = wa1[i]*ti2 + isign*wa1[i+1]*tr2;
127 ch[ah+l1*ido] = wa1[i]*tr2 - isign*wa1[i+1]*ti2;
134 static void passf3(int ido, int l1, const Treal cc[], Treal ch[],
135 const Treal wa1[], const Treal wa2[], int isign)
136 /* isign==+1 for backward transform */
138 static const Treal taur = -0.5;
139 static const Treal taui = 0.866025403784439;
141 Treal ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
143 for (k=1; k<=l1; k++) {
145 tr2 = ref(cc,ac) + ref(cc,ac + ido);
146 cr2 = ref(cc,ac - ido) + taur*tr2;
148 ch[ah] = ref(cc,ac - ido) + tr2;
150 ti2 = ref(cc,ac + 1) + ref(cc,ac + ido + 1);
151 ci2 = ref(cc,ac - ido + 1) + taur*ti2;
152 ch[ah + 1] = ref(cc,ac - ido + 1) + ti2;
154 cr3 = isign*taui*(ref(cc,ac) - ref(cc,ac + ido));
155 ci3 = isign*taui*(ref(cc,ac + 1) - ref(cc,ac + ido + 1));
156 ch[ah + l1*ido] = cr2 - ci3;
157 ch[ah + 2*l1*ido] = cr2 + ci3;
158 ch[ah + l1*ido + 1] = ci2 + cr3;
159 ch[ah + 2*l1*ido + 1] = ci2 - cr3;
162 for (k=1; k<=l1; k++) {
163 for (i=0; i<ido-1; i+=2) {
164 ac = i + (3*k - 2)*ido;
165 tr2 = ref(cc,ac) + ref(cc,ac + ido);
166 cr2 = ref(cc,ac - ido) + taur*tr2;
168 ch[ah] = ref(cc,ac - ido) + tr2;
169 ti2 = ref(cc,ac + 1) + ref(cc,ac + ido + 1);
170 ci2 = ref(cc,ac - ido + 1) + taur*ti2;
171 ch[ah + 1] = ref(cc,ac - ido + 1) + ti2;
172 cr3 = isign*taui*(ref(cc,ac) - ref(cc,ac + ido));
173 ci3 = isign*taui*(ref(cc,ac + 1) - ref(cc,ac + ido + 1));
178 ch[ah + l1*ido + 1] = wa1[i]*di2 + isign*wa1[i+1]*dr2;
179 ch[ah + l1*ido] = wa1[i]*dr2 - isign*wa1[i+1]*di2;
180 ch[ah + 2*l1*ido + 1] = wa2[i]*di3 + isign*wa2[i+1]*dr3;
181 ch[ah + 2*l1*ido] = wa2[i]*dr3 - isign*wa2[i+1]*di3;
188 static void passf4(int ido, int l1, const Treal cc[], Treal ch[],
189 const Treal wa1[], const Treal wa2[], const Treal wa3[], int isign)
190 /* isign == -1 for forward transform and +1 for backward transform */
193 Treal ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
195 for (k=0; k<l1; k++) {
197 ti1 = ref(cc,ac) - ref(cc,ac + 2*ido);
198 ti2 = ref(cc,ac) + ref(cc,ac + 2*ido);
199 tr4 = ref(cc,ac + 3*ido) - ref(cc,ac + ido);
200 ti3 = ref(cc,ac + ido) + ref(cc,ac + 3*ido);
201 tr1 = ref(cc,ac - 1) - ref(cc,ac + 2*ido - 1);
202 tr2 = ref(cc,ac - 1) + ref(cc,ac + 2*ido - 1);
203 ti4 = ref(cc,ac + ido - 1) - ref(cc,ac + 3*ido - 1);
204 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 3*ido - 1);
207 ch[ah + 2*l1*ido] = tr2 - tr3;
208 ch[ah + 1] = ti2 + ti3;
209 ch[ah + 2*l1*ido + 1] = ti2 - ti3;
210 ch[ah + l1*ido] = tr1 + isign*tr4;
211 ch[ah + 3*l1*ido] = tr1 - isign*tr4;
212 ch[ah + l1*ido + 1] = ti1 + isign*ti4;
213 ch[ah + 3*l1*ido + 1] = ti1 - isign*ti4;
216 for (k=0; k<l1; k++) {
217 for (i=0; i<ido-1; i+=2) {
218 ac = i + 1 + 4*k*ido;
219 ti1 = ref(cc,ac) - ref(cc,ac + 2*ido);
220 ti2 = ref(cc,ac) + ref(cc,ac + 2*ido);
221 ti3 = ref(cc,ac + ido) + ref(cc,ac + 3*ido);
222 tr4 = ref(cc,ac + 3*ido) - ref(cc,ac + ido);
223 tr1 = ref(cc,ac - 1) - ref(cc,ac + 2*ido - 1);
224 tr2 = ref(cc,ac - 1) + ref(cc,ac + 2*ido - 1);
225 ti4 = ref(cc,ac + ido - 1) - ref(cc,ac + 3*ido - 1);
226 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 3*ido - 1);
230 ch[ah + 1] = ti2 + ti3;
232 cr2 = tr1 + isign*tr4;
233 cr4 = tr1 - isign*tr4;
234 ci2 = ti1 + isign*ti4;
235 ci4 = ti1 - isign*ti4;
236 ch[ah + l1*ido] = wa1[i]*cr2 - isign*wa1[i + 1]*ci2;
237 ch[ah + l1*ido + 1] = wa1[i]*ci2 + isign*wa1[i + 1]*cr2;
238 ch[ah + 2*l1*ido] = wa2[i]*cr3 - isign*wa2[i + 1]*ci3;
239 ch[ah + 2*l1*ido + 1] = wa2[i]*ci3 + isign*wa2[i + 1]*cr3;
240 ch[ah + 3*l1*ido] = wa3[i]*cr4 -isign*wa3[i + 1]*ci4;
241 ch[ah + 3*l1*ido + 1] = wa3[i]*ci4 + isign*wa3[i + 1]*cr4;
248 static void passf5(int ido, int l1, const Treal cc[], Treal ch[],
249 const Treal wa1[], const Treal wa2[], const Treal wa3[], const Treal wa4[], int isign)
250 /* isign == -1 for forward transform and +1 for backward transform */
252 static const Treal tr11 = 0.309016994374947;
253 static const Treal ti11 = 0.951056516295154;
254 static const Treal tr12 = -0.809016994374947;
255 static const Treal ti12 = 0.587785252292473;
257 Treal ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3,
258 ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;
260 for (k = 1; k <= l1; ++k) {
261 ac = (5*k - 4)*ido + 1;
262 ti5 = ref(cc,ac) - ref(cc,ac + 3*ido);
263 ti2 = ref(cc,ac) + ref(cc,ac + 3*ido);
264 ti4 = ref(cc,ac + ido) - ref(cc,ac + 2*ido);
265 ti3 = ref(cc,ac + ido) + ref(cc,ac + 2*ido);
266 tr5 = ref(cc,ac - 1) - ref(cc,ac + 3*ido - 1);
267 tr2 = ref(cc,ac - 1) + ref(cc,ac + 3*ido - 1);
268 tr4 = ref(cc,ac + ido - 1) - ref(cc,ac + 2*ido - 1);
269 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 2*ido - 1);
271 ch[ah] = ref(cc,ac - ido - 1) + tr2 + tr3;
272 ch[ah + 1] = ref(cc,ac - ido) + ti2 + ti3;
273 cr2 = ref(cc,ac - ido - 1) + tr11*tr2 + tr12*tr3;
274 ci2 = ref(cc,ac - ido) + tr11*ti2 + tr12*ti3;
275 cr3 = ref(cc,ac - ido - 1) + tr12*tr2 + tr11*tr3;
276 ci3 = ref(cc,ac - ido) + tr12*ti2 + tr11*ti3;
277 cr5 = isign*(ti11*tr5 + ti12*tr4);
278 ci5 = isign*(ti11*ti5 + ti12*ti4);
279 cr4 = isign*(ti12*tr5 - ti11*tr4);
280 ci4 = isign*(ti12*ti5 - ti11*ti4);
281 ch[ah + l1*ido] = cr2 - ci5;
282 ch[ah + 4*l1*ido] = cr2 + ci5;
283 ch[ah + l1*ido + 1] = ci2 + cr5;
284 ch[ah + 2*l1*ido + 1] = ci3 + cr4;
285 ch[ah + 2*l1*ido] = cr3 - ci4;
286 ch[ah + 3*l1*ido] = cr3 + ci4;
287 ch[ah + 3*l1*ido + 1] = ci3 - cr4;
288 ch[ah + 4*l1*ido + 1] = ci2 - cr5;
291 for (k=1; k<=l1; k++) {
292 for (i=0; i<ido-1; i+=2) {
293 ac = i + 1 + (k*5 - 4)*ido;
294 ti5 = ref(cc,ac) - ref(cc,ac + 3*ido);
295 ti2 = ref(cc,ac) + ref(cc,ac + 3*ido);
296 ti4 = ref(cc,ac + ido) - ref(cc,ac + 2*ido);
297 ti3 = ref(cc,ac + ido) + ref(cc,ac + 2*ido);
298 tr5 = ref(cc,ac - 1) - ref(cc,ac + 3*ido - 1);
299 tr2 = ref(cc,ac - 1) + ref(cc,ac + 3*ido - 1);
300 tr4 = ref(cc,ac + ido - 1) - ref(cc,ac + 2*ido - 1);
301 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 2*ido - 1);
302 ah = i + (k - 1)*ido;
303 ch[ah] = ref(cc,ac - ido - 1) + tr2 + tr3;
304 ch[ah + 1] = ref(cc,ac - ido) + ti2 + ti3;
305 cr2 = ref(cc,ac - ido - 1) + tr11*tr2 + tr12*tr3;
307 ci2 = ref(cc,ac - ido) + tr11*ti2 + tr12*ti3;
308 cr3 = ref(cc,ac - ido - 1) + tr12*tr2 + tr11*tr3;
310 ci3 = ref(cc,ac - ido) + tr12*ti2 + tr11*ti3;
311 cr5 = isign*(ti11*tr5 + ti12*tr4);
312 ci5 = isign*(ti11*ti5 + ti12*ti4);
313 cr4 = isign*(ti12*tr5 - ti11*tr4);
314 ci4 = isign*(ti12*ti5 - ti11*ti4);
323 ch[ah + l1*ido] = wa1[i]*dr2 - isign*wa1[i+1]*di2;
324 ch[ah + l1*ido + 1] = wa1[i]*di2 + isign*wa1[i+1]*dr2;
325 ch[ah + 2*l1*ido] = wa2[i]*dr3 - isign*wa2[i+1]*di3;
326 ch[ah + 2*l1*ido + 1] = wa2[i]*di3 + isign*wa2[i+1]*dr3;
327 ch[ah + 3*l1*ido] = wa3[i]*dr4 - isign*wa3[i+1]*di4;
328 ch[ah + 3*l1*ido + 1] = wa3[i]*di4 + isign*wa3[i+1]*dr4;
329 ch[ah + 4*l1*ido] = wa4[i]*dr5 - isign*wa4[i+1]*di5;
330 ch[ah + 4*l1*ido + 1] = wa4[i]*di5 + isign*wa4[i+1]*dr5;
337 static void passf(int *nac, int ido, int ip, int l1, int idl1,
338 Treal cc[], Treal ch[],
339 const Treal wa[], int isign)
340 /* isign is -1 for forward transform and +1 for backward transform */
342 int idij, idlj, idot, ipph, i, j, k, l, jc, lc, ik, idj, idl, inc,idp;
350 for (j=1; j<ipph; j++) {
352 for (k=0; k<l1; k++) {
353 for (i=0; i<ido; i++) {
354 ch[i + (k + j*l1)*ido] =
355 ref(cc,i + (j + k*ip)*ido) + ref(cc,i + (jc + k*ip)*ido);
356 ch[i + (k + jc*l1)*ido] =
357 ref(cc,i + (j + k*ip)*ido) - ref(cc,i + (jc + k*ip)*ido);
362 for (i=0; i<ido; i++)
363 ch[i + k*ido] = ref(cc,i + k*ip*ido);
365 for (j=1; j<ipph; j++) {
367 for (i=0; i<ido; i++) {
368 for (k=0; k<l1; k++) {
369 ch[i + (k + j*l1)*ido] = ref(cc,i + (j + k*ip)*ido) + ref(cc,i + (jc + k*
371 ch[i + (k + jc*l1)*ido] = ref(cc,i + (j + k*ip)*ido) - ref(cc,i + (jc + k*
376 for (i=0; i<ido; i++)
378 ch[i + k*ido] = ref(cc,i + k*ip*ido);
383 for (l=1; l<ipph; l++) {
386 for (ik=0; ik<idl1; ik++) {
387 cc[ik + l*idl1] = ch[ik] + wa[idl - 2]*ch[ik + idl1];
388 cc[ik + lc*idl1] = isign*wa[idl-1]*ch[ik + (ip-1)*idl1];
392 for (j=2; j<ipph; j++) {
395 if (idlj > idp) idlj -= idp;
398 for (ik=0; ik<idl1; ik++) {
399 cc[ik + l*idl1] += war*ch[ik + j*idl1];
400 cc[ik + lc*idl1] += isign*wai*ch[ik + jc*idl1];
404 for (j=1; j<ipph; j++)
405 for (ik=0; ik<idl1; ik++)
406 ch[ik] += ch[ik + j*idl1];
407 for (j=1; j<ipph; j++) {
409 for (ik=1; ik<idl1; ik+=2) {
410 ch[ik - 1 + j*idl1] = cc[ik - 1 + j*idl1] - cc[ik + jc*idl1];
411 ch[ik - 1 + jc*idl1] = cc[ik - 1 + j*idl1] + cc[ik + jc*idl1];
412 ch[ik + j*idl1] = cc[ik + j*idl1] + cc[ik - 1 + jc*idl1];
413 ch[ik + jc*idl1] = cc[ik + j*idl1] - cc[ik - 1 + jc*idl1];
417 if (ido == 2) return;
419 for (ik=0; ik<idl1; ik++)
421 for (j=1; j<ip; j++) {
422 for (k=0; k<l1; k++) {
423 cc[(k + j*l1)*ido + 0] = ch[(k + j*l1)*ido + 0];
424 cc[(k + j*l1)*ido + 1] = ch[(k + j*l1)*ido + 1];
429 for (j=1; j<ip; j++) {
431 for (i=3; i<ido; i+=2) {
433 for (k=0; k<l1; k++) {
434 cc[i - 1 + (k + j*l1)*ido] =
435 wa[idij - 2]*ch[i - 1 + (k + j*l1)*ido] -
436 isign*wa[idij-1]*ch[i + (k + j*l1)*ido];
437 cc[i + (k + j*l1)*ido] =
438 wa[idij - 2]*ch[i + (k + j*l1)*ido] +
439 isign*wa[idij-1]*ch[i - 1 + (k + j*l1)*ido];
445 for (j=1; j<ip; j++) {
447 for (k = 0; k < l1; k++) {
449 for (i=3; i<ido; i+=2) {
451 cc[i - 1 + (k + j*l1)*ido] =
452 wa[idij - 2]*ch[i - 1 + (k + j*l1)*ido] -
453 isign*wa[idij-1]*ch[i + (k + j*l1)*ido];
454 cc[i + (k + j*l1)*ido] =
455 wa[idij - 2]*ch[i + (k + j*l1)*ido] +
456 isign*wa[idij-1]*ch[i - 1 + (k + j*l1)*ido];
464 /* ----------------------------------------------------------------------
465 radf2,radb2, radf3,radb3, radf4,radb4, radf5,radb5, radfg,radbg.
466 Treal FFT passes fwd and bwd.
467 ---------------------------------------------------------------------- */
469 static void radf2(int ido, int l1, const Treal cc[], Treal ch[], const Treal wa1[])
473 for (k=0; k<l1; k++) {
475 ref(cc,k*ido) + ref(cc,(k + l1)*ido);
476 ch[(2*k+1)*ido + ido-1] =
477 ref(cc,k*ido) - ref(cc,(k + l1)*ido);
481 for (k=0; k<l1; k++) {
482 for (i=2; i<ido; i+=2) {
484 tr2 = wa1[i - 2]*ref(cc, i-1 + (k + l1)*ido) + wa1[i - 1]*ref(cc, i + (k + l1)*ido);
485 ti2 = wa1[i - 2]*ref(cc, i + (k + l1)*ido) - wa1[i - 1]*ref(cc, i-1 + (k + l1)*ido);
486 ch[i + 2*k*ido] = ref(cc,i + k*ido) + ti2;
487 ch[ic + (2*k+1)*ido] = ti2 - ref(cc,i + k*ido);
488 ch[i - 1 + 2*k*ido] = ref(cc,i - 1 + k*ido) + tr2;
489 ch[ic - 1 + (2*k+1)*ido] = ref(cc,i - 1 + k*ido) - tr2;
492 if (ido % 2 == 1) return;
494 for (k=0; k<l1; k++) {
495 ch[(2*k+1)*ido] = -ref(cc,ido-1 + (k + l1)*ido);
496 ch[ido-1 + 2*k*ido] = ref(cc,ido-1 + k*ido);
501 static void radb2(int ido, int l1, const Treal cc[], Treal ch[], const Treal wa1[])
505 for (k=0; k<l1; k++) {
507 ref(cc,2*k*ido) + ref(cc,ido-1 + (2*k+1)*ido);
509 ref(cc,2*k*ido) - ref(cc,ido-1 + (2*k+1)*ido);
513 for (k = 0; k < l1; ++k) {
514 for (i = 2; i < ido; i += 2) {
517 ref(cc,i-1 + 2*k*ido) + ref(cc,ic-1 + (2*k+1)*ido);
518 tr2 = ref(cc,i-1 + 2*k*ido) - ref(cc,ic-1 + (2*k+1)*ido);
520 ref(cc,i + 2*k*ido) - ref(cc,ic + (2*k+1)*ido);
521 ti2 = ref(cc,i + (2*k)*ido) + ref(cc,ic + (2*k+1)*ido);
522 ch[i-1 + (k + l1)*ido] =
523 wa1[i - 2]*tr2 - wa1[i - 1]*ti2;
524 ch[i + (k + l1)*ido] =
525 wa1[i - 2]*ti2 + wa1[i - 1]*tr2;
528 if (ido % 2 == 1) return;
530 for (k = 0; k < l1; k++) {
531 ch[ido-1 + k*ido] = 2*ref(cc,ido-1 + 2*k*ido);
532 ch[ido-1 + (k + l1)*ido] = -2*ref(cc,(2*k+1)*ido);
537 static void radf3(int ido, int l1, const Treal cc[], Treal ch[],
538 const Treal wa1[], const Treal wa2[])
540 static const Treal taur = -0.5;
541 static const Treal taui = 0.866025403784439;
543 Treal ci2, di2, di3, cr2, dr2, dr3, ti2, ti3, tr2, tr3;
544 for (k=0; k<l1; k++) {
545 cr2 = ref(cc,(k + l1)*ido) + ref(cc,(k + 2*l1)*ido);
546 ch[3*k*ido] = ref(cc,k*ido) + cr2;
547 ch[(3*k+2)*ido] = taui*(ref(cc,(k + l1*2)*ido) - ref(cc,(k + l1)*ido));
548 ch[ido-1 + (3*k + 1)*ido] = ref(cc,k*ido) + taur*cr2;
550 if (ido == 1) return;
551 for (k=0; k<l1; k++) {
552 for (i=2; i<ido; i+=2) {
554 dr2 = wa1[i - 2]*ref(cc,i - 1 + (k + l1)*ido) +
555 wa1[i - 1]*ref(cc,i + (k + l1)*ido);
556 di2 = wa1[i - 2]*ref(cc,i + (k + l1)*ido) - wa1[i - 1]*ref(cc,i - 1 + (k + l1)*ido);
557 dr3 = wa2[i - 2]*ref(cc,i - 1 + (k + l1*2)*ido) + wa2[i - 1]*ref(cc,i + (k + l1*2)*ido);
558 di3 = wa2[i - 2]*ref(cc,i + (k + l1*2)*ido) - wa2[i - 1]*ref(cc,i - 1 + (k + l1*2)*ido);
561 ch[i - 1 + 3*k*ido] = ref(cc,i - 1 + k*ido) + cr2;
562 ch[i + 3*k*ido] = ref(cc,i + k*ido) + ci2;
563 tr2 = ref(cc,i - 1 + k*ido) + taur*cr2;
564 ti2 = ref(cc,i + k*ido) + taur*ci2;
565 tr3 = taui*(di2 - di3);
566 ti3 = taui*(dr3 - dr2);
567 ch[i - 1 + (3*k + 2)*ido] = tr2 + tr3;
568 ch[ic - 1 + (3*k + 1)*ido] = tr2 - tr3;
569 ch[i + (3*k + 2)*ido] = ti2 + ti3;
570 ch[ic + (3*k + 1)*ido] = ti3 - ti2;
576 static void radb3(int ido, int l1, const Treal cc[], Treal ch[],
577 const Treal wa1[], const Treal wa2[])
579 static const Treal taur = -0.5;
580 static const Treal taui = 0.866025403784439;
582 Treal ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
583 for (k=0; k<l1; k++) {
584 tr2 = 2*ref(cc,ido-1 + (3*k + 1)*ido);
585 cr2 = ref(cc,3*k*ido) + taur*tr2;
586 ch[k*ido] = ref(cc,3*k*ido) + tr2;
587 ci3 = 2*taui*ref(cc,(3*k + 2)*ido);
588 ch[(k + l1)*ido] = cr2 - ci3;
589 ch[(k + 2*l1)*ido] = cr2 + ci3;
591 if (ido == 1) return;
592 for (k=0; k<l1; k++) {
593 for (i=2; i<ido; i+=2) {
595 tr2 = ref(cc,i - 1 + (3*k + 2)*ido) + ref(cc,ic - 1 + (3*k + 1)*ido);
596 cr2 = ref(cc,i - 1 + 3*k*ido) + taur*tr2;
597 ch[i - 1 + k*ido] = ref(cc,i - 1 + 3*k*ido) + tr2;
598 ti2 = ref(cc,i + (3*k + 2)*ido) - ref(cc,ic + (3*k + 1)*ido);
599 ci2 = ref(cc,i + 3*k*ido) + taur*ti2;
600 ch[i + k*ido] = ref(cc,i + 3*k*ido) + ti2;
601 cr3 = taui*(ref(cc,i - 1 + (3*k + 2)*ido) - ref(cc,ic - 1 + (3*k + 1)*ido));
602 ci3 = taui*(ref(cc,i + (3*k + 2)*ido) + ref(cc,ic + (3*k + 1)*ido));
607 ch[i - 1 + (k + l1)*ido] = wa1[i - 2]*dr2 - wa1[i - 1]*di2;
608 ch[i + (k + l1)*ido] = wa1[i - 2]*di2 + wa1[i - 1]*dr2;
609 ch[i - 1 + (k + 2*l1)*ido] = wa2[i - 2]*dr3 - wa2[i - 1]*di3;
610 ch[i + (k + 2*l1)*ido] = wa2[i - 2]*di3 + wa2[i - 1]*dr3;
616 static void radf4(int ido, int l1, const Treal cc[], Treal ch[],
617 const Treal wa1[], const Treal wa2[], const Treal wa3[])
619 static const Treal hsqt2 = 0.7071067811865475;
621 Treal ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
622 for (k=0; k<l1; k++) {
623 tr1 = ref(cc,(k + l1)*ido) + ref(cc,(k + 3*l1)*ido);
624 tr2 = ref(cc,k*ido) + ref(cc,(k + 2*l1)*ido);
625 ch[4*k*ido] = tr1 + tr2;
626 ch[ido-1 + (4*k + 3)*ido] = tr2 - tr1;
627 ch[ido-1 + (4*k + 1)*ido] = ref(cc,k*ido) - ref(cc,(k + 2*l1)*ido);
628 ch[(4*k + 2)*ido] = ref(cc,(k + 3*l1)*ido) - ref(cc,(k + l1)*ido);
632 for (k=0; k<l1; k++) {
633 for (i=2; i<ido; i += 2) {
635 cr2 = wa1[i - 2]*ref(cc,i - 1 + (k + l1)*ido) + wa1[i - 1]*ref(cc,i + (k + l1)*ido);
636 ci2 = wa1[i - 2]*ref(cc,i + (k + l1)*ido) - wa1[i - 1]*ref(cc,i - 1 + (k + l1)*ido);
637 cr3 = wa2[i - 2]*ref(cc,i - 1 + (k + 2*l1)*ido) + wa2[i - 1]*ref(cc,i + (k + 2*l1)*
639 ci3 = wa2[i - 2]*ref(cc,i + (k + 2*l1)*ido) - wa2[i - 1]*ref(cc,i - 1 + (k + 2*l1)*
641 cr4 = wa3[i - 2]*ref(cc,i - 1 + (k + 3*l1)*ido) + wa3[i - 1]*ref(cc,i + (k + 3*l1)*
643 ci4 = wa3[i - 2]*ref(cc,i + (k + 3*l1)*ido) - wa3[i - 1]*ref(cc,i - 1 + (k + 3*l1)*
649 ti2 = ref(cc,i + k*ido) + ci3;
650 ti3 = ref(cc,i + k*ido) - ci3;
651 tr2 = ref(cc,i - 1 + k*ido) + cr3;
652 tr3 = ref(cc,i - 1 + k*ido) - cr3;
653 ch[i - 1 + 4*k*ido] = tr1 + tr2;
654 ch[ic - 1 + (4*k + 3)*ido] = tr2 - tr1;
655 ch[i + 4*k*ido] = ti1 + ti2;
656 ch[ic + (4*k + 3)*ido] = ti1 - ti2;
657 ch[i - 1 + (4*k + 2)*ido] = ti4 + tr3;
658 ch[ic - 1 + (4*k + 1)*ido] = tr3 - ti4;
659 ch[i + (4*k + 2)*ido] = tr4 + ti3;
660 ch[ic + (4*k + 1)*ido] = tr4 - ti3;
663 if (ido % 2 == 1) return;
665 for (k=0; k<l1; k++) {
666 ti1 = -hsqt2*(ref(cc,ido-1 + (k + l1)*ido) + ref(cc,ido-1 + (k + 3*l1)*ido));
667 tr1 = hsqt2*(ref(cc,ido-1 + (k + l1)*ido) - ref(cc,ido-1 + (k + 3*l1)*ido));
668 ch[ido-1 + 4*k*ido] = tr1 + ref(cc,ido-1 + k*ido);
669 ch[ido-1 + (4*k + 2)*ido] = ref(cc,ido-1 + k*ido) - tr1;
670 ch[(4*k + 1)*ido] = ti1 - ref(cc,ido-1 + (k + 2*l1)*ido);
671 ch[(4*k + 3)*ido] = ti1 + ref(cc,ido-1 + (k + 2*l1)*ido);
676 static void radb4(int ido, int l1, const Treal cc[], Treal ch[],
677 const Treal wa1[], const Treal wa2[], const Treal wa3[])
679 static const Treal sqrt2 = 1.414213562373095;
681 Treal ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
682 for (k = 0; k < l1; k++) {
683 tr1 = ref(cc,4*k*ido) - ref(cc,ido-1 + (4*k + 3)*ido);
684 tr2 = ref(cc,4*k*ido) + ref(cc,ido-1 + (4*k + 3)*ido);
685 tr3 = ref(cc,ido-1 + (4*k + 1)*ido) + ref(cc,ido-1 + (4*k + 1)*ido);
686 tr4 = ref(cc,(4*k + 2)*ido) + ref(cc,(4*k + 2)*ido);
687 ch[k*ido] = tr2 + tr3;
688 ch[(k + l1)*ido] = tr1 - tr4;
689 ch[(k + 2*l1)*ido] = tr2 - tr3;
690 ch[(k + 3*l1)*ido] = tr1 + tr4;
694 for (k = 0; k < l1; ++k) {
695 for (i = 2; i < ido; i += 2) {
697 ti1 = ref(cc,i + 4*k*ido) + ref(cc,ic + (4*k + 3)*ido);
698 ti2 = ref(cc,i + 4*k*ido) - ref(cc,ic + (4*k + 3)*ido);
699 ti3 = ref(cc,i + (4*k + 2)*ido) - ref(cc,ic + (4*k + 1)*ido);
700 tr4 = ref(cc,i + (4*k + 2)*ido) + ref(cc,ic + (4*k + 1)*ido);
701 tr1 = ref(cc,i - 1 + 4*k*ido) - ref(cc,ic - 1 + (4*k + 3)*ido);
702 tr2 = ref(cc,i - 1 + 4*k*ido) + ref(cc,ic - 1 + (4*k + 3)*ido);
703 ti4 = ref(cc,i - 1 + (4*k + 2)*ido) - ref(cc,ic - 1 + (4*k + 1)*ido);
704 tr3 = ref(cc,i - 1 + (4*k + 2)*ido) + ref(cc,ic - 1 + (4*k + 1)*ido);
705 ch[i - 1 + k*ido] = tr2 + tr3;
707 ch[i + k*ido] = ti2 + ti3;
713 ch[i - 1 + (k + l1)*ido] = wa1[i - 2]*cr2 - wa1[i - 1]*ci2;
714 ch[i + (k + l1)*ido] = wa1[i - 2]*ci2 + wa1[i - 1]*cr2;
715 ch[i - 1 + (k + 2*l1)*ido] = wa2[i - 2]*cr3 - wa2[i - 1]*ci3;
716 ch[i + (k + 2*l1)*ido] = wa2[i - 2]*ci3 + wa2[i - 1]*cr3;
717 ch[i - 1 + (k + 3*l1)*ido] = wa3[i - 2]*cr4 - wa3[i - 1]*ci4;
718 ch[i + (k + 3*l1)*ido] = wa3[i - 2]*ci4 + wa3[i - 1]*cr4;
721 if (ido % 2 == 1) return;
723 for (k = 0; k < l1; k++) {
724 ti1 = ref(cc,(4*k + 1)*ido) + ref(cc,(4*k + 3)*ido);
725 ti2 = ref(cc,(4*k + 3)*ido) - ref(cc,(4*k + 1)*ido);
726 tr1 = ref(cc,ido-1 + 4*k*ido) - ref(cc,ido-1 + (4*k + 2)*ido);
727 tr2 = ref(cc,ido-1 + 4*k*ido) + ref(cc,ido-1 + (4*k + 2)*ido);
728 ch[ido-1 + k*ido] = tr2 + tr2;
729 ch[ido-1 + (k + l1)*ido] = sqrt2*(tr1 - ti1);
730 ch[ido-1 + (k + 2*l1)*ido] = ti2 + ti2;
731 ch[ido-1 + (k + 3*l1)*ido] = -sqrt2*(tr1 + ti1);
736 static void radf5(int ido, int l1, const Treal cc[], Treal ch[],
737 const Treal wa1[], const Treal wa2[], const Treal wa3[], const Treal wa4[])
739 static const Treal tr11 = 0.309016994374947;
740 static const Treal ti11 = 0.951056516295154;
741 static const Treal tr12 = -0.809016994374947;
742 static const Treal ti12 = 0.587785252292473;
744 Treal ci2, di2, ci4, ci5, di3, di4, di5, ci3, cr2, cr3, dr2, dr3, dr4, dr5,
745 cr5, cr4, ti2, ti3, ti5, ti4, tr2, tr3, tr4, tr5;
746 for (k = 0; k < l1; k++) {
747 cr2 = ref(cc,(k + 4*l1)*ido) + ref(cc,(k + l1)*ido);
748 ci5 = ref(cc,(k + 4*l1)*ido) - ref(cc,(k + l1)*ido);
749 cr3 = ref(cc,(k + 3*l1)*ido) + ref(cc,(k + 2*l1)*ido);
750 ci4 = ref(cc,(k + 3*l1)*ido) - ref(cc,(k + 2*l1)*ido);
751 ch[5*k*ido] = ref(cc,k*ido) + cr2 + cr3;
752 ch[ido-1 + (5*k + 1)*ido] = ref(cc,k*ido) + tr11*cr2 + tr12*cr3;
753 ch[(5*k + 2)*ido] = ti11*ci5 + ti12*ci4;
754 ch[ido-1 + (5*k + 3)*ido] = ref(cc,k*ido) + tr12*cr2 + tr11*cr3;
755 ch[(5*k + 4)*ido] = ti12*ci5 - ti11*ci4;
757 if (ido == 1) return;
758 for (k = 0; k < l1; ++k) {
759 for (i = 2; i < ido; i += 2) {
761 dr2 = wa1[i - 2]*ref(cc,i - 1 + (k + l1)*ido) + wa1[i - 1]*ref(cc,i + (k + l1)*ido);
762 di2 = wa1[i - 2]*ref(cc,i + (k + l1)*ido) - wa1[i - 1]*ref(cc,i - 1 + (k + l1)*ido);
763 dr3 = wa2[i - 2]*ref(cc,i - 1 + (k + 2*l1)*ido) + wa2[i - 1]*ref(cc,i + (k + 2*l1)*ido);
764 di3 = wa2[i - 2]*ref(cc,i + (k + 2*l1)*ido) - wa2[i - 1]*ref(cc,i - 1 + (k + 2*l1)*ido);
765 dr4 = wa3[i - 2]*ref(cc,i - 1 + (k + 3*l1)*ido) + wa3[i - 1]*ref(cc,i + (k + 3*l1)*ido);
766 di4 = wa3[i - 2]*ref(cc,i + (k + 3*l1)*ido) - wa3[i - 1]*ref(cc,i - 1 + (k + 3*l1)*ido);
767 dr5 = wa4[i - 2]*ref(cc,i - 1 + (k + 4*l1)*ido) + wa4[i - 1]*ref(cc,i + (k + 4*l1)*ido);
768 di5 = wa4[i - 2]*ref(cc,i + (k + 4*l1)*ido) - wa4[i - 1]*ref(cc,i - 1 + (k + 4*l1)*ido);
777 ch[i - 1 + 5*k*ido] = ref(cc,i - 1 + k*ido) + cr2 + cr3;
778 ch[i + 5*k*ido] = ref(cc,i + k*ido) + ci2 + ci3;
779 tr2 = ref(cc,i - 1 + k*ido) + tr11*cr2 + tr12*cr3;
780 ti2 = ref(cc,i + k*ido) + tr11*ci2 + tr12*ci3;
781 tr3 = ref(cc,i - 1 + k*ido) + tr12*cr2 + tr11*cr3;
782 ti3 = ref(cc,i + k*ido) + tr12*ci2 + tr11*ci3;
783 tr5 = ti11*cr5 + ti12*cr4;
784 ti5 = ti11*ci5 + ti12*ci4;
785 tr4 = ti12*cr5 - ti11*cr4;
786 ti4 = ti12*ci5 - ti11*ci4;
787 ch[i - 1 + (5*k + 2)*ido] = tr2 + tr5;
788 ch[ic - 1 + (5*k + 1)*ido] = tr2 - tr5;
789 ch[i + (5*k + 2)*ido] = ti2 + ti5;
790 ch[ic + (5*k + 1)*ido] = ti5 - ti2;
791 ch[i - 1 + (5*k + 4)*ido] = tr3 + tr4;
792 ch[ic - 1 + (5*k + 3)*ido] = tr3 - tr4;
793 ch[i + (5*k + 4)*ido] = ti3 + ti4;
794 ch[ic + (5*k + 3)*ido] = ti4 - ti3;
800 static void radb5(int ido, int l1, const Treal cc[], Treal ch[],
801 const Treal wa1[], const Treal wa2[], const Treal wa3[], const Treal wa4[])
803 static const Treal tr11 = 0.309016994374947;
804 static const Treal ti11 = 0.951056516295154;
805 static const Treal tr12 = -0.809016994374947;
806 static const Treal ti12 = 0.587785252292473;
808 Treal ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3,
809 ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;
810 for (k = 0; k < l1; k++) {
811 ti5 = 2*ref(cc,(5*k + 2)*ido);
812 ti4 = 2*ref(cc,(5*k + 4)*ido);
813 tr2 = 2*ref(cc,ido-1 + (5*k + 1)*ido);
814 tr3 = 2*ref(cc,ido-1 + (5*k + 3)*ido);
815 ch[k*ido] = ref(cc,5*k*ido) + tr2 + tr3;
816 cr2 = ref(cc,5*k*ido) + tr11*tr2 + tr12*tr3;
817 cr3 = ref(cc,5*k*ido) + tr12*tr2 + tr11*tr3;
818 ci5 = ti11*ti5 + ti12*ti4;
819 ci4 = ti12*ti5 - ti11*ti4;
820 ch[(k + l1)*ido] = cr2 - ci5;
821 ch[(k + 2*l1)*ido] = cr3 - ci4;
822 ch[(k + 3*l1)*ido] = cr3 + ci4;
823 ch[(k + 4*l1)*ido] = cr2 + ci5;
825 if (ido == 1) return;
826 for (k = 0; k < l1; ++k) {
827 for (i = 2; i < ido; i += 2) {
829 ti5 = ref(cc,i + (5*k + 2)*ido) + ref(cc,ic + (5*k + 1)*ido);
830 ti2 = ref(cc,i + (5*k + 2)*ido) - ref(cc,ic + (5*k + 1)*ido);
831 ti4 = ref(cc,i + (5*k + 4)*ido) + ref(cc,ic + (5*k + 3)*ido);
832 ti3 = ref(cc,i + (5*k + 4)*ido) - ref(cc,ic + (5*k + 3)*ido);
833 tr5 = ref(cc,i - 1 + (5*k + 2)*ido) - ref(cc,ic - 1 + (5*k + 1)*ido);
834 tr2 = ref(cc,i - 1 + (5*k + 2)*ido) + ref(cc,ic - 1 + (5*k + 1)*ido);
835 tr4 = ref(cc,i - 1 + (5*k + 4)*ido) - ref(cc,ic - 1 + (5*k + 3)*ido);
836 tr3 = ref(cc,i - 1 + (5*k + 4)*ido) + ref(cc,ic - 1 + (5*k + 3)*ido);
837 ch[i - 1 + k*ido] = ref(cc,i - 1 + 5*k*ido) + tr2 + tr3;
838 ch[i + k*ido] = ref(cc,i + 5*k*ido) + ti2 + ti3;
839 cr2 = ref(cc,i - 1 + 5*k*ido) + tr11*tr2 + tr12*tr3;
841 ci2 = ref(cc,i + 5*k*ido) + tr11*ti2 + tr12*ti3;
842 cr3 = ref(cc,i - 1 + 5*k*ido) + tr12*tr2 + tr11*tr3;
844 ci3 = ref(cc,i + 5*k*ido) + tr12*ti2 + tr11*ti3;
845 cr5 = ti11*tr5 + ti12*tr4;
846 ci5 = ti11*ti5 + ti12*ti4;
847 cr4 = ti12*tr5 - ti11*tr4;
848 ci4 = ti12*ti5 - ti11*ti4;
857 ch[i - 1 + (k + l1)*ido] = wa1[i - 2]*dr2 - wa1[i - 1]*di2;
858 ch[i + (k + l1)*ido] = wa1[i - 2]*di2 + wa1[i - 1]*dr2;
859 ch[i - 1 + (k + 2*l1)*ido] = wa2[i - 2]*dr3 - wa2[i - 1]*di3;
860 ch[i + (k + 2*l1)*ido] = wa2[i - 2]*di3 + wa2[i - 1]*dr3;
861 ch[i - 1 + (k + 3*l1)*ido] = wa3[i - 2]*dr4 - wa3[i - 1]*di4;
862 ch[i + (k + 3*l1)*ido] = wa3[i - 2]*di4 + wa3[i - 1]*dr4;
863 ch[i - 1 + (k + 4*l1)*ido] = wa4[i - 2]*dr5 - wa4[i - 1]*di5;
864 ch[i + (k + 4*l1)*ido] = wa4[i - 2]*di5 + wa4[i - 1]*dr5;
870 static void radfg(int ido, int ip, int l1, int idl1,
871 Treal cc[], Treal ch[], const Treal wa[])
873 static const Treal twopi = 6.28318530717959;
874 int idij, ipph, i, j, k, l, j2, ic, jc, lc, ik, is, nbd;
875 Treal dc2, ai1, ai2, ar1, ar2, ds2, dcp, arg, dsp, ar1h, ar2h;
882 for (ik=0; ik<idl1; ik++) ch[ik] = cc[ik];
885 ch[(k + j*l1)*ido] = cc[(k + j*l1)*ido];
888 for (j=1; j<ip; j++) {
891 for (i=2; i<ido; i+=2) {
893 for (k=0; k<l1; k++) {
894 ch[i - 1 + (k + j*l1)*ido] =
895 wa[idij - 1]*cc[i - 1 + (k + j*l1)*ido] + wa[idij]*cc[i + (k + j*l1)*ido];
896 ch[i + (k + j*l1)*ido] =
897 wa[idij - 1]*cc[i + (k + j*l1)*ido] - wa[idij]*cc[i - 1 + (k + j*l1)*ido];
903 for (j=1; j<ip; j++) {
905 for (k=0; k<l1; k++) {
907 for (i=2; i<ido; i+=2) {
909 ch[i - 1 + (k + j*l1)*ido] =
910 wa[idij - 1]*cc[i - 1 + (k + j*l1)*ido] + wa[idij]*cc[i + (k + j*l1)*ido];
911 ch[i + (k + j*l1)*ido] =
912 wa[idij - 1]*cc[i + (k + j*l1)*ido] - wa[idij]*cc[i - 1 + (k + j*l1)*ido];
918 for (j=1; j<ipph; j++) {
920 for (k=0; k<l1; k++) {
921 for (i=2; i<ido; i+=2) {
922 cc[i - 1 + (k + j*l1)*ido] = ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
923 cc[i - 1 + (k + jc*l1)*ido] = ch[i + (k + j*l1)*ido] - ch[i + (k + jc*l1)*ido];
924 cc[i + (k + j*l1)*ido] = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
925 cc[i + (k + jc*l1)*ido] = ch[i - 1 + (k + jc*l1)*ido] - ch[i - 1 + (k + j*l1)*ido];
930 for (j=1; j<ipph; j++) {
932 for (i=2; i<ido; i+=2) {
933 for (k=0; k<l1; k++) {
934 cc[i - 1 + (k + j*l1)*ido] =
935 ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
936 cc[i - 1 + (k + jc*l1)*ido] = ch[i + (k + j*l1)*ido] - ch[i + (k + jc*l1)*ido];
937 cc[i + (k + j*l1)*ido] = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
938 cc[i + (k + jc*l1)*ido] = ch[i - 1 + (k + jc*l1)*ido] - ch[i - 1 + (k + j*l1)*ido];
943 } else { /* now ido == 1 */
944 for (ik=0; ik<idl1; ik++) cc[ik] = ch[ik];
946 for (j=1; j<ipph; j++) {
948 for (k=0; k<l1; k++) {
949 cc[(k + j*l1)*ido] = ch[(k + j*l1)*ido] + ch[(k + jc*l1)*ido];
950 cc[(k + jc*l1)*ido] = ch[(k + jc*l1)*ido] - ch[(k + j*l1)*ido];
956 for (l=1; l<ipph; l++) {
958 ar1h = dcp*ar1 - dsp*ai1;
959 ai1 = dcp*ai1 + dsp*ar1;
961 for (ik=0; ik<idl1; ik++) {
962 ch[ik + l*idl1] = cc[ik] + ar1*cc[ik + idl1];
963 ch[ik + lc*idl1] = ai1*cc[ik + (ip-1)*idl1];
969 for (j=2; j<ipph; j++) {
971 ar2h = dc2*ar2 - ds2*ai2;
972 ai2 = dc2*ai2 + ds2*ar2;
974 for (ik=0; ik<idl1; ik++) {
975 ch[ik + l*idl1] += ar2*cc[ik + j*idl1];
976 ch[ik + lc*idl1] += ai2*cc[ik + jc*idl1];
980 for (j=1; j<ipph; j++)
981 for (ik=0; ik<idl1; ik++)
982 ch[ik] += cc[ik + j*idl1];
985 for (k=0; k<l1; k++) {
986 for (i=0; i<ido; i++) {
987 ref(cc,i + k*ip*ido) = ch[i + k*ido];
991 for (i=0; i<ido; i++) {
992 for (k=0; k<l1; k++) {
993 ref(cc,i + k*ip*ido) = ch[i + k*ido];
997 for (j=1; j<ipph; j++) {
1000 for (k=0; k<l1; k++) {
1001 ref(cc,ido-1 + (j2 - 1 + k*ip)*ido) =
1003 ref(cc,(j2 + k*ip)*ido) =
1004 ch[(k + jc*l1)*ido];
1007 if (ido == 1) return;
1009 for (j=1; j<ipph; j++) {
1012 for (k=0; k<l1; k++) {
1013 for (i=2; i<ido; i+=2) {
1015 ref(cc,i - 1 + (j2 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
1016 ref(cc,ic - 1 + (j2 - 1 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] - ch[i - 1 + (k + jc*l1)*ido];
1017 ref(cc,i + (j2 + k*ip)*ido) = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
1018 ref(cc,ic + (j2 - 1 + k*ip)*ido) = ch[i + (k + jc*l1)*ido] - ch[i + (k + j*l1)*ido];
1023 for (j=1; j<ipph; j++) {
1026 for (i=2; i<ido; i+=2) {
1028 for (k=0; k<l1; k++) {
1029 ref(cc,i - 1 + (j2 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
1030 ref(cc,ic - 1 + (j2 - 1 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] - ch[i - 1 + (k + jc*l1)*ido];
1031 ref(cc,i + (j2 + k*ip)*ido) = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
1032 ref(cc,ic + (j2 - 1 + k*ip)*ido) = ch[i + (k + jc*l1)*ido] - ch[i + (k + j*l1)*ido];
1040 static void radbg(int ido, int ip, int l1, int idl1,
1041 Treal cc[], Treal ch[], const Treal wa[])
1043 static const Treal twopi = 6.28318530717959;
1044 int idij, ipph, i, j, k, l, j2, ic, jc, lc, ik, is;
1045 Treal dc2, ai1, ai2, ar1, ar2, ds2;
1047 Treal dcp, arg, dsp, ar1h, ar2h;
1051 nbd = (ido - 1) / 2;
1052 ipph = (ip + 1) / 2;
1054 for (k=0; k<l1; k++) {
1055 for (i=0; i<ido; i++) {
1056 ch[i + k*ido] = ref(cc,i + k*ip*ido);
1060 for (i=0; i<ido; i++) {
1061 for (k=0; k<l1; k++) {
1062 ch[i + k*ido] = ref(cc,i + k*ip*ido);
1066 for (j=1; j<ipph; j++) {
1069 for (k=0; k<l1; k++) {
1070 ch[(k + j*l1)*ido] = ref(cc,ido-1 + (j2 - 1 + k*ip)*ido) + ref(cc,ido-1 + (j2 - 1 + k*ip)*
1072 ch[(k + jc*l1)*ido] = ref(cc,(j2 + k*ip)*ido) + ref(cc,(j2 + k*ip)*ido);
1078 for (j=1; j<ipph; j++) {
1080 for (k=0; k<l1; k++) {
1081 for (i=2; i<ido; i+=2) {
1083 ch[i - 1 + (k + j*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) + ref(cc,
1084 ic - 1 + (2*j - 1 + k*ip)*ido);
1085 ch[i - 1 + (k + jc*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) -
1086 ref(cc,ic - 1 + (2*j - 1 + k*ip)*ido);
1087 ch[i + (k + j*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) - ref(cc,ic
1088 + (2*j - 1 + k*ip)*ido);
1089 ch[i + (k + jc*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) + ref(cc,ic
1090 + (2*j - 1 + k*ip)*ido);
1095 for (j=1; j<ipph; j++) {
1097 for (i=2; i<ido; i+=2) {
1099 for (k=0; k<l1; k++) {
1100 ch[i - 1 + (k + j*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) + ref(cc,
1101 ic - 1 + (2*j - 1 + k*ip)*ido);
1102 ch[i - 1 + (k + jc*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) -
1103 ref(cc,ic - 1 + (2*j - 1 + k*ip)*ido);
1104 ch[i + (k + j*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) - ref(cc,ic
1105 + (2*j - 1 + k*ip)*ido);
1106 ch[i + (k + jc*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) + ref(cc,ic
1107 + (2*j - 1 + k*ip)*ido);
1116 for (l=1; l<ipph; l++) {
1118 ar1h = dcp*ar1 - dsp*ai1;
1119 ai1 = dcp*ai1 + dsp*ar1;
1121 for (ik=0; ik<idl1; ik++) {
1122 cc[ik + l*idl1] = ch[ik] + ar1*ch[ik + idl1];
1123 cc[ik + lc*idl1] = ai1*ch[ik + (ip-1)*idl1];
1129 for (j=2; j<ipph; j++) {
1131 ar2h = dc2*ar2 - ds2*ai2;
1132 ai2 = dc2*ai2 + ds2*ar2;
1134 for (ik=0; ik<idl1; ik++) {
1135 cc[ik + l*idl1] += ar2*ch[ik + j*idl1];
1136 cc[ik + lc*idl1] += ai2*ch[ik + jc*idl1];
1140 for (j=1; j<ipph; j++) {
1141 for (ik=0; ik<idl1; ik++) {
1142 ch[ik] += ch[ik + j*idl1];
1145 for (j=1; j<ipph; j++) {
1147 for (k=0; k<l1; k++) {
1148 ch[(k + j*l1)*ido] = cc[(k + j*l1)*ido] - cc[(k + jc*l1)*ido];
1149 ch[(k + jc*l1)*ido] = cc[(k + j*l1)*ido] + cc[(k + jc*l1)*ido];
1153 if (ido == 1) return;
1155 for (j=1; j<ipph; j++) {
1157 for (k=0; k<l1; k++) {
1158 for (i=2; i<ido; i+=2) {
1159 ch[i - 1 + (k + j*l1)*ido] = cc[i - 1 + (k + j*l1)*ido] - cc[i + (k + jc*l1)*ido];
1160 ch[i - 1 + (k + jc*l1)*ido] = cc[i - 1 + (k + j*l1)*ido] + cc[i + (k + jc*l1)*ido];
1161 ch[i + (k + j*l1)*ido] = cc[i + (k + j*l1)*ido] + cc[i - 1 + (k + jc*l1)*ido];
1162 ch[i + (k + jc*l1)*ido] = cc[i + (k + j*l1)*ido] - cc[i - 1 + (k + jc*l1)*ido];
1167 for (j=1; j<ipph; j++) {
1169 for (i=2; i<ido; i+=2) {
1170 for (k=0; k<l1; k++) {
1171 ch[i - 1 + (k + j*l1)*ido] = cc[i - 1 + (k + j*l1)*ido] - cc[i + (k + jc*l1)*ido];
1172 ch[i - 1 + (k + jc*l1)*ido] = cc[i - 1 + (k + j *l1)*ido] + cc[i + (k + jc*l1)*ido];
1173 ch[i + (k + j*l1)*ido] = cc[i + (k + j*l1)*ido] + cc[i - 1 + (k + jc*l1)*ido];
1174 ch[i + (k + jc*l1)*ido] = cc[i + (k + j*l1)*ido] - cc[i - 1 + (k + jc*l1)*ido];
1179 for (ik=0; ik<idl1; ik++) cc[ik] = ch[ik];
1180 for (j=1; j<ip; j++)
1181 for (k=0; k<l1; k++)
1182 cc[(k + j*l1)*ido] = ch[(k + j*l1)*ido];
1185 for (j=1; j<ip; j++) {
1188 for (i=2; i<ido; i+=2) {
1190 for (k=0; k<l1; k++) {
1191 cc[i - 1 + (k + j*l1)*ido] = wa[idij - 1]*ch[i - 1 + (k + j*l1)*ido] - wa[idij]*
1192 ch[i + (k + j*l1)*ido];
1193 cc[i + (k + j*l1)*ido] = wa[idij - 1]*ch[i + (k + j*l1)*ido] + wa[idij]*ch[i - 1 + (k + j*l1)*ido];
1199 for (j=1; j<ip; j++) {
1201 for (k=0; k<l1; k++) {
1203 for (i=2; i<ido; i+=2) {
1205 cc[i - 1 + (k + j*l1)*ido] = wa[idij-1]*ch[i - 1 + (k + j*l1)*ido] - wa[idij]*
1206 ch[i + (k + j*l1)*ido];
1207 cc[i + (k + j*l1)*ido] = wa[idij-1]*ch[i + (k + j*l1)*ido] + wa[idij]*ch[i - 1 + (k + j*l1)*ido];
1214 /* ----------------------------------------------------------------------
1215 cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs.
1216 ---------------------------------------------------------------------- */
1218 void fftpack_cfftf1(int n, Treal c[], Treal ch[], const Treal wa[], const int ifac[MAXFAC+2], int isign)
1222 int na, nf, ip, iw, ix2, ix3, ix4, nac, ido, idl1;
1223 Treal *cinput, *coutput;
1228 for (k1=2; k1<=nf+1; k1++) {
1245 passf4(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], isign);
1249 passf2(idot, l1, cinput, coutput, &wa[iw], isign);
1254 passf3(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], isign);
1261 passf5(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
1265 passf(&nac, idot, ip, l1, idl1, cinput, coutput, &wa[iw], isign);
1266 if (nac != 0) na = !na;
1269 iw += (ip - 1)*idot;
1271 if (na == 0) return;
1272 for (i=0; i<2*n; i++) c[i] = ch[i];
1276 void fftpack_cfftf(int n, Treal c[], Treal wsave[])
1282 fftpack_cfftf1(n, c, wsave, wsave+iw1, (int*)(wsave+iw2), -1);
1286 void fftpack_cfftb(int n, Treal c[], Treal wsave[])
1292 fftpack_cfftf1(n, c, wsave, wsave+iw1, (int*)(wsave+iw2), +1);
1296 static void factorize(int n, int ifac[MAXFAC+2], const int ntryh[NSPECIAL])
1297 /* Factorize n in factors in ntryh and rest. On exit,
1298 ifac[0] contains n and ifac[1] contains number of factors,
1299 the factors start from ifac[2]. */
1301 int ntry=3, i, j=0, ib, nf=0, nl=n, nq, nr;
1311 if (nr != 0) goto startloop;
1313 ifac[nf + 1] = ntry;
1315 if (ntry == 2 && nf != 1) {
1316 for (i=2; i<=nf; i++) {
1318 ifac[ib + 1] = ifac[ib];
1328 void fftpack_cffti1(int n, Treal wa[], int ifac[MAXFAC+2])
1330 static const Treal twopi = 6.28318530717959;
1331 Treal arg, argh, argld, fi;
1337 static const int ntryh[NSPECIAL] = {
1338 3,4,2,5 }; /* Do not change the order of these. */
1340 factorize(n,ifac,ntryh);
1342 argh = twopi/(Treal)n;
1345 for (k1=1; k1<=nf; k1++) {
1350 idot = ido + ido + 2;
1352 for (j=1; j<=ipm; j++) {
1359 for (ii=4; ii<=idot; ii+=2) {
1376 void fftpack_cffti(int n, Treal wsave[])
1382 fftpack_cffti1(n, wsave+iw1, (int*)(wsave+iw2));
1385 /* ----------------------------------------------------------------------
1386 rfftf1, rfftb1, rfftf, rfftb, rffti1, rffti. Treal FFTs.
1387 ---------------------------------------------------------------------- */
1389 void fftpack_rfftf1(int n, Treal c[], Treal ch[], const Treal wa[], const int ifac[MAXFAC+2])
1392 int k1, l1, l2, na, kh, nf, ip, iw, ix2, ix3, ix4, ido, idl1;
1393 Treal *cinput, *coutput;
1398 for (k1 = 1; k1 <= nf; ++k1) {
1417 radf4(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3]);
1420 radf2(ido, l1, cinput, coutput, &wa[iw]);
1424 radf3(ido, l1, cinput, coutput, &wa[iw], &wa[ix2]);
1430 radf5(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);
1436 radfg(ido, ip, l1, idl1, c, ch, &wa[iw]);
1439 radfg(ido, ip, l1, idl1, ch, c, &wa[iw]);
1445 if (na == 1) return;
1446 for (i = 0; i < n; i++) c[i] = ch[i];
1450 void fftpack_rfftb1(int n, Treal c[], Treal ch[], const Treal wa[], const int ifac[MAXFAC+2])
1453 int k1, l1, l2, na, nf, ip, iw, ix2, ix3, ix4, ido, idl1;
1454 Treal *cinput, *coutput;
1459 for (k1=1; k1<=nf; k1++) {
1475 radb4(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3]);
1479 radb2(ido, l1, cinput, coutput, &wa[iw]);
1484 radb3(ido, l1, cinput, coutput, &wa[iw], &wa[ix2]);
1491 radb5(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);
1495 radbg(ido, ip, l1, idl1, cinput, coutput, &wa[iw]);
1496 if (ido == 1) na = !na;
1501 if (na == 0) return;
1502 for (i=0; i<n; i++) c[i] = ch[i];
1506 void fftpack_rfftf(int n, Treal r[], Treal wsave[])
1509 fftpack_rfftf1(n, r, wsave, wsave+n, (int*)(wsave+2*n));
1513 void fftpack_rfftb(int n, Treal r[], Treal wsave[])
1516 fftpack_rfftb1(n, r, wsave, wsave+n, (int*)(wsave+2*n));
1520 void fftpack_rffti1(int n, Treal wa[], int ifac[MAXFAC+2])
1522 static const Treal twopi = 6.28318530717959;
1523 Treal arg, argh, argld, fi;
1526 int ld, ii, nf, ip, is;
1528 static const int ntryh[NSPECIAL] = {
1529 4,2,3,5 }; /* Do not change the order of these. */
1530 factorize(n,ifac,ntryh);
1536 if (nfm1 == 0) return;
1537 for (k1 = 1; k1 <= nfm1; k1++) {
1543 for (j = 1; j <= ipm; ++j) {
1546 argld = (Treal) ld*argh;
1548 for (ii = 3; ii <= ido; ii += 2) {
1552 wa[i - 2] = cos(arg);
1553 wa[i - 1] = sin(arg);
1562 void fftpack_rffti(int n, Treal wsave[])
1565 fftpack_rffti1(n, wsave+n, (int*)(wsave+2*n));