Пример #1
0
def test_tracer_nz_support():
    z_max = 1.0
    a = np.linspace(1 / (1 + z_max), 1.0, 100)

    background_def = {
        "a": a,
        "chi": ccl.comoving_radial_distance(COSMO, a),
        "h_over_h0": ccl.h_over_h0(COSMO, a)
    }

    calculator_cosmo = ccl.CosmologyCalculator(Omega_c=0.27,
                                               Omega_b=0.045,
                                               h=0.67,
                                               sigma8=0.8,
                                               n_s=0.96,
                                               background=background_def)

    z = np.linspace(0., 2., 2000)
    n = dndz(z)

    with pytest.raises(ValueError):
        _ = ccl.WeakLensingTracer(calculator_cosmo, (z, n))

    with pytest.raises(ValueError):
        _ = ccl.NumberCountsTracer(calculator_cosmo,
                                   has_rsd=False,
                                   dndz=(z, n),
                                   bias=(z, np.ones_like(z)))

    with pytest.raises(ValueError):
        _ = ccl.CMBLensingTracer(calculator_cosmo, z_source=2.0)
Пример #2
0
    def setup(self):
        # Initialize cosmology
        par = self.get_cosmological_parameters()
        dpk = self.get_pk()
        a = 1./(1+dpk['z'][::-1])
        self.cosmo = ccl.CosmologyCalculator(Omega_c=par['Omega_m']-par['Omega_b'],
                                             Omega_b=par['Omega_b'],
                                             h=par['h'], n_s=par['n_s'],
                                             A_s=par['A_s'], w0=par['w0'],
                                             pk_linear={'a': a,
                                                        'k': dpk['k'],
                                                        'delta_matter:delta_matter': dpk['pk_lin'][::-1][:]},
                                             pk_nonlin={'a': a,
                                                        'k': dpk['k'],
                                                        'delta_matter:delta_matter': dpk['pk_nl'][::-1][:]})

        # Initialize tracers
        if self.config.get('tracers_from_kernels', False):
            tpar = self.get_tracer_parameters()
            ker = self.get_tracer_kernels()
            a_g = 1./(1+ker['z_cl'][::-1])
            self.t_g = []
            for k in ker['kernels_cl']:
                t = ccl.Tracer()
                barr = np.ones_like(a_g)
                t.add_tracer(self.cosmo,
                             (ker['chi_cl'], k),
                             transfer_a=(a_g, barr))
                self.t_g.append(t)
            self.t_s = []
            for k in ker['kernels_sh']:
                t = ccl.Tracer()
                t.add_tracer(self.cosmo,
                             kernel=(ker['chi_sh'], k),
                             der_bessel=-1, der_angles=2)
                self.t_s.append(t)
        else:
            nzs = self.get_tracer_dndzs()
            tpar = self.get_tracer_parameters()
            z_g = nzs['z_cl']
            z_s = nzs['z_sh']
            self.t_g = [ccl.NumberCountsTracer(self.cosmo, True,
                                               (z_g, nzs['dNdz_cl'][:, ni]),
                                               bias=(z_g,
                                                     np.full(len(z_g), b)))
                        for ni, b in zip(range(0, 10),
                                         tpar['b_g'])]
            self.t_s = [ccl.WeakLensingTracer(self.cosmo,
                                              (z_s, nzs['dNdz_sh'][:, ni]),
                                              True)
                        for ni in range(0, 5)]
