static void run(unsigned int i) { if (i == 0) good_size(); else bad_size(); SAFE_CLOSE(sk); }
void bluestein_i (size_t n, double **tstorage, size_t *worksize) { static const double pi=3.14159265358979323846; size_t n2=good_size(n*2-1); size_t m, coeff; double angle, xn2; double *bk, *bkf, *work; double pibyn=pi/n; *worksize=2+2*n+8*n2+16; *tstorage = RALLOC(double,2+2*n+8*n2+16); ((size_t *)(*tstorage))[0]=n2; bk = *tstorage+2; bkf = *tstorage+2+2*n; work= *tstorage+2+2*(n+n2); /* initialize b_k */ bk[0] = 1; bk[1] = 0; coeff=0; for (m=1; m<n; ++m) { coeff+=2*m-1; if (coeff>=2*n) coeff-=2*n; angle = pibyn*coeff; bk[2*m] = cos(angle); bk[2*m+1] = sin(angle); } /* initialize the zero-padded, Fourier transformed b_k. Add normalisation. */ xn2 = 1./n2; bkf[0] = bk[0]*xn2; bkf[1] = bk[1]*xn2; for (m=2; m<2*n; m+=2) { bkf[m] = bkf[2*n2-m] = bk[m] *xn2; bkf[m+1] = bkf[2*n2-m+1] = bk[m+1] *xn2; } for (m=2*n;m<=(2*n2-2*n+1);++m) bkf[m]=0.; cffti (n2,work); cfftf (n2,bkf,work); }
void* AllocRing::alloc(int s) { unsigned int size = good_size(s); void* p; if (nodes[current].ptr != 0 && nodes[current].sz >= int(size) && nodes[current].sz < int(4 * size)) p = nodes[current].ptr; else { if (nodes[current].ptr != 0) operator delete (nodes[current].ptr); p = operator new (size); nodes[current].ptr = p; nodes[current].sz = size; } ++current; if (current >= n) current = 0; return p; }