/// Fourier transform of NFW profile for satellites double cosmology::uskofm(double k, double m, double z, double csbycdm) { double mvir,rvir, cvir, r200, c200; modelNFWhalo(m,z,mvir,rvir,cvir,r200,c200); c200=c200*csbycdm; double rs=r200/c200; double fac=log(1.+c200) - c200/(1.+c200); double ci1,ci2; double si1,si2; double arg1=k*rs; double arg2=(1.+c200)*k*rs; double arg3=c200*k*rs; ci1=gsl_sf_Ci(arg1); ci2=gsl_sf_Ci(arg2); si1=gsl_sf_Si(arg1); si2=gsl_sf_Si(arg2); double res1=sin(arg1)*(si2-si1); res1-=sin(arg3)/arg2; res1+=cos(arg1)*(ci2-ci1); return res1/fac; }
// FFT of NFW profile from White '01 double rho_NFW_fft(double k, double M_vir, double z, int mode, cosmo_info **cosmo){ double c_vir; double R_vir; double r_s; double z_k; double g_c; double rho_o; double x1; double x2; double Ci1; double Ci2; double Si1; double Si2; double r_val; set_NFW_params(M_vir,z,mode,cosmo,&c_vir,&R_vir); r_s =R_vir/c_vir; z_k =k*r_s; g_c =1./(log(1.+c_vir)-c_vir/(1.+c_vir)); rho_o=M_vir*g_c/(FOUR_PI*r_s*r_s*r_s); x1 =1.+c_vir; x2 =c_vir*z_k; Ci1=gsl_sf_Ci((1.+c_vir)*z_k); Si1=gsl_sf_Si((1.+c_vir)*z_k); Ci2=gsl_sf_Ci( z_k); Si2=gsl_sf_Si( z_k); r_val=(FOUR_PI*rho_o*r_s*r_s*r_s/M_vir)*(cos(z_k)*(Ci1-Ci2)+ sin(z_k)*(Si1-Si2)- sin(c_vir*z_k)/(z_k*(1.+c_vir))); return(r_val); }
/// The fourier transform of the NFW profile on a grid of k*rs and c /// krsmin=10^-6 and krsmax=10.0^8.0 /// log(cmin)=0.0 and logcmax=2.5 void cosmology::ukinit() { double krsdiff=(krsmax-krsmin)/(Nuk-1.); double cdiff=(cmax-cmin)/(Nuk-1.); for(int i=0;i<Nuk;i++) { uk_krs[i]=krsmin+i*krsdiff; uk_c [i]=cmin +i*cdiff; } /// Bilinear interpolation is not defined in GSL. So code this up yourself //std::cout<<"# Start check here"<<std::endl; for(int i=0;i<Nuk;i++) { double con=pow(10.,uk_c[i]); double fac=log(1.+con) - con/(1.+con); bool extrap=false; double x_extrap,y_extrap; for(int j=0;j<Nuk;j++) { double krs=pow(10.,uk_krs[j]); // Do the cisi calculation only when u(k)>10^-6 // A log-linear interpolation for values below if(!extrap) { double arg1=krs; double arg2=(1.0+con)*krs; double arg3=con*krs; double ci1,ci2; double si1,si2; ci1=gsl_sf_Ci(arg1); ci2=gsl_sf_Ci(arg2); si1=gsl_sf_Si(arg1); si2=gsl_sf_Si(arg2); double res1=sin(arg1)*(si2-si1); res1-=sin(arg3)/arg2; res1+=cos(arg1)*(ci2-ci1); if(res1/fac<=0.0){ std::cout<<"Some serious trouble here "<<res1<<" "<<fac<<" "<<krs<<" "<<con<<std::endl; exit(0); } ukrsc[i][j]=log10(res1/fac); //std::cout<<std::scientific; //std::cout<<krs<<" "<<con<<" "<<res1/fac<<" "<<std::endl; if (ukrsc[i][j] < -6.0) { extrap=true; x_extrap=uk_krs[j]; y_extrap=ukrsc[i][j]; } }else{ ukrsc[i][j]=y_extrap-1.99*(uk_krs[j]-x_extrap); //std::cout<<std::scientific; //std::cout<<krs<<" "<<con<<" "<<pow(10.,ukrsc[i][j])<<" "<<std::endl; } } //std::cout<<std::endl; } //exit(0); uk_c_acc=gsl_interp_accel_alloc(); uk_krs_acc=gsl_interp_accel_alloc(); bool_inituk=true; }