Пример #3
0
def test_input_arrays():
    cosmo = ccl.Cosmology(Omega_c=0.27,
                          Omega_b=0.05,
                          h=0.7,
                          n_s=0.965,
                          A_s=2e-9)
    # Where the input quantities are calculated.
    a_arr = np.linspace(0.1, 1, 100)
    chi_from_ccl = ccl.background.comoving_radial_distance(cosmo, a_arr)
    hoh0_from_ccl = ccl.background.h_over_h0(cosmo, a_arr)
    growthu_from_ccl = ccl.background.growth_factor_unnorm(cosmo, a_arr)
    fgrowth_from_ccl = ccl.background.growth_rate(cosmo, a_arr)

    background = {'a': a_arr, 'chi': chi_from_ccl, 'h_over_h0': hoh0_from_ccl}
    growth = {
        'a': a_arr,
        'growth_factor': growthu_from_ccl,
        'growth_rate': fgrowth_from_ccl
    }
    cosmo_input = ccl.CosmologyCalculator(Omega_c=0.27,
                                          Omega_b=0.05,
                                          h=0.7,
                                          n_s=0.965,
                                          A_s=2e-9,
                                          background=background,
                                          growth=growth)

    # Where to compare chi(a) from CCL and from CCL with input quantities.
    a_arr = np.linspace(0.102, 0.987, 158)
    chi_ccl_input = ccl.background.comoving_radial_distance(cosmo_input, a_arr)
    chi_from_ccl = ccl.background.comoving_radial_distance(cosmo, a_arr)
    # Relative difference (a-b)/b < 1e-5 = 0.001 %
    assert np.allclose(chi_ccl_input, chi_from_ccl, atol=0., rtol=1e-5)

    growth_ccl_input = ccl.background.growth_factor(cosmo_input, a_arr)
    growth_from_ccl = ccl.background.growth_factor(cosmo, a_arr)
    assert np.allclose(growth_ccl_input, growth_from_ccl, atol=0., rtol=1e-5)

    growthu_ccl_input = ccl.background.growth_factor_unnorm(cosmo_input, a_arr)
    growthu_from_ccl = ccl.background.growth_factor_unnorm(cosmo, a_arr)
    assert np.allclose(growthu_ccl_input, growthu_from_ccl, atol=0., rtol=1e-5)

    fgrowth_ccl_input = ccl.background.growth_rate(cosmo_input, a_arr)
    fgrowth_from_ccl = ccl.background.growth_rate(cosmo, a_arr)
    assert np.allclose(fgrowth_ccl_input, fgrowth_from_ccl, atol=0., rtol=1e-5)

    # Test that the distance/growth flags have been set
    assert cosmo_input.has_distances
    assert cosmo_input.has_growth
Пример #4
0
def test_pk2d_parsing():
    a_arr = np.linspace(0.1, 1, 100)
    k_arr = np.geomspace(1E-4, 1E3, 1000)
    pk_arr = a_arr[:, None] * ((k_arr / 0.01) / (1 +
                                                 (k_arr / 0.01)**3))[None, :]

    psp = ccl.Pk2D(a_arr=a_arr, lk_arr=np.log(k_arr), pk_arr=np.log(pk_arr))

    cosmo = ccl.CosmologyCalculator(Omega_c=0.27,
                                    Omega_b=0.045,
                                    h=0.67,
                                    sigma8=0.8,
                                    n_s=0.96,
                                    pk_nonlin={
                                        'a': a_arr,
                                        'k': k_arr,
                                        'delta_matter:delta_matter': pk_arr,
                                        'a:b': pk_arr
                                    })
    z = np.linspace(0., 1., 200)
    n = np.exp(-((z - 0.5) / 0.1)**2)
    lens1 = ccl.WeakLensingTracer(cosmo, (z, n))
    ells = np.linspace(2, 100, 10)

    cls1 = ccl.angular_cl(cosmo, lens1, lens1, ells, p_of_k_a=None)
    cls2 = ccl.angular_cl(cosmo,
                          lens1,
                          lens1,
                          ells,
                          p_of_k_a='delta_matter:delta_matter')
    cls3 = ccl.angular_cl(cosmo, lens1, lens1, ells, p_of_k_a='a:b')
    cls4 = ccl.angular_cl(cosmo, lens1, lens1, ells, p_of_k_a=psp)
    assert all_finite(cls1)
    assert all_finite(cls2)
    assert all_finite(cls3)
    assert all_finite(cls4)
    assert np.all(np.fabs(cls2 / cls1 - 1) < 1E-10)
    assert np.all(np.fabs(cls3 / cls1 - 1) < 1E-10)
    assert np.all(np.fabs(cls4 / cls1 - 1) < 1E-10)

    # Wrong name
    with pytest.raises(KeyError):
        ccl.angular_cl(cosmo, lens1, lens1, ells, p_of_k_a='a:c')

    # Wrong type
    with pytest.raises(ValueError):
        ccl.angular_cl(cosmo, lens1, lens1, ells, p_of_k_a=3)
