Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Multiplicity function #44

Merged
merged 5 commits into from
Aug 13, 2021
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 4 additions & 2 deletions examples/example_ca.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,10 @@ main (gint argc, gchar *argv[])
/****************************************************************************
* New multiplicity function 'NcMultiplicityFuncTinkerMean'
****************************************************************************/
mulf = nc_multiplicity_func_new_from_name ("NcMultiplicityFuncTinkerMean");

mulf = nc_multiplicity_func_tinker_new ();
nc_multiplicity_func_set_mdef (NC_MULTIPLICITY_FUNC (mulf), NC_MULTIPLICITY_FUNC_MASS_DEF_MEAN);
nc_multiplicity_func_set_Delta (200.0);

/****************************************************************************
* New mass function object using the objects defined above.
****************************************************************************/
Expand Down
4 changes: 3 additions & 1 deletion examples/example_ca_sampling.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@
#
# New multiplicity function 'NcMultiplicityFuncTinkerMean'
#
mulf = Nc.MultiplicityFunc.new_from_name ("NcMultiplicityFuncTinkerMean")
mulf = Nc.MultiplicityFuncTinker.new ()
mulf.set_mdef (Nc.MultiplicityFuncMassDef.MEAN)
mulf.set_Delta (200.0)

#
# New mass function object using the objects defined above.
Expand Down
4 changes: 3 additions & 1 deletion examples/example_halo_mass_function.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@
#
# New multiplicity function 'NcMultiplicityFuncTinkerMean'
#
mulf = Nc.MultiplicityFunc.new_from_name ("NcMultiplicityFuncTinkerMean")
mulf = Nc.MultiplicityFuncTinker.new ()
mulf.set_mdef (Nc.MultiplicityFuncMassDef.MEAN)
mulf.set_Delta (200.0)

#
# New mass function object using the objects defined above.
Expand Down
2 changes: 1 addition & 1 deletion notebooks/CLMM_backend_comp.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.2"
"version": "3.9.6"
}
},
"nbformat": 4,
Expand Down
92 changes: 76 additions & 16 deletions notebooks/NC_CCL_Colossus_density_profiles.ipynb

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions numcosmo/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -400,8 +400,6 @@ nc_headers = \
lss/nc_multiplicity_func_jenkins.h \
lss/nc_multiplicity_func_warren.h \
lss/nc_multiplicity_func_tinker.h \
lss/nc_multiplicity_func_tinker_mean.h \
lss/nc_multiplicity_func_tinker_crit.h \
lss/nc_multiplicity_func_tinker_mean_normalized.h \
lss/nc_multiplicity_func_crocce.h \
lss/nc_halo_mass_function.h \
Expand Down Expand Up @@ -553,8 +551,6 @@ nc_sources = \
lss/nc_multiplicity_func_jenkins.c \
lss/nc_multiplicity_func_warren.c \
lss/nc_multiplicity_func_tinker.c \
lss/nc_multiplicity_func_tinker_mean.c \
lss/nc_multiplicity_func_tinker_crit.c \
lss/nc_multiplicity_func_tinker_mean_normalized.c \
lss/nc_multiplicity_func_crocce.c \
lss/nc_halo_mass_function.c \
Expand Down
186 changes: 141 additions & 45 deletions numcosmo/lss/nc_multiplicity_func.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,15 @@
* @title: NcMultiplicityFunc
* @short_description: Dark matter halo multiplicity function.
*
* FIXME
* The multiplicity function comprises information about the non-linear regime
* of halo (structure) formation. The mass function can be written as
* \begin{equation}\label{def:multip}
* \frac{dn (M,z)}{d\ln M} = - \frac{\rho_m (z)}{M} f(\sigma_R, z) \frac{1}{\sigma_R} \frac{d\sigma_R}{d\ln M},
* \end{equation}
* where $\rho_m(z)$ is the mean matter density at redshift $z$, $f(\sigma_R, z)$ is the multiplicity function,
* and $\sigma_R$ is the variance of the linear density contrast filtered on the length scale $R$ associated to the
* mass $M$.
*
*/

