def getSimulationProperties(sim_name): if sim_name in sims: sim = SimulationProperties() sim.name = sim_name sim.cosmo_name = sims[sim_name]['cosmo'] sim.box_size = sims[sim_name]['box_size'] sim.Np = sims[sim_name]['Np'] sim.epsilon = sims[sim_name]['epsilon'] sim.folder = sims[sim_name]['folder'] sim.Nfiles = sims[sim_name]['Nfiles'] sim.Nsnapdigits = sims[sim_name]['Nsnapdigits'] sim.code = sims[sim_name]['code'] else: print("Invalid sim name, %s. Valid names are:" % sim_name) printBoxes() exit() try: previous_cosmo = cosmology.getCurrent() except Exception: previous_cosmo = None cosmo = cosmology.setCosmology(sim.cosmo_name) sim.mp = getParticleMass(sim.box_size, sim.Np, cosmo.Om0) if previous_cosmo is not None: cosmology.setCurrent(previous_cosmo) return sim
def get_halos(z, Vol, dlog10m=0.005, hmf_choice='despali16', mdef='vir'): ####### set cosmology ######### cosmol = cosmo.setCosmology('planck15') cosmo.setCurrent(cosmol) ############################## Mvir = 10**np.arange(10., 16, dlog10m) #Mh/h if hmf_choice == 'despali16': massfunct = massFunction( x=Mvir, z=z, mdef=mdef, model='despali16', q_out='dndlnM') * np.log(10) #dn/dlog10M elif hmf_choice == 'rodriguezpuebla16': massfunct = hmf_rp16(Mvir, z) * Mvir / np.log10(np.exp(1)) massfunct = massfunct * (cosmol.h)**3 #convert from massf*h**3 total_haloMF = massfunct.copy() #massfunct = massFunction(x=Mvir, z=z, q_in='M',mdef='vir', model='despali16', q_out='dndlnM')*np.log(10) #dn/dlog10M Mvir = np.log10(Mvir) Mvir = Mvir - np.log10(cosmol.h) #convert from M/h Ncum = Vol * (np.cumsum((total_haloMF * dlog10m)[::-1])[::-1]) halos = extract_catalog(Ncum, Mvir) return halos
import numpy as np import os from time import time import colossus.cosmology.cosmology as cosmo from colossus.halo import concentration, mass_so from colossus.lss.mass_function import massFunction from scipy.interpolate import interp1d import pandas as pd from scipy.stats import binned_statistic import matplotlib.pylab as plt from functools import lru_cache cosmol = cosmo.setCosmology('planck15') cosmo.setCurrent(cosmol) class Volume: def __init__(self): self.Vol = self._Vol @property def _Vol(self): return (700)**3 #Mpc^3 class DarkMatter(Volume): def __init__(self, z, Vol=None, nbody=False): if Vol is not None: self.Vol = Vol else: super().__init__()
def cNFW(m,z=0,virial=False,method='d15', wdm=False,mWDM=5.,massdef=None): """ Returns the NFW concentration, calculated according to the given mass concentration relation 'method'. Written to use the versions from COLOSSUS by Diemer+ 2017, but can use versions I coded up by uncommenting them. Supports WDM concentrations as given by Schneider+ 2012's relation, given mWDM in keV. https://bdiemer.bitbucket.io/colossus/halo_concentration.html """ if massdef==None: massdef = 'vir' if virial else '200c' h0 = h(0,method=method) if method=='d08': #return duffy08 (m,z=z,virial=virial) cosmology.setCurrent(cosmoWMAP5) c = colossus_cNFW(m/h0, massdef, z, model='duffy08') elif method=='d14': #return dutton14(m,z=z,virial=virial) cosmology.setCurrent(cosmoP13) c = colossus_cNFW(m/h0, massdef, z, model='dutton14') elif method=='d15': # Diemer & Joyce 2019 cosmology.setCurrent(cosmoP18) #cosmology.setCurrent(cosmoWMAP5) c = colossus_cNFW(m/h0, massdef, z, model='diemer15') elif method=='d15+1s': # Diemer & Joyce 2019 cosmology.setCurrent(cosmoP18) c = colossus_cNFW(m/h0, massdef, z, model='diemer15') * 10**0.16 elif method=='d15-1s': # Diemer & Joyce 2019 cosmology.setCurrent(cosmoP18) c = colossus_cNFW(m/h0, massdef, z, model='diemer15') / 10**0.16 elif method=='d15-wmap': cosmology.setCurrent(cosmoWMAP5) c = colossus_cNFW(m/h0, massdef, z, model='diemer15') else: print('did not recognize given mass-concentration relation',relation,'! Aborting...') exit() if not wdm: return c else: m1m_div_h, r1m_div_h, c1m = changeMassDefinition(m/h0, c, z, '200c', '1m') # Schneider+ 2012 uses rho_bar in mass def m1m = m1m_div_h * h0 return c * (1 + GAMMA1*mass_hm(mWDM,cNFW_method=method)/m1m)**(-GAMMA2) # Schneider+ 2012