Пример #5
0
    def start_ccl(self):
        try: 
            self.pk
        except:
            print('Calculating CAMB power spectrum (with default values)')
            self.get_camb_pk()
        
        try:
            self.chi, self.hubble
        except:
            print('Calculating CAMB background')
            self.get_camb_background()


        # CCL uses an array of a, not z, so need to flip everything
        aarr = 1. / (1. + self.z)
        aarr = np.sort(aarr)
        pk = np.flip(self.pk, axis=0)
        chi = np.flip(self.chi)
        h = self.hubble/self.hubble[0]
        h = np.flip(h)

        self.cosmo_ccl = ccl.CosmologyCalculator(
            Omega_b=self.pars['omegab'],
            Omega_c=self.pars['omegac'],
            h=self.pars['h'],
            n_s=self.pars['ns'],
            A_s=self.pars['As'],
            m_nu=self.pars['mnu'],
            background={'a': aarr,
                       'chi': chi,
                       'h_over_h0': h},
            pk_nonlin={'a': aarr,
                       'k': self.k,
                       'delta_matter:delta_matter': pk}
        )
Пример #6
0
    def calculate(self, state, want_derived=True, **params_values_dict):
        # Get background from upstream
        distance = self.provider.get_comoving_radial_distance(self.z_bg)
        hubble_z = self.provider.get_Hubble(self.z_bg)
        H0 = hubble_z[0]
        E_of_z = hubble_z / H0
        distance = np.flip(distance)
        E_of_z = np.flip(E_of_z)

        # Translate into CCL parameters
        h = H0 * 0.01
        Omega_c = self.provider.get_param('omch2') / h**2
        Omega_b = self.provider.get_param('ombh2') / h**2

        # Generate cosmology and populate background
        a_bg = 1. / (1 + self.z_bg[::-1])

        if self.kmax:
            pkln = {}
            if self.external_nonlin_pk:
                pknl = {}
            for pair in self._var_pairs:
                name = self._translate_camb(pair)
                k, z, Pk_lin = self.provider.get_Pk_grid(var_pair=pair,
                                                         nonlinear=False)
                Pk_lin = np.flip(Pk_lin, axis=0)
                a = 1. / (1 + np.flip(z))
                pkln[name] = Pk_lin
                pkln['a'] = a
                pkln['k'] = k

                if self.external_nonlin_pk:
                    k, z, Pk_nl = self.provider.get_Pk_grid(var_pair=pair,
                                                            nonlinear=True)
                    Pk_nl = np.flip(Pk_nl, axis=0)
                    a = 1. / (1 + np.flip(z))
                    pknl[name] = Pk_nl
                    pknl['a'] = a
                    pknl['k'] = k
            cosmo = ccl.CosmologyCalculator(
                Omega_c=Omega_c,
                Omega_b=Omega_b,
                h=h,
                n_s=self.provider.get_param('ns'),
                A_s=self.provider.get_param('As'),
                T_CMB=2.7255,
                m_nu=self.provider.get_param('mnu'),
                background={
                    'a': a_bg,
                    'chi': distance,
                    'h_over_h0': E_of_z
                },
                pk_linear=pkln,
                pk_nonlin=pknl)
        else:
            cosmo = ccl.CosmologyCalculator(
                Omega_c=Omega_c,
                Omega_b=Omega_b,
                h=h,
                n_s=self.provider.get_param('ns'),
                A_s=self.provider.get_param('As'),
                T_CMB=2.7255,
                m_nu=self.provider.get_param('mnu'),
                background={
                    'a': a_bg,
                    'chi': distance,
                    'h_over_h0': E_of_z
                })

        state['CCL'] = {'cosmo': cosmo}
        # Compute sigma8 (we should actually only do this if required -- TODO)
        state['sigma8'] = ccl.sigma8(cosmo)
        for req_res, method in self._required_results.items():
            state['CCL'][req_res] = method(cosmo)
