Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Two-component populations (superseded)

San Diego State University

```{admonition} Superseded — two-component capability now lives in MultiComponentCluster :class: important The TwoComponentConfig / generate_two_component_cluster API this page used to validate was deleted in the 2026-06 unified multi-component redesign (together with its unit suite tests/unit/test_populations.py). It carried a real physics bug: each sub-population’s velocity DF was fed the full cluster mass (an isolated superposition, never a shared potential), with no COM/virial finalisation — silent for equal masses, non-self-consistent for unequal-mass populations. Its replacement solves exactly that problem: every component is drawn from its own DF in one shared self-consistent potential.


## Where the capability went

```{list-table}
:header-rows: 1

* - Need
  - Use now
  - Validation page
* - Two (or more) populations in one self-consistent potential, DF-defined
    (lowered-isothermal/LIMEPY family; GC 1G/2G, halo+core, mass segregation
    via $\delta$)
  - `MultiComponentCluster.from_components` / `.from_mass_segregation` /
    `.from_imf` (**Engine A**)
  - [](multimass-equilibrium.md)
* - Two (or more) populations with *prescribed densities* (Plummer/EFF/King
    mixes) in one shared potential, DFs by Eddington inversion
  - `MultiComponentCluster.from_density_profiles` (**Engine B**)
  - [](engine-b-eddington.md)

The two-component check that survives

scripts/validate_cluster_ic.py §2 (rewired 2026-06-09 onto MultiComponentCluster, re-run 2026-06-10, ALL PASS) exercises the canonical two-population case — a cold (w=0.7w=0.7) and a hot (w=1.0w=1.0) population in one shared W0=7W_0=7 potential:

Property

Expected

Measured

Gate

Radial separation (cold concentrated)

median rcold<r_{\rm cold} < median rhotr_{\rm hot}

1.50 pc <8.36< 8.36 pc

strict inequality

Per-component virial QjQ_j (exact-quadrature oracle)

[0.5,0.5][0.5, 0.5]

[0.5000,0.5000][0.5000, 0.5000]

Qj0.5<5×103|Q_j - 0.5| < 5\times10^{-3}

MultiComponentCluster.from_components: radial distributions of a cold
(w=0.7, concentrated, median r = 1.50 pc) and a hot (w=1.0, extended,
median r = 8.36 pc) population sampled from ONE shared self-consistent
potential, each in detailed equilibrium (Q_j = [0.5, 0.5] by the
exact-quadrature oracle). From scripts/validate_cluster_ic.py §2
(2026-06-10 run).

Figure 1:MultiComponentCluster.from_components: radial distributions of a cold (w=0.7w=0.7, concentrated, median r=1.50r = 1.50 pc) and a hot (w=1.0w=1.0, extended, median r=8.36r = 8.36 pc) population sampled from ONE shared self-consistent potential, each in detailed equilibrium (Qj=[0.5,0.5]Q_j = [0.5, 0.5] by the exact-quadrature oracle). From scripts/validate_cluster_ic.py §2 (2026-06-10 run).

env -u VIRTUAL_ENV uv run --no-sync python scripts/validate_cluster_ic.py

Supersession history

References

Theory at Two-component populations — worked examples. The exact self-consistent multi-component DF family is Gieles & Zocchi (2015) (LIMEPY); progenax’s own differentiable implementation is validated at Multi-mass LIMEPY equilibrium (Engine A) and Multi-component Eddington equilibria (Engine B).

References
  1. Gieles, M., & Zocchi, A. (2015). A family of lowered isothermal models. Monthly Notices of the Royal Astronomical Society, 454, 576–592. 10.1093/mnras/stv1848