/// Get comoving virial radius from virial mass double cosmology::getRvirfromMvir(double Mvir, double z){ double Rvir=pow(Mvir/(Delta_crit(z)*1.E4*pow(Eofz(z),2.)/2./gee), 1./3.); Rvir=Rvir*(1.+z); return Rvir; }
double cosmology::rvir_from_mvir(double Mvir, double z) { double Rvir=0.169*pow(Mvir/1.e12,1./3.); Rvir*=pow(Delta_crit(z)/178.0,-1.0/3.0); Rvir*=pow(Eofz(z),-2./3.); Rvir=Rvir*(1.+z); return Rvir; }
/// Radii are in physical units here, so be careful void cosmology::modelNFWhalo(double m200,double z,double &Mvir, double &Rvir, double &cvir, double &R200, double &c200) { Mvir=getMvir(m200,z); Rvir=0.169*pow(Mvir/1.e12,1./3.); Rvir*=pow(Delta_crit(z)/178.0,-1.0/3.0); Rvir*=pow(Eofz(z),-2./3.); double Delta=200.; R200=pow( 1.0e12/(4./3.*Delta*3e4*0.3/(8*gee)),1./3.); R200*=pow(m200/1.e12,1./3.); R200*=pow(Omega(z)/0.3,-1.0/3.0); R200*=pow(Eofz(z),-2./3.); cvir=conc(Mvir,z); c200=getc200(cvir,z); }
/// Radii are in comoving units here void cosmology::modelNFWhalo_com(double m200,double z,double &Mvir, double &Rvir, double &cvir) { Mvir=getMvir(m200,z); Rvir=0.169*pow(Mvir/1.e12,1./3.); Rvir*=pow(Delta_crit(z)/178.0,-1.0/3.0); Rvir*=pow(Eofz(z),-2./3.); cvir=conc(Mvir,z); Rvir=Rvir*(1.+z); }
/// Radii are in comoving units here void cosmology::modelNFWhalo_com_ext(double mDel,double z,double &Mvir, double &Rvir, double &cvir, double &RDel, double &cDel,double Del) { //std::cout<<Delta_crit(z)<<std::endl;exit(0); Mvir=getMvir(mDel,z,Del); Rvir=0.169*pow(Mvir/1.e12,1./3.); Rvir*=pow(Delta_crit(z)/178.0,-1.0/3.0); Rvir*=pow(Eofz(z),-2./3.); double Delta=Del; RDel=pow( 1.0e12/(4./3.*Delta*3e4*0.3/(8*gee)),1./3.); RDel*=pow(mDel/1.e12,1./3.); RDel*=pow(Omega(z)/0.3,-1.0/3.0); RDel*=pow(Eofz(z),-2./3.); cvir=conc(Mvir,z); cDel=getcDel(cvir,z,Delta); Rvir=Rvir*(1.+z); RDel=RDel*(1.+z); }
/// Omega(z) double cosmology::Omega(double z) { return Omega0*pow(1+z,3.)/pow(Eofz(z),2.); }
void cosmology::pevolve_fixed(double cdel, int opt, double z, double &cdelz, double &fdelz, double zstart){ double fac; if(opt==1){ fac=pow(cdel*(1.+zstart)/(1.+z),3)/mu(cdel); }else if(opt==2){ fac=pow(cdel,3)/mu(cdel); fac=fac*pow(Eofz(zstart)/Eofz(z),2); fac=fac*Delta_crit(zstart)/Delta_crit(z); }else if(opt==3){ fac=pow(cdel,3)/mu(cdel); fac=fac*pow(Eofz(zstart)/Eofz(z),2); }else{ fprintf(stderr,"Option %d not supported yet, bailing out...",opt); exit(100); } int status; int iter = 0, max_iter = 100; double res; const gsl_root_fsolver_type *T; gsl_root_fsolver *s; double c_lo = 0.01*cdel, c_hi = 100000.0*cdel; gsl_function F; march_params p; p.fac = fac; F.function = &findcmarch; F.params = &p; T = gsl_root_fsolver_brent; s = gsl_root_fsolver_alloc (T); gsl_root_fsolver_set (s, &F, c_lo, c_hi); do { iter++; status = gsl_root_fsolver_iterate (s); res = gsl_root_fsolver_root (s); c_lo = gsl_root_fsolver_x_lower (s); c_hi = gsl_root_fsolver_x_upper (s); status = gsl_root_test_interval (c_lo, c_hi,0, 1e-6); if (status == GSL_SUCCESS) { //std::cout<<"# "<<"zcollapse:Brent converged after "<< iter<<" iterations"<<std::endl; } }while (status == GSL_CONTINUE && iter < max_iter); gsl_root_fsolver_free (s); cdelz=res; fdelz=mu(cdelz)/mu(cdel); }