Пример #7
0
    def calculate(self, state, want_derived=True, **params_values_dict):
        # calculate the general CCL cosmo object which likelihoods can then use to get
        # what they need (likelihoods should cache results appropriately)
        # get our requirements from self.provider

        distance = self.provider.get_comoving_radial_distance(self.z)
        hubble_z = self.provider.get_Hubble(self.z)
        H0 = hubble_z[0]
        h = H0 / 100
        E_of_z = hubble_z / H0

        Omega_c = self.provider.get_param('omch2') / h**2
        Omega_b = self.provider.get_param('ombh2') / h**2
        # Array z is sorted in ascending order. CCL requires an ascending scale factor
        # as input
        # Flip the arrays to make them a function of the increasing scale factor.
        # If redshift sampling is changed, check that it is monotonically increasing
        distance = np.flip(distance)
        E_of_z = np.flip(E_of_z)

        # Array z is sorted in ascending order. CCL requires an ascending scale
        # factor as input
        a = 1. / (1 + self.z[::-1])
        #growth = ccl.background.growth_factor(cosmo, a)
        #fgrowth = ccl.background.growth_rate(cosmo, a)

        if self.kmax:
            for pair in self._var_pairs:
                # Get the matter power spectrum:
                k, z, Pk_lin = self.provider.get_Pk_grid(var_pair=pair,
                                                         nonlinear=False)
                Pk_lin = np.flip(Pk_lin, axis=0)

                if self.nonlinear:
                    _, z, Pk_nonlin = self.provider.get_Pk_grid(var_pair=pair,
                                                                nonlinear=True)
                    Pk_nonlin = np.flip(Pk_nonlin, axis=0)

                    # Create a CCL cosmology object. Because we are giving it background
                    # quantities, it should not depend on the cosmology parameters given
                    cosmo = ccl.CosmologyCalculator(
                        Omega_c=Omega_c,
                        Omega_b=Omega_b,
                        h=h,
                        sigma8=0.8,
                        n_s=0.96,
                        background={
                            'a': a,
                            'chi': distance,
                            'h_over_h0': E_of_z
                        },
                        pk_linear={
                            'a': a,
                            'k': k,
                            'delta_matter:delta_matter': Pk_lin
                        },
                        pk_nonlin={
                            'a': a,
                            'k': k,
                            'delta_matter:delta_matter': Pk_nonlin
                        })

                else:
                    cosmo = ccl.CosmologyCalculator(
                        Omega_c=Omega_c,
                        Omega_b=Omega_b,
                        h=h,
                        sigma8=0.8,
                        n_s=0.96,
                        background={
                            'a': a,
                            'chi': distance,
                            'h_over_h0': E_of_z
                        },
                        pk_linear={
                            'a': a,
                            'k': k,
                            'delta_matter:delta_matter': Pk_lin
                        })

        state['CCL'] = {'cosmo': cosmo}
        for required_result, method in self._required_results.items():
            state['CCL'][required_result] = method(cosmo)
