Exemplo n.º 1
0
/// 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;

}
Exemplo n.º 2
0
// 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);
}
Exemplo n.º 3
0
/// 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;
    
}