#ifdef HAVE_CONFIG_H
Expand All @@ -39,42 +47,108 @@
#include "lss/nc_multiplicity_func.h"
#include "math/ncm_serialize.h"
#include "math/ncm_cfg.h"
#include "numcosmo/nc_enum_types.h"

G_DEFINE_ABSTRACT_TYPE (NcMultiplicityFunc, nc_multiplicity_func, G_TYPE_OBJECT);
struct _NcMultiplicityFuncPrivate
{
gint place_holder;
};

/**
* nc_multiplicity_func_new_from_name:
* @multiplicity_name: string which specifies the multiplicity function type.
*
* This function returns a new #NcMultiplicityFunc whose type is defined by @multiplicity_name.
*
* Returns: A new #NcMultiplicityFunc.
*/
NcMultiplicityFunc *
nc_multiplicity_func_new_from_name (gchar *multiplicity_name)
enum
{
PROP_0,
PROP_MDEF,
PROP_SIZE,
};

G_DEFINE_TYPE_WITH_PRIVATE (NcMultiplicityFunc, nc_multiplicity_func, G_TYPE_OBJECT);
vitenti marked this conversation as resolved.
Show resolved Hide resolved

static void
nc_multiplicity_func_init (NcMultiplicityFunc *mulf)
{
GObject *obj = ncm_serialize_global_from_string (multiplicity_name);
GType multiplicity_type = G_OBJECT_TYPE (obj);
if (!g_type_is_a (multiplicity_type, NC_TYPE_MULTIPLICITY_FUNC))
g_error ("nc_multiplicity_func_new_from_name: NcMultiplicityFunc %s do not descend from %s.", multiplicity_name, g_type_name (NC_TYPE_MULTIPLICITY_FUNC));
return NC_MULTIPLICITY_FUNC (obj);
NcMultiplicityFuncPrivate * const self = mulf->priv = nc_multiplicity_func_get_instance_private (mulf);

self->place_holder = 0;
}

/**
* nc_multiplicity_func_eval:
* @mulf: a #NcMultiplicityFunc.
* @cosmo: a #NcHICosmo.
* @sigma: FIXME
* @z: redshift.
*
* FIXME
*
* Returns: FIXME
*/
gdouble
nc_multiplicity_func_eval (NcMultiplicityFunc *mulf, NcHICosmo *cosmo, gdouble sigma, gdouble z)
static void
_nc_multiplicity_func_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
return NC_MULTIPLICITY_FUNC_GET_CLASS (mulf)->eval (mulf, cosmo, sigma, z);
NcMultiplicityFunc *mulf = NC_MULTIPLICITY_FUNC (object);
/* NcMultiplicityFuncPrivate * const self = mulf->priv; */

g_return_if_fail (NC_IS_MULTIPLICITY_FUNC (object));