Пример #8
0
def test_input_nonlin_raises():
    cosmo = ccl.Cosmology(Omega_c=0.27,
                          Omega_b=0.05,
                          h=0.7,
                          n_s=0.965,
                          sigma8=0.8,
                          transfer_function='bbks')
    a_arr = np.linspace(0.1, 1.0, 50)
    k_arr = np.logspace(np.log10(2e-4), np.log10(1), 1000)
    pkl_arr = np.array(
        [ccl.power.linear_matter_power(cosmo, k_arr, a) for a in a_arr])
    pk_arr = np.array(
        [ccl.power.nonlin_matter_power(cosmo, k_arr, a) for a in a_arr])

    # Not a dictionary
    with pytest.raises(TypeError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_nonlin=np.pi)

    # k not present
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_nonlin={
                                    'a': a_arr,
                                    'kk': k_arr,
                                    'delta_matter;delta_matter': pk_arr
                                })

    # a not increasing
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_nonlin={
                                    'a': a_arr[::-1],
                                    'k': k_arr,
                                    'delta_matter:delta_matter': pk_arr
                                })

    # delta_matter:delta_matter not present
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_nonlin={
                                    'a': a_arr,
                                    'k': k_arr,
                                    'delta_matter;delta_matter': pk_arr
                                })

    # Non-parsable power spectrum
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_nonlin={
                                    'a': a_arr,
                                    'k': k_arr,
                                    'delta_matter:delta_matter': pk_arr,
                                    'a;b': pk_arr
                                })

    # Wrong shape
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_nonlin={
                                    'a': a_arr,
                                    'k': k_arr,
                                    'delta_matter:delta_matter': pk_arr,
                                    'a:b': pk_arr[0]
                                })

    # Linear Pk not set for halofit
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                nonlinear_model='halofit')

    # Check new power spectrum is stored
    cosmo_input = ccl.CosmologyCalculator(Omega_c=0.27,
                                          Omega_b=0.05,
                                          h=0.7,
                                          n_s=0.965,
                                          sigma8=0.8,
                                          pk_linear={
                                              'a': a_arr,
                                              'k': k_arr,
                                              'delta_matter:delta_matter':
                                              pkl_arr,
                                              'a:b': pkl_arr
                                          },
                                          pk_nonlin={
                                              'a': a_arr,
                                              'k': k_arr,
                                              'delta_matter:delta_matter':
                                              pk_arr
                                          },
                                          nonlinear_model='halofit')
    assert 'a:b' in cosmo_input._pk_nl
    assert cosmo_input.has_nonlin_power
Пример #9
0
def test_input_nonlinear_model_raises():
    cosmo = ccl.Cosmology(Omega_c=0.27,
                          Omega_b=0.05,
                          h=0.7,
                          n_s=0.965,
                          sigma8=0.8,
                          transfer_function='bbks')
    a_arr = np.linspace(0.1, 1.0, 50)
    k_arr = np.logspace(np.log10(2e-4), np.log10(1), 1000)
    pkl_arr = np.array(
        [ccl.power.linear_matter_power(cosmo, k_arr, a) for a in a_arr])

    # If no non-linear model provided, delta_matter:delta_matter
    # should be there.
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_nonlin={
                                    'a': a_arr,
                                    'k': k_arr,
                                    'a:b': pkl_arr
                                })

    with pytest.raises(TypeError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_linear={
                                    'a': a_arr,
                                    'k': k_arr,
                                    'delta_matter:delta_matter': pkl_arr
                                },
                                nonlinear_model=np.pi)

    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                nonlinear_model='halofit')

    with pytest.raises(KeyError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                sigma8=0.8,
                                pk_linear={
                                    'a': a_arr,
                                    'k': k_arr,
                                    'delta_matter:delta_matter': pkl_arr
                                },
                                nonlinear_model={'y:z': 'halofit'})

    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(
            Omega_c=0.27,
            Omega_b=0.05,
            h=0.7,
            n_s=0.965,
            sigma8=0.8,
            pk_linear={
                'a': a_arr,
                'k': k_arr,
                'delta_matter:delta_matter': pkl_arr
            },
            nonlinear_model={'delta_matter:delta_matter': None})

    with pytest.raises(KeyError):
        ccl.CosmologyCalculator(
            Omega_c=0.27,
            Omega_b=0.05,
            h=0.7,
            n_s=0.965,
            sigma8=0.8,
            pk_linear={
                'a': a_arr,
                'k': k_arr,
                'delta_matter:delta_matter': pkl_arr
            },
            nonlinear_model={'delta_matter:delta_matter': 'hmcode'})
