int main(int argc, char *argv[]){ SID_init(&argc,&argv,NULL,NULL); // Parse arguments and initialize double z; if(argc<2 || argc>3){ fprintf(stderr,"\n Syntax: %s z [gbpCosmo_file.txt]\n",argv[0]); fprintf(stderr," ------\n\n"); return(ERROR_SYNTAX); } else z=(double)atof(argv[1]); SID_log("Computing clustering information for z=%.2lf...",SID_LOG_OPEN,z); // Initialize cosmology cosmo_info *cosmo=NULL; if(argc==2) init_cosmo_default(&cosmo); else if(argc==3) read_gbpCosmo_file(&cosmo,argv[2]); // Initialize int mode =PSPEC_LINEAR_TF; int component=PSPEC_ALL_MATTER; init_sigma_M(&cosmo,z,mode,component); int n_k =((int *)ADaPS_fetch(cosmo,"n_k"))[0]; double *lk_P = (double *)ADaPS_fetch(cosmo,"lk_P"); double h_Hubble=((double *)ADaPS_fetch(cosmo,"h_Hubble"))[0]; SID_log("Done.",SID_LOG_CLOSE); // Generate file SID_log("Writing table to stdout...",SID_LOG_OPEN); double delta_c =1.686; double m_per_mpc_h=M_PER_MPC/h_Hubble; printf("# Column (01): k [h Mpc^-1]\n"); printf("# (02): R [h^-1 Mpc] \n"); printf("# (03): M [h^-1 M_sol]\n"); printf("# (04): V_max [km/s] \n"); printf("# (05): P_k [(h^-1 Mpc)^3]\n"); printf("# (06): sigma\n"); printf("# (07): nu (peak height)\n"); printf("# (08): b_BPR\n"); printf("# (09): b_TRK\n"); printf("# (10): z-space boost Kaiser '87 (applied to b_TRK)\n"); printf("# (11): b_TRK total (w/ Kaiser boost)\n"); printf("# (12): b_halo_Poole \n"); printf("# (13): z-space boost Poole \n"); printf("# (14): b_total_Poole \n"); printf("# (15): b_halo_Poole (substructure)\n"); printf("# (16): z-space boost Poole (substructure)\n"); printf("# (17): b_total_Poole (substructure)\n"); for(int i_k=0;i_k<n_k;i_k++){ double k_P =take_alog10(lk_P[i_k]); double R_P =R_of_k(k_P); double M_R =M_of_k(k_P,z,cosmo); double P_k =power_spectrum(k_P,z,&cosmo,mode,component); double sigma=sqrt(power_spectrum_variance(k_P,z,&cosmo,mode,component)); double V_max=V_max_NFW(M_R,z,NFW_MODE_DEFAULT,&cosmo); double nu =delta_c/sigma; double bias =1.; if(M_R<1e16*M_SOL){ printf("%10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le %10.5le\n", k_P*m_per_mpc_h, R_P/m_per_mpc_h, M_R/(M_SOL/h_Hubble), V_max*1e-3, P_k/pow(m_per_mpc_h,3.), sigma, nu, bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_BPR), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_TRK), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_TRK|BIAS_MODEL_KAISER_BOOST), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_TRK|BIAS_MODEL_KAISER), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_POOLE_HALO), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_POOLE_ZSPACE), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_POOLE_TOTAL), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_POOLE_SUBSTRUCTURE|BIAS_MODEL_POOLE_HALO), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_POOLE_SUBSTRUCTURE|BIAS_MODEL_POOLE_ZSPACE), bias_model(M_R,delta_c,z,&cosmo,BIAS_MODEL_POOLE_SUBSTRUCTURE|BIAS_MODEL_POOLE_TOTAL)); } } SID_log("Done.",SID_LOG_CLOSE); // Clean-up free_cosmo(&cosmo); SID_log("Done.",SID_LOG_CLOSE); SID_exit(ERROR_NONE); }
double bias_model(double x_in, double delta_c, double z, cosmo_info **cosmo, int mode) { // Decide what the input is int flag_Vmax_ordinate = SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_VMAX_ORDINATE); double M_R; double V_max; if(flag_Vmax_ordinate) V_max = x_in; else M_R = x_in; double bias; int flag_done = GBP_FALSE; // Tinker et al 2010 if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_TRK)) { if(flag_done) SID_exit_error("Mode flag (%d) is invalid in bias_model(). Multiple model definitions.", SID_ERROR_LOGIC, mode); flag_done = GBP_TRUE; if(flag_Vmax_ordinate) M_R = Vmax_to_Mvir_NFW(V_max, z, NFW_MODE_DEFAULT, cosmo); double y = take_log10(Delta_vir(z, *cosmo)); double A = 1. + 0.24 * y * exp(-pow(4. / y, 4.)); double B = 0.183; double C = 0.019 + 0.107 * y + 0.19 * exp(-pow(4. / y, 4.)); double a = 0.44 * y - 0.88; double b = 1.5; double c = 2.4; double sigma = sigma_M(cosmo, M_R, z, PSPEC_LINEAR_TF, PSPEC_ALL_MATTER); double nu = delta_c / sigma; bias = 1. - A * pow(nu, a) / (pow(nu, a) + pow(delta_c, a)) + B * pow(nu, b) + C * pow(nu, c); } // Basilakos and Plionis (2001;2003) w/ Papageorgiou et al 2013 coeeficients if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_BPR)) { if(flag_done) SID_exit_error("Mode flag (%d) is invalid in bias_model(). Multiple model definitions.", SID_ERROR_LOGIC, mode); flag_done = GBP_TRUE; if(flag_Vmax_ordinate) M_R = Vmax_to_Mvir_NFW(V_max, z, NFW_MODE_DEFAULT, cosmo); double alpha_1 = 4.53; double alpha_2 = -0.41; double beta_1 = 0.37; double beta_2 = 0.36; double I_z; double C_1; double C_2; double Omega_M, Omega_k, Omega_Lambda, h_Hubble; double Ez; Omega_M = ((double *)ADaPS_fetch(*cosmo, "Omega_M"))[0]; Omega_k = ((double *)ADaPS_fetch(*cosmo, "Omega_k"))[0]; Omega_Lambda = ((double *)ADaPS_fetch(*cosmo, "Omega_Lambda"))[0]; h_Hubble = ((double *)ADaPS_fetch(*cosmo, "h_Hubble"))[0]; Ez = E_z(Omega_M, Omega_k, Omega_Lambda, z); I_z = bias_model_BPR_integral(cosmo, z); C_1 = alpha_1 * pow(M_R / (1e13 * M_SOL / h_Hubble), beta_1); C_2 = alpha_2 * pow(M_R / (1e13 * M_SOL / h_Hubble), beta_2); bias = (C_1 + C_2 * I_z) * Ez + 1.; } // Poole et al 2014 if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_POOLE_HALO)) { if(flag_done) SID_exit_error("Mode flag (%d) is invalid in bias_model(). Multiple model definitions.", SID_ERROR_LOGIC, mode); flag_done = GBP_TRUE; if(!flag_Vmax_ordinate) V_max = V_max_NFW(M_R, z, NFW_MODE_DEFAULT, cosmo) * 1e-3; else V_max *= 1e-3; double V_SF_o; double V_SF_z; double s_V_o; double s_V_z; double b_o_o; double b_o_z; double b_V_o; double b_V_z; if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_POOLE_SUBSTRUCTURE)) { V_SF_o = 5.326176e-02; V_SF_z = -1.673868e-01; s_V_o = 4.026941e-01; s_V_z = 6.096567e-01; b_o_o = -1.974311e-01; b_o_z = 2.138219e-01; b_V_o = 2.707540e-01; b_V_z = 8.202001e-02; } else { V_SF_o = 2.819063e-02; V_SF_z = -1.381993e-01; s_V_o = 3.685953e-01; s_V_z = 6.154695e-01; b_o_o = -3.793559e-01; b_o_z = 3.074326e-01; b_V_o = 3.147507e-01; b_V_z = 6.072666e-02; } double b_o = b_o_o + b_o_z * z; double b_V = (b_V_o + b_V_z * z) / 220.; double V_SF = take_alog10(V_SF_o + V_SF_z * z) * 220.; double s_V = (s_V_o + s_V_z * z) / 220.; double s = s_V * fabs(V_max - V_SF); bias = take_alog10(0.5 * (b_o + b_V * V_max)); } if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_POOLE_ZSPACE)) { if(flag_done) SID_exit_error("Mode flag (%d) is invalid in bias_model(). Multiple model definitions.", SID_ERROR_LOGIC, mode); flag_done = GBP_TRUE; if(!flag_Vmax_ordinate) V_max = V_max_NFW(M_R, z, NFW_MODE_DEFAULT, cosmo) * 1e-3; else V_max *= 1e-3; double V_SF_o; double V_SF_z; double s_V_o; double s_V_zz; double b_o_o; double b_o_zz; double b_V_o; double b_V_z; double z_b_c; if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_POOLE_SUBSTRUCTURE)) { V_SF_o = 3.173152e-01; V_SF_z = -1.599133e-01; s_V_o = 5.344408e-01; s_V_zz = 7.102406e-02; b_o_o = 2.198795e-01; b_o_zz = -3.749491e-02; b_V_o = -4.628602e-02; b_V_z = -1.832620e-02; z_b_c = 9.292014e-01; } else { V_SF_o = 3.100167e-01; V_SF_z = -2.026411e-01; s_V_o = 3.342258e-01; s_V_zz = 9.233431e-02; b_o_o = 2.206163e-01; b_o_zz = -4.419126e-02; b_V_o = -4.804747e-02; b_V_z = -1.454479e-02; z_b_c = 7.852721e-01; } double b_o = b_o_o + b_o_zz * (z - z_b_c) * (z - z_b_c); double b_V = (b_V_o + b_V_z * z) / 220.; double V_SF = 220. * take_alog10(V_SF_o + V_SF_z * z); double s_V = (s_V_o + s_V_zz * z * z) / 220.; double s = s_V * fabs(V_max - V_SF); bias = take_alog10(0.5 * (b_o + b_V * V_max)); } if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_POOLE_TOTAL)) { if(flag_done) SID_exit_error("Mode flag (%d) is invalid in bias_model(). Multiple model definitions.", SID_ERROR_LOGIC, mode); flag_done = GBP_TRUE; if(!flag_Vmax_ordinate) V_max = V_max_NFW(M_R, z, NFW_MODE_DEFAULT, cosmo) * 1e-3; else V_max *= 1e-3; double V_SF_o; double V_SF_z; double s_V_o; double s_V_z; double b_o_o; double b_o_z; double b_V_o; double b_V_z; if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_POOLE_SUBSTRUCTURE)) { V_SF_o = 2.128681e-01; V_SF_z = -2.280569e-01; s_V_o = 1.118792e+00; s_V_z = 6.121383e-01; b_o_o = 1.198136e-02; b_o_z = 2.112670e-01; b_V_o = 2.153513e-01; b_V_z = 7.763461e-02; } else { V_SF_o = 2.041659e-01; V_SF_z = -2.966696e-01; s_V_o = 9.408169e-01; s_V_z = 4.514711e-01; b_o_o = -1.534952e-01; b_o_z = 2.799483e-01; b_V_o = 2.547096e-01; b_V_z = 6.760491e-02; } double b_o = b_o_o + b_o_z * z; double b_V = (b_V_o + b_V_z * z) / 220.; double V_SF = V_SF_o + V_SF_z * z; double s_V = (s_V_o + s_V_z * z) / 220.; double s = s_V * fabs(V_max - V_SF); bias = take_alog10(0.5 * (b_o + b_V * V_max)); } if(!flag_done) SID_exit_error("Mode flag (%d) is invalid in bias_model(). No model definition.", SID_ERROR_LOGIC, mode); // Apply the Kaiser '87 model to whatever model has been processed above. Be careful, there // are some mode flags (such as BIAS_MODE_POOLE_ZSPACE) for which this does not make sence // and we presently don't check for this. if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_KAISER_BOOST)) { double Omega_M_z = Omega_z(z, (*cosmo)); double f = pow(Omega_M_z, 0.55); double beta = f / bias; double boost = pow(1. + TWO_THIRDS * beta + 0.2 * beta * beta, 0.5); bias = boost; } if(SID_CHECK_BITFIELD_SWITCH(mode, BIAS_MODEL_KAISER)) { double Omega_M_z = Omega_z(z, (*cosmo)); double f = pow(Omega_M_z, 0.55); double beta = f / bias; double boost = pow(1. + TWO_THIRDS * beta + 0.2 * beta * beta, 0.5); bias *= boost; } return (bias); }