Source code for harmonia.cosmology
"""
***************************************************************************
Cosmological modelling (:mod:`~harmonia.cosmology`)
***************************************************************************
Provide general and fiducial cosmological models and compute derived model
quantities.
Cosmological models are implemented by `nbodykit` (see `documentation
<https://nbodykit.readthedocs.io>`_).
.. autosummary::
BaseModel
|
"""
import logging
from pprint import pformat
from nbodykit.cosmology import Cosmology
from .geometry import differential_AP_distortion, redshift_from_distance
from .scale_dependence import (
modified_power_spectrum,
scale_dependence_modification,
scale_dependent_bias,
)
[docs]class BaseModel(Cosmology):
"""Fixed (fiducial) cosmological model built with a parameter
dictionary read from an external file, e.g. with file contents
.. code-block::
{
'h': 0.70,
'Omega0_b': 0.044,
'Omega0_cdm': 0.226,
'sigma8': 0.8,
}
Parameters
----------
source_file : *str or* :class:`pathlib.Path`
Cosmological parameter file (as a Python dictionary).
comm : :class:`mpi4py.Comm` *or None*, optional
MPI communicator (default is `None`).
"""
def __init__(self, source_file, comm=None):
self.logger = logging.getLogger(self.__class__.__name__)
self.comm = comm
with open(source_file) as cosmo_source:
source_params = {
k: round(v, ndigits=8)
for k, v in eval(cosmo_source.read()).items()
}
cosmo_params = {
param_name: param_value
for param_name, param_value in source_params.items()
if param_name != 'sigma8'
}
super().__init__(**cosmo_params)
self.match(sigma8=source_params['sigma8'])
if self.comm is None or self.comm.rank == 0:
self.logger.info(
"Created cosmological model with parameters:\n%s.",
pformat(source_params)
)