Пример #10
0
def test_input_nonlin_power_spectrum():
    cosmo = ccl.Cosmology(Omega_c=0.27,
                          Omega_b=0.05,
                          h=0.7,
                          n_s=0.965,
                          A_s=2e-9,
                          transfer_function='boltzmann_class')
    a_arr = np.linspace(0.1, 1.0, 50)
    chi_from_ccl = ccl.background.comoving_radial_distance(cosmo, a_arr)
    hoh0_from_ccl = ccl.background.h_over_h0(cosmo, a_arr)
    growth_from_ccl = ccl.background.growth_factor_unnorm(cosmo, a_arr)
    fgrowth_from_ccl = ccl.background.growth_rate(cosmo, a_arr)
    k_arr = np.logspace(np.log10(2e-4), np.log10(1), 1000)
    pk_arr = np.empty(shape=(len(a_arr), len(k_arr)))
    for i, a in enumerate(a_arr):
        pk_arr[i] = ccl.power.nonlin_matter_power(cosmo, k_arr, a)

    cosmo_input = ccl.CosmologyCalculator(Omega_c=0.27,
                                          Omega_b=0.05,
                                          h=0.7,
                                          n_s=0.965,
                                          A_s=2e-9,
                                          background={
                                              'a': a_arr,
                                              'chi': chi_from_ccl,
                                              'h_over_h0': hoh0_from_ccl
                                          },
                                          growth={
                                              'a': a_arr,
                                              'growth_factor': growth_from_ccl,
                                              'growth_rate': fgrowth_from_ccl
                                          },
                                          pk_nonlin={
                                              'a': a_arr,
                                              'k': k_arr,
                                              'delta_matter:delta_matter':
                                              pk_arr
                                          })

    pk_CCL_input = ccl.power.nonlin_matter_power(cosmo_input, k_arr, 0.5)
    pk_CCL = ccl.power.nonlin_matter_power(cosmo, k_arr, 0.5)

    assert np.allclose(pk_CCL_input, pk_CCL, atol=0., rtol=1e-5)

    # Test again with negative power spectrum (so it's not logscaled)
    cosmo_input = ccl.CosmologyCalculator(Omega_c=0.27,
                                          Omega_b=0.05,
                                          h=0.7,
                                          n_s=0.965,
                                          A_s=2e-9,
                                          background={
                                              'a': a_arr,
                                              'chi': chi_from_ccl,
                                              'h_over_h0': hoh0_from_ccl
                                          },
                                          growth={
                                              'a': a_arr,
                                              'growth_factor': growth_from_ccl,
                                              'growth_rate': fgrowth_from_ccl
                                          },
                                          pk_nonlin={
                                              'a': a_arr,
                                              'k': k_arr,
                                              'delta_matter:delta_matter':
                                              -pk_arr
                                          })

    pk_CCL_input = -ccl.power.nonlin_matter_power(cosmo_input, k_arr, 0.5)

    assert np.allclose(pk_CCL_input, pk_CCL, atol=0., rtol=1e-5)
