SP(k) baryon suppression model
The SP(k) model applies a multiplicative suppression to the non-linear matter power spectrum to account for baryonic feedback effects. It is calibrated against hydrodynamical simulations and wrapped around a base non-linear prescription (Halofit/HMCode by default).
Reference: Salcido et al., MNRAS 523, 2247 (2023)
Calibrated validity domain
Quantity |
Range |
|---|---|
z |
0 to 3 |
k |
up to 12 h/Mpc |
SO |
200 or 500 |
The baryon fraction f_b must also fall within per-(z, k, SO) calibrated limits derived from the fitting coefficients.
Boundary behavior
Condition |
Action |
Rationale |
|---|---|---|
z outside [0, 3] |
Identity (no suppression) |
Feedback sub-dominant at high z; model not calibrated there. |
k < k_min (~10⁻¹² h/Mpc) |
Identity (no suppression) |
Baryonic effects negligible on large scales. |
k > 12 h/Mpc |
Clamp to k = 12 |
Suppression saturates at high k; avoids breaking P(k) integrals (σ₈, lensing). |
f_b outside calibrated limits |
|
Model invalid — no reliable prediction possible. |
When FeedbackLevel > 0, a one-time warning is printed for each out-of-range
case encountered during a calculation.
MCMC / Cobaya considerations
The boundary choices are designed for stable sampling:
k-clamping keeps P(k) integrals (σ₈, CMB lensing) finite for every sample. The clamp is physically motivated: SP(k) suppression saturates at high k.
z-skip is safe because most cosmological observables (weak lensing, galaxy clustering, CMB lensing) probe z < 3.
f_b → NaN acts as a hard prior boundary. Any parameter combination pushing f_b outside the calibrated envelope produces NaN in the non-linear ratio, which propagates through
get_matter_power_interpolator()and causes Cobaya to assign −∞ log-likelihood (sample rejected).
Note
get_matter_power_spectrum() uses Fortran-side
spline interpolation onto a regular log-k grid that does not preserve
NaN (it produces tiny finite unphysical values ~10⁻²²).
get_matter_power_interpolator() builds a 2D
RectBivariateSpline over the internal (z, k) grid. Any NaN on that
grid propagates through the entire spline, so all evaluations return
NaN — not just the invalid (z, k) cells. This is the correct behaviour
for MCMC: a single out-of-range point invalidates the whole sample.
For diagnostics (locating which (z, k) cells are NaN), use
get_linear_matter_power_spectrum() with
nonlinear=True, which returns the raw nonlinear P(k) on the internal
transfer-function k-grid without any interpolation. When comparing against
other spectra, interpolate those onto this k-grid (not vice versa) to
avoid spurious oscillations from resampling through BAO features.
Prior guidance: set priors on the SP(k) relation parameters to keep f_b within calibrated limits for the bulk of your parameter space. The NaN boundary then acts only as a safety net for rare excursions, not a dominant rejection mechanism.
Base non-linear model configuration
SPkNonLinear wraps a Halofit instance as its base non-linear model.
The full set of Halofit/HMCode parameters — halofit_version,
HMCode_A_baryon, HMCode_eta_baryon, and HMCode_logT_AGN — can be
passed directly to set_params() and are
forwarded to the wrapped base model:
spk = camb.SPkNonLinear()
spk.set_params(
halofit_version="mead2020_feedback",
HMCode_logT_AGN=8.0,
SPk_feedback=False,
)
These parameters are also accepted as flat keyword arguments by
camb.set_params(), and as extra_args in Cobaya.
Warning
SPk_feedback=True cannot be combined with
halofit_version='mead2020_feedback' or non-default
HMCode_A_baryon/HMCode_eta_baryon values (HMCode 2015/2016), as
this would double-count baryonic corrections. A CAMBValueError is
raised if this combination is detected.
API reference
See camb.nonlinear.SPkNonLinear for the full parameter list and
Cobaya YAML example.