56 if (sz==0)
return NULL;
59 fprintf (stderr,
"%s, %i (%s):\n%s\n",
60 __FILE__, __LINE__, __func__,
70#define RALLOC(type,num) \
71 ((type *)util_malloc_((num)*sizeof(type)))
74 { if ((ptr) != 0) free (ptr); (ptr) = NULL; }
82#define SWAP(a,b,type) \
83 do { type tmp_=(a); (a)=(b); (b)=tmp_; } while(0)
92#define WA(x,i) wa[(i)+(x)*ido]
93#define CH(a,b,c) ch[(a)+ido*((b)+l1*(c))]
94#define CC(a,b,c) cc[(a)+ido*((b)+cdim*(c))]
95#define PM(a,b,c,d) { a=c+d; b=c-d; }
96#define PMC(a,b,c,d) { a.r=c.r+d.r; a.i=c.i+d.i; b.r=c.r-d.r; b.i=c.i-d.i; }
97#define ADDC(a,b,c) { a.r=b.r+c.r; a.i=b.i+c.i; }
98#define SCALEC(a,b) { a.r*=b; a.i*=b; }
99#define CONJFLIPC(a) { double tmp_=a.r; a.r=-a.i; a.i=tmp_; }
101#define MULPM(a,b,c,d,e,f) { a=c*e+d*f; b=c*f-d*e; }
103#define CONCAT(a,b) a ## b
105#define X(arg) CONCAT(passb,arg)
111#define X(arg) CONCAT(passf,arg)
117#define CC(a,b,c) cc[(a)+ido*((b)+l1*(c))]
118#define CH(a,b,c) ch[(a)+ido*((b)+cdim*(c))]
120 static void radf2 (
size_t ido,
size_t l1,
const double *cc,
double *ch,
128 PM (
CH(0,0,k),
CH(ido-1,1,k),
CC(0,k,0),
CC(0,k,1))
132 CH( 0,1,k) = -
CC(ido-1,k,1);
133 CH(ido-1,0,k) =
CC(ido-1,k,0);
137 for (i=2; i<ido; i+=2)
140 MULPM (tr2,ti2,
WA(0,i-2),
WA(0,i-1),
CC(i-1,k,1),
CC(i,k,1))
141 PM (
CH(i-1,0,k),
CH(ic-1,1,k),
CC(i-1,k,0),tr2)
142 PM (
CH(i ,0,k),
CH(ic ,1,k),ti2,
CC(i ,k,0))
146 static void radf3(
size_t ido,
size_t l1,
const double *cc,
double *ch,
150 static const double taur=-0.5, taui=0.86602540378443864676;
152 double ci2, di2, di3, cr2, dr2, dr3, ti2, ti3, tr2, tr3;
156 cr2=
CC(0,k,1)+
CC(0,k,2);
157 CH(0,0,k) =
CC(0,k,0)+cr2;
158 CH(0,2,k) = taui*(
CC(0,k,2)-
CC(0,k,1));
159 CH(ido-1,1,k) =
CC(0,k,0)+taur*cr2;
163 for (i=2; i<ido; i+=2)
166 MULPM (dr2,di2,
WA(0,i-2),
WA(0,i-1),
CC(i-1,k,1),
CC(i,k,1))
167 MULPM (dr3,di3,
WA(1,i-2),
WA(1,i-1),
CC(i-1,k,2),
CC(i,k,2))
170 CH(i-1,0,k) =
CC(i-1,k,0)+cr2;
171 CH(i ,0,k) =
CC(i ,k,0)+ci2;
172 tr2 =
CC(i-1,k,0)+taur*cr2;
173 ti2 =
CC(i ,k,0)+taur*ci2;
174 tr3 = taui*(di2-di3);
175 ti3 = taui*(dr3-dr2);
176 PM(
CH(i-1,2,k),
CH(ic-1,1,k),tr2,tr3)
177 PM(
CH(i ,2,k),
CH(ic ,1,k),ti3,ti2)
181 static
void radf4(
size_t ido,
size_t l1, const
double *cc,
double *ch,
185 static const double hsqt2=0.70710678118654752440;
187 double ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
191 PM (tr1,
CH(0,2,k),
CC(0,k,3),
CC(0,k,1))
192 PM (tr2,
CH(ido-1,1,k),
CC(0,k,0),
CC(0,k,2))
193 PM (
CH(0,0,k),
CH(ido-1,3,k),tr2,tr1)
198 ti1=-hsqt2*(
CC(ido-1,k,1)+
CC(ido-1,k,3));
199 tr1= hsqt2*(
CC(ido-1,k,1)-
CC(ido-1,k,3));
200 PM (
CH(ido-1,0,k),
CH(ido-1,2,k),
CC(ido-1,k,0),tr1)
201 PM (
CH( 0,3,k),
CH( 0,1,k),ti1,
CC(ido-1,k,2))
205 for (i=2; i<ido; i+=2)
208 MULPM(cr2,ci2,
WA(0,i-2),
WA(0,i-1),
CC(i-1,k,1),
CC(i,k,1))
209 MULPM(cr3,ci3,
WA(1,i-2),
WA(1,i-1),
CC(i-1,k,2),
CC(i,k,2))
210 MULPM(cr4,ci4,
WA(2,i-2),
WA(2,i-1),
CC(i-1,k,3),
CC(i,k,3))
213 PM(tr2,tr3,
CC(i-1,k,0),cr3)
214 PM(ti2,ti3,
CC(i ,k,0),ci3)
215 PM(
CH(i-1,0,k),
CH(ic-1,3,k),tr2,tr1)
216 PM(
CH(i ,0,k),
CH(ic ,3,k),ti1,ti2)
217 PM(
CH(i-1,2,k),
CH(ic-1,1,k),tr3,ti4)
218 PM(
CH(i ,2,k),
CH(ic ,1,k),tr4,ti3)
222 static
void radf5(
size_t ido,
size_t l1, const
double *cc,
double *ch,
226 static const double tr11= 0.3090169943749474241, ti11=0.95105651629515357212,
227 tr12=-0.8090169943749474241, ti12=0.58778525229247312917;
229 double ci2, di2, ci4, ci5, di3, di4, di5, ci3, cr2, cr3, dr2, dr3,
230 dr4, dr5, cr5, cr4, ti2, ti3, ti5, ti4, tr2, tr3, tr4, tr5;
234 PM (cr2,ci5,
CC(0,k,4),
CC(0,k,1))
235 PM (cr3,ci4,
CC(0,k,3),
CC(0,k,2))
236 CH(0,0,k)=
CC(0,k,0)+cr2+cr3;
237 CH(ido-1,1,k)=
CC(0,k,0)+tr11*cr2+tr12*cr3;
238 CH(0,2,k)=ti11*ci5+ti12*ci4;
239 CH(ido-1,3,k)=
CC(0,k,0)+tr12*cr2+tr11*cr3;
240 CH(0,4,k)=ti12*ci5-ti11*ci4;
244 for (i=2; i<ido; i+=2)
247 MULPM (dr2,di2,
WA(0,i-2),
WA(0,i-1),
CC(i-1,k,1),
CC(i,k,1))
248 MULPM (dr3,di3,
WA(1,i-2),
WA(1,i-1),
CC(i-1,k,2),
CC(i,k,2))
249 MULPM (dr4,di4,
WA(2,i-2),
WA(2,i-1),
CC(i-1,k,3),
CC(i,k,3))
250 MULPM (dr5,di5,
WA(3,i-2),
WA(3,i-1),
CC(i-1,k,4),
CC(i,k,4))
255 CH(i-1,0,k)=
CC(i-1,k,0)+cr2+cr3;
256 CH(i ,0,k)=
CC(i ,k,0)+ci2+ci3;
257 tr2=
CC(i-1,k,0)+tr11*cr2+tr12*cr3;
258 ti2=
CC(i ,k,0)+tr11*ci2+tr12*ci3;
259 tr3=
CC(i-1,k,0)+tr12*cr2+tr11*cr3;
260 ti3=
CC(i ,k,0)+tr12*ci2+tr11*ci3;
261 MULPM(tr5,tr4,cr5,cr4,ti11,ti12)
262 MULPM(ti5,ti4,ci5,ci4,ti11,ti12)
263 PM(
CH(i-1,2,k),
CH(ic-1,1,k),tr2,tr5)
264 PM(
CH(i ,2,k),
CH(ic ,1,k),ti5,ti2)
265 PM(
CH(i-1,4,k),
CH(ic-1,3,k),tr3,tr4)
266 PM(
CH(i ,4,k),
CH(ic ,3,k),ti4,ti3)
272#define CH(a,b,c) ch[(a)+ido*((b)+l1*(c))]
273#define CC(a,b,c) cc[(a)+ido*((b)+cdim*(c))]
274#define C1(a,b,c) cc[(a)+ido*((b)+l1*(c))]
275#define C2(a,b) cc[(a)+idl1*(b)]
276#define CH2(a,b) ch[(a)+idl1*(b)]
277 static void radfg(
size_t ido,
size_t ip,
size_t l1,
size_t idl1,
278 double *cc,
double *ch,
const double *wa)
280 const size_t cdim=ip;
281 static const double twopi=6.28318530717958647692;
282 size_t idij, ipph, i, j, k, l, j2, ic, jc, lc, ik;
283 double ai1, ai2, ar1, ar2,
arg;
290 std::memcpy(ch,cc,idl1*
sizeof(
double));
297 for(i=2; i<ido; i+=2,idij+=2)
298 MULPM(
CH(i-1,k,j),
CH(i,k,j),wa[idij-1],wa[idij],
C1(i-1,k,j),
C1(i,k,j))
301 for(j=1,jc=ip-1; j<ipph; j++,jc--)
303 for(i=2; i<ido; i+=2)
305 PM(
C1(i-1,k,j),
C1(i ,k,jc),
CH(i-1,k,jc),
CH(i-1,k,j ))
306 PM(
C1(i ,k,j),
C1(i-1,k,jc),
CH(i ,k,j ),
CH(i ,k,jc))
310 std::memcpy(cc,ch,idl1*
sizeof(
double));
312 for(j=1,jc=ip-1; j<ipph; j++,jc--)
314 PM(
C1(0,k,j),
C1(0,k,jc),
CH(0,k,jc),
CH(0,k,j))
316 csarr=
RALLOC(
double,2*ip);
320 csarr[2]=csarr[2*ip-2]=
cos(
arg);
321 csarr[3]=
sin(
arg); csarr[2*ip-1]=-csarr[3];
322 for (i=2; i<=ip/2; ++i)
324 csarr[2*i]=csarr[2*ip-2*i]=
cos(i*
arg);
326 csarr[2*ip-2*i+1]=-csarr[2*i+1];
328 for(l=1,lc=ip-1; l<ipph; l++,lc--)
332 for(ik=0; ik<idl1; ik++)
334 CH2(ik,l)=
C2(ik,0)+ar1*
C2(ik,1);
335 CH2(ik,lc)=ai1*
C2(ik,ip-1);
338 for(j=2,jc=ip-2; j<ipph; j++,jc--)
341 if (aidx>=2*ip) aidx-=2*ip;
344 for(ik=0; ik<idl1; ik++)
346 CH2(ik,l )+=ar2*
C2(ik,j );
347 CH2(ik,lc)+=ai2*
C2(ik,jc);
353 for(j=1; j<ipph; j++)
354 for(ik=0; ik<idl1; ik++)
358 std::memcpy(&
CC(0,0,k),&
CH(0,k,0),ido*
sizeof(
double));
359 for(j=1; j<ipph; j++)
365 CC(ido-1,j2-1,k) =
CH(0,k,j );
366 CC(0 ,j2 ,k) =
CH(0,k,jc);
371 for(j=1; j<ipph; j++)
376 for(i=2; i<ido; i+=2)
379 PM (
CC(i-1,j2,k),
CC(ic-1,j2-1,k),
CH(i-1,k,j ),
CH(i-1,k,jc))
380 PM (
CC(i ,j2,k),
CC(ic ,j2-1,k),
CH(i ,k,jc),
CH(i ,k,j ))
387#define CH(a,b,c) ch[(a)+ido*((b)+l1*(c))]
388#define CC(a,b,c) cc[(a)+ido*((b)+cdim*(c))]
390 static void radb2(
size_t ido,
size_t l1,
const double *cc,
double *ch,
398 PM (
CH(0,k,0),
CH(0,k,1),
CC(0,0,k),
CC(ido-1,1,k))
402 CH(ido-1,k,0) = 2*
CC(ido-1,0,k);
403 CH(ido-1,k,1) = -2*
CC(0 ,1,k);
407 for (i=2; i<ido; i+=2)
410 PM (
CH(i-1,k,0),tr2,
CC(i-1,0,k),
CC(ic-1,1,k))
411 PM (ti2,
CH(i ,k,0),
CC(i ,0,k),
CC(ic ,1,k))
412 MULPM (
CH(i,k,1),
CH(i-1,k,1),
WA(0,i-2),
WA(0,i-1),ti2,tr2)
416 static void radb3(
size_t ido,
size_t l1,
const double *cc,
double *ch,
420 static const double taur=-0.5, taui=0.86602540378443864676;
422 double ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
427 cr2=
CC(0,0,k)+taur*tr2;
428 CH(0,k,0)=
CC(0,0,k)+tr2;
429 ci3=2*taui*
CC(0,2,k);
430 PM (
CH(0,k,2),
CH(0,k,1),cr2,ci3);
434 for (i=2; i<ido; i+=2)
437 tr2=
CC(i-1,2,k)+
CC(ic-1,1,k);
438 ti2=
CC(i ,2,k)-
CC(ic ,1,k);
439 cr2=
CC(i-1,0,k)+taur*tr2;
440 ci2=
CC(i ,0,k)+taur*ti2;
441 CH(i-1,k,0)=
CC(i-1,0,k)+tr2;
442 CH(i ,k,0)=
CC(i ,0,k)+ti2;
443 cr3=taui*(
CC(i-1,2,k)-
CC(ic-1,1,k));
444 ci3=taui*(
CC(i ,2,k)+
CC(ic ,1,k));
447 MULPM(
CH(i,k,1),
CH(i-1,k,1),
WA(0,i-2),
WA(0,i-1),di2,dr2)
448 MULPM(
CH(i,k,2),
CH(i-1,k,2),
WA(1,i-2),
WA(1,i-1),di3,dr3)
452 static void radb4(
size_t ido,
size_t l1,
const double *cc,
double *ch,
456 static const double sqrt2=1.41421356237309504880;
458 double ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
462 PM (tr2,tr1,
CC(0,0,k),
CC(ido-1,3,k))
465 PM (
CH(0,k,0),
CH(0,k,2),tr2,tr3)
466 PM (
CH(0,k,3),
CH(0,k,1),tr1,tr4)
471 PM (ti1,ti2,
CC(0 ,3,k),
CC(0 ,1,k))
472 PM (tr2,tr1,
CC(ido-1,0,k),
CC(ido-1,2,k))
473 CH(ido-1,k,0)=tr2+tr2;
474 CH(ido-1,k,1)=sqrt2*(tr1-ti1);
475 CH(ido-1,k,2)=ti2+ti2;
476 CH(ido-1,k,3)=-sqrt2*(tr1+ti1);
480 for (i=2; i<ido; i+=2)
483 PM (tr2,tr1,
CC(i-1,0,k),
CC(ic-1,3,k))
484 PM (ti1,ti2,
CC(i ,0,k),
CC(ic ,3,k))
485 PM (tr4,ti3,
CC(i ,2,k),
CC(ic ,1,k))
486 PM (tr3,ti4,
CC(i-1,2,k),
CC(ic-1,1,k))
487 PM (
CH(i-1,k,0),cr3,tr2,tr3)
488 PM (
CH(i ,k,0),ci3,ti2,ti3)
491 MULPM (
CH(i,k,1),
CH(i-1,k,1),
WA(0,i-2),
WA(0,i-1),ci2,cr2)
492 MULPM (
CH(i,k,2),
CH(i-1,k,2),
WA(1,i-2),
WA(1,i-1),ci3,cr3)
493 MULPM (
CH(i,k,3),
CH(i-1,k,3),
WA(2,i-2),
WA(2,i-1),ci4,cr4)
497 static void radb5(
size_t ido,
size_t l1,
const double *cc,
double *ch,
501 static const double tr11= 0.3090169943749474241, ti11=0.95105651629515357212,
502 tr12=-0.8090169943749474241, ti12=0.58778525229247312917;
504 double ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4,
505 ti2, ti3, ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;
513 CH(0,k,0)=
CC(0,0,k)+tr2+tr3;
514 cr2=
CC(0,0,k)+tr11*tr2+tr12*tr3;
515 cr3=
CC(0,0,k)+tr12*tr2+tr11*tr3;
516 MULPM(ci5,ci4,ti5,ti4,ti11,ti12)
517 PM(
CH(0,k,4),
CH(0,k,1),cr2,ci5)
518 PM(
CH(0,k,3),
CH(0,k,2),cr3,ci4)
522 for (i=2; i<ido; i+=2)
525 PM(tr2,tr5,
CC(i-1,2,k),
CC(ic-1,1,k))
526 PM(ti5,ti2,
CC(i ,2,k),
CC(ic ,1,k))
527 PM(tr3,tr4,
CC(i-1,4,k),
CC(ic-1,3,k))
528 PM(ti4,ti3,
CC(i ,4,k),
CC(ic ,3,k))
529 CH(i-1,k,0)=
CC(i-1,0,k)+tr2+tr3;
530 CH(i ,k,0)=
CC(i ,0,k)+ti2+ti3;
531 cr2=
CC(i-1,0,k)+tr11*tr2+tr12*tr3;
532 ci2=
CC(i ,0,k)+tr11*ti2+tr12*ti3;
533 cr3=
CC(i-1,0,k)+tr12*tr2+tr11*tr3;
534 ci3=
CC(i ,0,k)+tr12*ti2+tr11*ti3;
535 MULPM(cr5,cr4,tr5,tr4,ti11,ti12)
536 MULPM(ci5,ci4,ti5,ti4,ti11,ti12)
541 MULPM(
CH(i,k,1),
CH(i-1,k,1),
WA(0,i-2),
WA(0,i-1),di2,dr2)
542 MULPM(
CH(i,k,2),
CH(i-1,k,2),
WA(1,i-2),
WA(1,i-1),di3,dr3)
543 MULPM(
CH(i,k,3),
CH(i-1,k,3),
WA(2,i-2),
WA(2,i-1),di4,dr4)
544 MULPM(
CH(i,k,4),
CH(i-1,k,4),
WA(3,i-2),
WA(3,i-1),di5,dr5)
548 static void radbg(
size_t ido,
size_t ip,
size_t l1,
size_t idl1,
549 double *cc,
double *ch,
const double *wa)
551 const size_t cdim=ip;
552 static const double twopi=6.28318530717958647692;
553 size_t idij, ipph, i, j, k, l, j2, ic, jc, lc, ik;
554 double ai1, ai2, ar1, ar2,
arg;
560 std::memcpy(&
CH(0,k,0),&
CC(0,0,k),ido*
sizeof(double));
561 for(j=1; j<ipph; j++)
567 CH(0,k,j )=2*
CC(ido-1,j2-1,k);
568 CH(0,k,jc)=2*
CC(0 ,j2 ,k);
573 for(j=1,jc=ip-1; j<ipph; j++,jc--)
575 for(i=2; i<ido; i+=2)
578 PM (
CH(i-1,k,j ),
CH(i-1,k,jc),
CC(i-1,2*j,k),
CC(ic-1,2*j-1,k))
579 PM (
CH(i ,k,jc),
CH(i ,k,j ),
CC(i ,2*j,k),
CC(ic ,2*j-1,k))
582 csarr=
RALLOC(
double,2*ip);
586 csarr[2]=csarr[2*ip-2]=
cos(
arg);
587 csarr[3]=
sin(
arg); csarr[2*ip-1]=-csarr[3];
588 for (i=2; i<=ip/2; ++i)
590 csarr[2*i]=csarr[2*ip-2*i]=
cos(i*
arg);
592 csarr[2*ip-2*i+1]=-csarr[2*i+1];
594 for(l=1; l<ipph; l++)
599 for(ik=0; ik<idl1; ik++)
602 C2(ik,lc)=ai1*
CH2(ik,ip-1);
605 for(j=2; j<ipph; j++)
609 if (aidx>=2*ip) aidx-=2*ip;
612 for(ik=0; ik<idl1; ik++)
614 C2(ik,l )+=ar2*
CH2(ik,j );
615 C2(ik,lc)+=ai2*
CH2(ik,jc);
621 for(j=1; j<ipph; j++)
622 for(ik=0; ik<idl1; ik++)
625 for(j=1,jc=ip-1; j<ipph; j++,jc--)
627 PM (
CH(0,k,jc),
CH(0,k,j),
C1(0,k,j),
C1(0,k,jc))
631 for(j=1,jc=ip-1; j<ipph; j++,jc--)
633 for(i=2; i<ido; i+=2)
635 PM (
CH(i-1,k,jc),
CH(i-1,k,j ),
C1(i-1,k,j),
C1(i ,k,jc))
636 PM (
CH(i ,k,j ),
CH(i ,k,jc),
C1(i ,k,j),
C1(i-1,k,jc))
638 std::memcpy(cc,ch,idl1*
sizeof(
double));
645 for(i=2; i<ido; i+=2,idij+=2)
646 MULPM (
C1(i,k,j),
C1(i-1,k,j),wa[idij-1],wa[idij],
CH(i,k,j),
CH(i-1,k,j))
661 const size_t ifac[],
int isign)
663 size_t k1, l1=1, nf=ifac[1], iw=0;
666 for(k1=0; k1<nf; k1++)
668 size_t ip=ifac[k1+2];
672 (isign>0) ? passb4(ido, l1, p1, p2, wa+iw)
673 : passf4(ido, l1, p1, p2, wa+iw);
675 (isign>0) ? passb2(ido, l1, p1, p2, wa+iw)
676 : passf2(ido, l1, p1, p2, wa+iw);
678 (isign>0) ? passb3(ido, l1, p1, p2, wa+iw)
679 : passf3(ido, l1, p1, p2, wa+iw);
681 (isign>0) ? passb5(ido, l1, p1, p2, wa+iw)
682 : passf5(ido, l1, p1, p2, wa+iw);
684 (isign>0) ? passb6(ido, l1, p1, p2, wa+iw)
685 : passf6(ido, l1, p1, p2, wa+iw);
687 (isign>0) ? passbg(ido, ip, l1, p1, p2, wa+iw)
688 : passfg(ido, ip, l1, p1, p2, wa+iw);
694 std::memcpy (c,p1,n*
sizeof(
cmplx));
697 void cfftf(
size_t n,
double c[],
double wsave[])
701 (
size_t*)(wsave+4*n),-1);
704 void cfftb(
size_t n,
double c[],
double wsave[])
708 (
size_t*)(wsave+4*n),+1);
711 static void factorize (
size_t n,
const size_t *pf,
size_t npf,
size_t *ifac)
713 size_t nl=
n, nf=0, ntry=0, j=0, i;
717 ntry = (j<=npf) ? pf[j-1] : ntry+2;
721 size_t nr=nl-ntry*nq;
727 if ((ntry==2) && (nf!=1))
729 for (i=nf+1; i>2; --i)
739 static void cffti1(
size_t n,
double wa[],
size_t ifac[])
741 static const size_t ntryh[5]={4,6,3,2,5};
742 static const double twopi=6.28318530717958647692;
747 factorize (n,ntryh,5,ifac);
748 for(k=1; k<=ifac[1]; k++)
751 size_t ido=
n/(l1*ip);
755 double argld=j*l1*argh;
758 for(fi=1; fi<=ido; fi++)
775 void cffti(
size_t n,
double wsave[])
776 {
if (n!=1) cffti1(n, wsave+2*n,(
size_t*)(wsave+4*n)); }
790 size_t k1, l1=
n, nf=ifac[1], iw=
n-1;
791 double *p1=ch, *p2=
c;
793 for(k1=1; k1<=nf;++k1)
795 size_t ip=ifac[nf-k1+2];
799 SWAP (p1,p2,
double *);
801 radf4(ido, l1, p1, p2, wa+iw);
803 radf2(ido, l1, p1, p2, wa+iw);
805 radf3(ido, l1, p1, p2, wa+iw);
807 radf5(ido, l1, p1, p2, wa+iw);
811 SWAP (p1,p2,
double *);
812 radfg(ido, ip, l1, ido*l1, p1, p2, wa+iw);
813 SWAP (p1,p2,
double *);
817 std::memcpy (c,ch,n*
sizeof(
double));
820 static void rfftb1(
size_t n,
double c[],
double ch[],
const double wa[],
823 size_t k1, l1=1, nf=ifac[1], iw=0;
824 double *p1=
c, *p2=ch;
826 for(k1=1; k1<=nf; k1++)
828 size_t ip = ifac[k1+1],
831 radb4(ido, l1, p1, p2, wa+iw);
833 radb2(ido, l1, p1, p2, wa+iw);
835 radb3(ido, l1, p1, p2, wa+iw);
837 radb5(ido, l1, p1, p2, wa+iw);
840 radbg(ido, ip, l1, ido*l1, p1, p2, wa+iw);
842 SWAP (p1,p2,
double *);
844 SWAP (p1,p2,
double *);
849 std::memcpy (c,ch,n*
sizeof(
double));
852 void rfftf(
size_t n,
double r[],
double wsave[])
853 {
if(n!=1) rfftf1(n, r, wsave, wsave+n,(
size_t*)(wsave+2*n)); }
855 void rfftb(
size_t n,
double r[],
double wsave[])
856 {
if(n!=1) rfftb1(n, r, wsave, wsave+n,(
size_t*)(wsave+2*n)); }
858 static void rffti1(
size_t n,
double wa[],
size_t ifac[])
860 static const size_t ntryh[4]={4,2,3,5};
861 static const double twopi=6.28318530717958647692;
866 factorize (n,ntryh,4,ifac);
867 for (k=1; k<ifac[1]; k++)
873 double argld=j*l1*argh;
874 for(i=is,fi=1; i<=ido+is-3; i+=2,++fi)
886 void rffti(
size_t n,
double wsave[])
889 rffti1(n, wsave+n,(
size_t*)(wsave+2*n));
893 const double pi = 3.14159265358979;
894 void sinti (
size_t n,
double wsave[])
898 double dt =
pi / double (n+1);
899 for (
size_t k = 0; k < ns2; k++) {
900 wsave[k] = 2.0 *
sin ((k+1) * dt);
902 rffti (n+1, wsave+ns2);
913 void sint1 (
size_t n,
double war[],
double was[],
double xh[],
double x[],
double xxifac[])
915 double sqrt3 = 1.73205080756888;
917 for (
size_t i = 0; i < n; i++) {
925 double xhold = sqrt3*(xh[0]+xh[1]);
926 xh[1] = sqrt3*(xh[0]-xh[1]);
932 for (
size_t k = 0; k < ns2; k++) {
934 double t1 = xh[k] - xh[kc];
935 double t2 = was[k] * (xh[k] + xh[kc]);
941 x[ns2+2] = 4.0 * xh[ns2+1];
943 rfftf1 (np1, x, xh, war, (
size_t*)xxifac);
945 for (
size_t i = 2; i < n; i += 2) {
947 xh[i] = xh[i-2] + x[i-1];
953 for (
size_t i = 0; i < n; i++) {
959 void sint (
size_t n,
double x[],
double wsave[])
967 wsave + n/2 + 2*n + 2
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > sin(const Tps< T > &x)
Sine.
void sinti(size_t n, double wsave[])
#define RALLOC(type, num)
void cffti(size_t n, double wsave[])
void cfftf(size_t n, double c[], double wsave[])
void sint(size_t n, double x[], double wsave[])
void sint1(size_t n, double war[], double was[], double xh[], double x[], double xxifac[])
void util_free_(void *ptr)
void rffti(size_t n, double wsave[])
void * util_malloc_(size_t sz)
void rfftf(size_t n, double r[], double wsave[])
void cfftb(size_t n, double c[], double wsave[])
#define MULPM(a, b, c, d, e, f)
void rfftb(size_t n, double r[], double wsave[])
constexpr double c
The velocity of light in m/s.