Пример #11
0
def test_input_nonlinear_model():
    cosmo = ccl.Cosmology(Omega_c=0.27,
                          Omega_b=0.05,
                          h=0.7,
                          n_s=0.965,
                          A_s=2e-9,
                          transfer_function='boltzmann_class')
    a_arr = np.linspace(0.1, 1.0, 50)
    k_arr = np.logspace(np.log10(2e-4), np.log10(1), 1000)
    pk_arr = np.empty(shape=(len(a_arr), len(k_arr)))
    for i, a in enumerate(a_arr):
        pk_arr[i] = ccl.power.nonlin_matter_power(cosmo, k_arr, a)

    pk_CCL = ccl.power.nonlin_matter_power(cosmo, k_arr, 0.5)

    # Test again passing only linear Pk, but letting HALOFIT do its thing
    kl_arr = np.logspace(-4, 1, 1000)
    pkl_arr = np.array(
        [ccl.power.linear_matter_power(cosmo, kl_arr, a) for a in a_arr])
    cosmo_input = ccl.CosmologyCalculator(Omega_c=0.27,
                                          Omega_b=0.05,
                                          h=0.7,
                                          n_s=0.965,
                                          A_s=2e-9,
                                          pk_linear={
                                              'a': a_arr,
                                              'k': kl_arr,
                                              'delta_matter:delta_matter':
                                              pkl_arr
                                          },
                                          nonlinear_model='halofit')

    pk_CCL_input = ccl.power.nonlin_matter_power(cosmo_input, k_arr, 0.5)

    assert np.allclose(pk_CCL_input, pk_CCL, atol=0., rtol=1e-5)

    # Test extra power spectrum
    kl_arr = np.logspace(-4, 1, 1000)
    pkl_arr = np.array(
        [ccl.power.linear_matter_power(cosmo, kl_arr, a) for a in a_arr])
    cosmo_input = ccl.CosmologyCalculator(Omega_c=0.27,
                                          Omega_b=0.05,
                                          h=0.7,
                                          n_s=0.965,
                                          A_s=2e-9,
                                          pk_linear={
                                              'a': a_arr,
                                              'k': kl_arr,
                                              'delta_matter:delta_matter':
                                              pkl_arr,
                                              'a:b': pkl_arr
                                          },
                                          pk_nonlin={
                                              'a': a_arr,
                                              'k': k_arr,
                                              'delta_matter:delta_matter':
                                              -pk_arr
                                          },
                                          nonlinear_model='halofit')

    pk_CCL_input = cosmo_input.get_nonlin_power('a:b').eval(
        k_arr, 0.5, cosmo_input)
    assert np.allclose(pk_CCL_input, pk_CCL, atol=0., rtol=1e-5)

    # Via `nonlin_power`
    pk_CCL_input = ccl.power.nonlin_power(cosmo_input,
                                          k_arr,
                                          0.5,
                                          p_of_k_a='a:b')
    assert np.allclose(pk_CCL_input, pk_CCL, atol=0., rtol=1e-5)

    # Use dictionary
    cosmo_input = ccl.CosmologyCalculator(Omega_c=0.27,
                                          Omega_b=0.05,
                                          h=0.7,
                                          n_s=0.965,
                                          A_s=2e-9,
                                          pk_linear={
                                              'a': a_arr,
                                              'k': kl_arr,
                                              'delta_matter:delta_matter':
                                              pkl_arr,
                                              'a:b': pkl_arr,
                                              'c:d': pkl_arr
                                          },
                                          pk_nonlin={
                                              'a': a_arr,
                                              'k': k_arr,
                                              'delta_matter:delta_matter':
                                              -pk_arr
                                          },
                                          nonlinear_model={
                                              'a:b': 'halofit',
                                              'c:d': None
                                          })
    pk_CCL_input = ccl.power.nonlin_power(cosmo_input,
                                          k_arr,
                                          0.5,
                                          p_of_k_a='a:b')
    assert np.allclose(pk_CCL_input, pk_CCL, atol=0., rtol=1e-5)
    assert 'c:d' not in cosmo_input._pk_nl
