9 #define M_PI 3.14159265358979323846 19 0.99999999999980993227684700473478,
20 676.520368121885098567009190444019,
21 -1259.13921672240287047156078755283,
22 771.3234287776530788486528258894,
23 -176.61502916214059906584551354,
24 12.507343278686904814458936853,
25 -0.13857109526572011689554707,
26 9.984369578019570859563e-6,
27 1.50563273514931155834e-7
33 double complex
x = p[0];
34 for(
int n = 1; n < 9; n++)
35 x += p[n] / (z + (
double)(n));
36 double complex t = z + 7.5;
37 return sqrt(2*
M_PI) * cpow(t, z+0.5) * cexp(-t) *
x;
40 static double complex
polar (
double r,
double phi)
42 return (r*cos(phi) +I*(r*sin(phi)));
51 static void lngamma_4(
double x,
double y,
double* lnr,
double* arg)
54 if(lnr) *lnr = creal(w);
55 if(arg) *arg = cimag(w);
58 static double goodkr(
int N,
double mu,
double q,
double L,
double kr)
60 double xp = (mu+1+q)/2;
61 double xm = (mu+1-q)/2;
62 double y =
M_PI*N/(2*L);
63 double lnr, argm, argp;
66 double arg = log(2/kr) * N/L + (argp + argm)/
M_PI;
67 double iarg = round(arg);
69 kr *= exp((arg - iarg)*L/N);
76 double k0r0 = kcrc * exp(-L);
77 double t = -2*y*log(k0r0/2);
82 for(
int m = 0;
m <= N/2;
m++) {
88 double xp = (mu+1+q)/2;
89 double xm = (mu+1-q)/2;
90 double lnrp, phip, lnrm, phim;
91 for(
int m = 0;
m <= N/2;
m++) {
94 u[
m] =
polar(exp(q*log(2) + lnrp - lnrm),
m*t + phip - phim);
98 for(
int m = N/2+1;
m < N;
m++)
101 u[N/2] = (creal(u[N/2]) + I*0.0);
104 void fht(
int N,
const double r[],
const double complex a[],
double k[],
double complex b[],
double mu,
105 double q,
double kcrc,
int noring,
double complex* u)
107 double L = log(r[N-1]/r[0]) * N/(N-1.);
108 double complex* ulocal = NULL;
111 kcrc =
goodkr(N, mu, q, L, kcrc);
112 ulocal = malloc (
sizeof(complex
double)*N);
118 fftw_plan forward_plan = fftw_plan_dft_1d(N, (fftw_complex*) a, (fftw_complex*) b, -1, FFTW_ESTIMATE);
119 fftw_plan reverse_plan = fftw_plan_dft_1d(N, (fftw_complex*) b, (fftw_complex*) b, +1, FFTW_ESTIMATE);
120 fftw_execute(forward_plan);
121 for(
int m = 0;
m < N;
m++)
122 b[
m] *= u[
m] / (
double)(N);
123 fftw_execute(reverse_plan);
124 fftw_destroy_plan(forward_plan);
125 fftw_destroy_plan(reverse_plan);
129 for(
int n = 0; n < N/2; n++) {
136 double k0r0 = kcrc * exp(-L);
138 for(
int n = 1; n < N; n++)
139 k[n] = k[0] * exp(n*L/N);
145 double th[],
double xi[])
147 double complex* a = malloc(
sizeof(complex
double)*N);
148 double complex* b = malloc(
sizeof(complex
double)*N);
152 fht(N,l,a,th,b,bessel_order,0,1,1,NULL);
154 xi[i]=creal(b[i]/(2*
M_PI*th[i]));
161 double r[],
double xi[])
163 double complex* a = malloc(
sizeof(complex
double)*N);
164 double complex* b = malloc(
sizeof(complex
double)*N);
166 for(
int i = 0; i < N; i++)
167 a[i] =
pow(k[i], m - 0.5) * pk[i];
168 fht(N, k, a, r, b, l + 0.5, 0, 1, 1, NULL);
169 for(
int i = 0; i < N; i++)
170 xi[i] = creal(
pow(2*
M_PI*r[i], -(m-0.5)) * b[i]);
176 void pk2xi(
int N,
const double k[],
const double pk[],
double r[],
double xi[])
181 void xi2pk(
int N,
const double r[],
const double xi[],
double k[],
double pk[])
185 for(
int j = 0; j < N; j++)
void pk2xi(int N, const double k[], const double pk[], double r[], double xi[])
void compute_u_coefficients(int N, double mu, double q, double L, double kcrc, double complex u[])
static double complex gamma_fftlog(double complex z)
void fftlog_ComputeXiLM(double l, double m, int N, const double k[], const double pk[], double r[], double xi[])
void xi2pk(int N, const double r[], const double xi[], double k[], double pk[])
static double complex lngamma_fftlog(double complex z)
static void lngamma_4(double x, double y, double *lnr, double *arg)
void fftlog_ComputeXi2D(double bessel_order, int N, const double l[], const double cl[], double th[], double xi[])
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
static CCL_BEGIN_DECLS double x[111][8]
static double complex polar(double r, double phi)
void fht(int N, const double r[], const double complex a[], double k[], double complex b[], double mu, double q, double kcrc, int noring, double complex *u)
static double goodkr(int N, double mu, double q, double L, double kr)
float pow(float base, unsigned long int exp)
static double w[2][28][111]