Пример #1
0
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
Пример #2
0
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
Пример #3
0
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__()
Пример #4
0
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