switch (prop_id)
{
case PROP_MDEF:
NC_MULTIPLICITY_FUNC_GET_CLASS (mulf)->set_mdef (mulf, g_value_get_enum (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}

static void
_nc_multiplicity_func_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NcMultiplicityFunc *mulf = NC_MULTIPLICITY_FUNC (object);
/* NcMultiplicityFuncPrivate * const self = mulf->priv; */

g_return_if_fail (NC_IS_MULTIPLICITY_FUNC (object));

switch (prop_id)
{
case PROP_MDEF:
g_value_set_enum (value, nc_multiplicity_func_get_mdef (mulf));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}

static void
_nc_multiplicity_func_finalize (GObject *object)
{

/* Chain up : end */
G_OBJECT_CLASS (nc_multiplicity_func_parent_class)->finalize (object);
}

static void _nc_multiplicity_func_set_mdef (NcMultiplicityFunc *mulf, NcMultiplicityFuncMassDef mdef) { g_error ("method set_mdef not implemented by %s.", G_OBJECT_TYPE_NAME (mulf)); }
static NcMultiplicityFuncMassDef _nc_multiplicity_func_get_mdef (NcMultiplicityFunc *mulf) { g_error ("method get_mdef not implemented by %s.", G_OBJECT_TYPE_NAME (mulf)); return -1; }
static gdouble _nc_multiplicity_func_eval (NcMultiplicityFunc *mulf, NcHICosmo *cosmo, gdouble sigma, gdouble z) { g_error ("method eval not implemented by %s.", G_OBJECT_TYPE_NAME (mulf)); return 0.0; }

static void
nc_multiplicity_func_class_init (NcMultiplicityFuncClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);

object_class->set_property = &_nc_multiplicity_func_set_property;
object_class->get_property = &_nc_multiplicity_func_get_property;
object_class->finalize = &_nc_multiplicity_func_finalize;

/**
* NcMultiplicityFunc:mass-def:
*
* It refers to the halo finder used to obtain the multiplicity function (e.g., SO and FoF), and
* the background density $\rho_\mathrm{bg}$ used in the mass definition \eqref{eq:mrr}.
* See the enumerator #NcMultiplicityFuncMassDef for more details about the
* background density definition.
*
*/
g_object_class_install_property (object_class,
PROP_MDEF,
g_param_spec_enum ("mass-def",
NULL,
"Mass definition",
NC_TYPE_MULTIPLICITY_FUNC_MASS_DEF, NC_MULTIPLICITY_FUNC_MASS_DEF_MEAN,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB));
klass->set_mdef = &_nc_multiplicity_func_set_mdef;
klass->get_mdef = &_nc_multiplicity_func_get_mdef;
klass->eval = &_nc_multiplicity_func_eval;
}

/**
Expand Down Expand Up @@ -105,26 +179,48 @@ nc_multiplicity_func_clear (NcMultiplicityFunc **mulf)
g_clear_object (mulf);
}

static void
nc_multiplicity_func_init (NcMultiplicityFunc *mulf)
/**
* nc_multiplicity_func_set_mdef: (virtual set_mdef)
* @mulf: a #NcMultiplicityFunc
* @mdef: a #NcMultiplicityFuncMassDef
*
* Sets the mass definition to mdef.
*
*/
void
nc_multiplicity_func_set_mdef (NcMultiplicityFunc *mulf, NcMultiplicityFuncMassDef mdef)
{
NCM_UNUSED (mulf);
NC_MULTIPLICITY_FUNC_GET_CLASS (mulf)->set_mdef (mulf, mdef);
}

static void
_nc_multiplicity_func_finalize (GObject *object)
/**
* nc_multiplicity_func_get_mdef: (virtual get_mdef)
* @mulf: a #NcMultiplicityFunc
*
* Gets the mass definition.
*
* Returns: mdef.
*/
NcMultiplicityFuncMassDef
nc_multiplicity_func_get_mdef (NcMultiplicityFunc *mulf)
{

/* Chain up : end */
G_OBJECT_CLASS (nc_multiplicity_func_parent_class)->finalize (object);
return NC_MULTIPLICITY_FUNC_GET_CLASS (mulf)->get_mdef (mulf);
}

static void
nc_multiplicity_func_class_init (NcMultiplicityFuncClass *klass)
/**
* nc_multiplicity_func_eval: (virtual eval)
* @mulf: a #NcMultiplicityFunc.
* @cosmo: a #NcHICosmo.
* @sigma: standard fluctuation of the matter density contrast.
* @z: redshift.
*
* FIXME
*
* Returns: FIXME
*/
gdouble
nc_multiplicity_func_eval (NcMultiplicityFunc *mulf, NcHICosmo *cosmo, gdouble sigma, gdouble z)
{
GObjectClass* object_class = G_OBJECT_CLASS (klass);
//GObjectClass* parent_class = G_OBJECT_CLASS (klass);

object_class->finalize = _nc_multiplicity_func_finalize;
return NC_MULTIPLICITY_FUNC_GET_CLASS (mulf)->eval (mulf, cosmo, sigma, z);
}

36 changes: 34 additions & 2 deletions numcosmo/lss/nc_multiplicity_func.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,27 +42,59 @@ G_BEGIN_DECLS

typedef struct _NcMultiplicityFuncClass NcMultiplicityFuncClass;
typedef struct _NcMultiplicityFunc NcMultiplicityFunc;
typedef struct _NcMultiplicityFuncPrivate NcMultiplicityFuncPrivate;

/**
* NcMultiplicityFuncMassDef:
* @NC_MULTIPLICITY_FUNC_MASS_DEF_MEAN: halo mass defined in terms of the mean density $\rho_\mathrm{bg} = \rho_m(z)$
* @NC_MULTIPLICITY_FUNC_MASS_DEF_CRITICAL: halo mass defined in terms of the critical density $\rho_\mathrm{bg} = \rho_\mathrm{crit}(z)$
* @NC_MULTIPLICITY_FUNC_MASS_DEF_VIRIAL: halo mass defined in terms of virial overdensity times the critical density $\rho_\mathrm{bg} = \rho_\mathrm{crit
* @NC_MULTIPLICITY_FUNC_MASS_DEF_FOF: friends of friends
*
* Spherical overdensity halo mass: $$M_\Delta = \frac{4\pi}{3} \Delta \rho_\mathrm{bg} r_\Delta^3,$$
* where $\rho_\mathrm{bg}$ is the background density of the universe at redshift z, $\rho_\mathrm{bg} (z)$.
* For @NC_HALO_DENSITY_PROFILE_MASS_DEF_VIRIAL, the parameter #NcHaloDensityProfile:log10MDelta is ignored and
* \begin{equation}\label{def:DVir}
* \Delta_\mathrm{Vir} = 18 \pi^2 + 82 x - 39 x^2, \quad x \equiv \Omega_m(z) - 1.
* \end{equation}
*
*/
typedef enum _NcMultiplicityFuncMassDef
{
NC_MULTIPLICITY_FUNC_MASS_DEF_MEAN = 0,
NC_MULTIPLICITY_FUNC_MASS_DEF_CRITICAL,
NC_MULTIPLICITY_FUNC_MASS_DEF_VIRIAL,
NC_MULTIPLICITY_FUNC_MASS_DEF_FOF,
/* < private > */
NC_MULTIPLICITY_FUNC_MASS_DEF_LEN, /*< skip >*/
} NcMultiplicityFuncMassDef;

struct _NcMultiplicityFuncClass
{
/*< private >*/
GObjectClass parent_class;
void (*set_mdef) (NcMultiplicityFunc *mulf, NcMultiplicityFuncMassDef mdef);
NcMultiplicityFuncMassDef (*get_mdef) (NcMultiplicityFunc *mulf);
gdouble (*eval) (NcMultiplicityFunc *mulf, NcHICosmo *cosmo, gdouble sigma, gdouble z);
};

struct _NcMultiplicityFunc
{
/*< private >*/
GObject parent_instance;
NcMultiplicityFuncPrivate *priv;
};

GType nc_multiplicity_func_get_type (void) G_GNUC_CONST;

NcMultiplicityFunc *nc_multiplicity_func_new_from_name (gchar *multiplicity_name);
gdouble nc_multiplicity_func_eval (NcMultiplicityFunc *mulf, NcHICosmo *cosmo, gdouble sigma, gdouble z);
void nc_multiplicity_func_free (NcMultiplicityFunc *mulf);
void nc_multiplicity_func_clear (NcMultiplicityFunc **mulf);

void nc_multiplicity_func_set_mdef (NcMultiplicityFunc *mulf, NcMultiplicityFuncMassDef mdef);
NcMultiplicityFuncMassDef nc_multiplicity_func_get_mdef (NcMultiplicityFunc *mulf);

gdouble nc_multiplicity_func_eval (NcMultiplicityFunc *mulf, NcHICosmo *cosmo, gdouble sigma, gdouble z);

G_END_DECLS

#endif /* _NC_MULTIPLICITY_FUNC_H_ */