Пример #12
0
def test_hodcl():
    # With many thanks to Ryu Makiya, Eiichiro Komatsu
    # and Shin'ichiro Ando for providing this benchmark.
    # HOD params
    lMcut = 11.8
    lM1 = 11.73
    sigma_Ncen = 0.15
    alp_Nsat = 0.77
    rmax = 4.39
    rgs = 1.17

    # Input power spectrum
    ks = np.loadtxt("benchmarks/data/k_hod.txt")
    zs = np.loadtxt("benchmarks/data/z_hod.txt")
    pks = np.loadtxt("benchmarks/data/pk_hod.txt")
    l_bm, cl_bm = np.loadtxt("benchmarks/data/cl_hod.txt",
                             unpack=True)

    # Set N(z)
    def _nz_2mrs(z):
        # From 1706.05422
        m = 1.31
        beta = 1.64
        x = z / 0.0266
        return x**m * np.exp(-x**beta)
    z1 = 1e-5
    z2 = 0.1
    z_arr = np.linspace(z1, z2, 1024)
    dndz = _nz_2mrs(z_arr)

    # CCL prediction
    # Make sure we use the same P(k)
    cosmo = ccl.CosmologyCalculator(
        Omega_b=0.05,
        Omega_c=0.25,
        h=0.67,
        n_s=0.9645,
        A_s=2.0E-9,
        m_nu=0.00001,
        m_nu_type='equal',
        pk_linear={'a': 1./(1.+zs[::-1]),
                   'k': ks,
                   'delta_matter:delta_matter': pks[::-1, :]})
    cosmo.compute_growth()

    # Halo model setup
    mass_def = ccl.halos.MassDef(200, 'critical')
    cm = ccl.halos.ConcentrationDuffy08(mass_def)
    hmf = ccl.halos.MassFuncTinker08(cosmo, mass_def=mass_def)
    hbf = ccl.halos.HaloBiasTinker10(cosmo, mass_def=mass_def)
    hmc = ccl.halos.HMCalculator(cosmo, hmf, hbf, mass_def)
    prf = ccl.halos.HaloProfileHOD(cm,
                                   lMmin_0=np.log10(10.**lMcut/cosmo['h']),
                                   siglM_0=sigma_Ncen,
                                   lM0_0=np.log10(10.**lMcut/cosmo['h']),
                                   lM1_0=np.log10(10.**lM1/cosmo['h']),
                                   alpha_0=alp_Nsat,
                                   bg_0=rgs,
                                   bmax_0=rmax)
    prf2pt = ccl.halos.Profile2ptHOD()
    # P(k)
    k_arr = np.geomspace(1E-4, 1E2, 512)
    a_arr = np.linspace(0.8, 1, 32)
    pk_hod = ccl.halos.halomod_Pk2D(cosmo, hmc, prf, prof_2pt=prf2pt,
                                    normprof1=True, lk_arr=np.log(k_arr),
                                    a_arr=a_arr)
    # C_ell
    tr = ccl.NumberCountsTracer(cosmo, False, (z_arr, dndz),
                                (z_arr, np.ones(len(dndz))))
    cl_hod = ccl.angular_cl(cosmo, tr, tr, l_bm, p_of_k_a=pk_hod)

    assert np.all(np.fabs(cl_hod/cl_bm-1) < 0.005)
Пример #13
0
def test_input_arrays_raises():
    """
    Test for input scale factor array being descending,
    not ending in 1.0, being different size, as well as
    for no input arrays.
    """
    for input_a in [
            input_a_array_descending, input_a_array_not1, input_a_array[:-2]
    ]:
        with pytest.raises(ValueError):
            ccl.CosmologyCalculator(Omega_c=0.27,
                                    Omega_b=0.05,
                                    h=0.7,
                                    n_s=0.965,
                                    A_s=2e-9,
                                    growth={
                                        'a': input_a,
                                        'growth_factor': input_growth,
                                        'growth_rate': input_fgrowth
                                    })
        with pytest.raises(ValueError):
            ccl.CosmologyCalculator(Omega_c=0.27,
                                    Omega_b=0.05,
                                    h=0.7,
                                    n_s=0.965,
                                    A_s=2e-9,
                                    background={
                                        'a': input_a,
                                        'chi': input_chi,
                                        'h_over_h0': input_hoh0
                                    })
    # Not a dictionary
    with pytest.raises(TypeError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                A_s=2e-9,
                                growth=3)
    with pytest.raises(TypeError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                A_s=2e-9,
                                background=3)
    # Incomplete dictionary
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                A_s=2e-9,
                                background={
                                    'a': input_a_array,
                                    'h_over_h0': input_hoh0
                                })
    with pytest.raises(ValueError):
        ccl.CosmologyCalculator(Omega_c=0.27,
                                Omega_b=0.05,
                                h=0.7,
                                n_s=0.965,
                                A_s=2e-9,
                                growth={
                                    'a': input_a_array,
                                    'growth_rate': input_fgrowth
                                })