"""Ladder step 4: an Einstein-Vlasov steady state (isotropic polytrope from pbhgr.steady_state) must stay static in the areal gauge with maximal slicing (K = 0). Radial orbits cross the centre: this exercises the multi-stream machinery.""" import sys, time, numpy as np sys.path.insert(0, '.') from pbhgr.steady_state import build, sample from pbhgr.cosmo_ev import StaticBackground, CosmoGrid, CParticles, CosmoRun, CosmoRunConfig, solve_metric E0c = float(sys.argv[1]) if len(sys.argv) > 1 else 1.3 n_part = int(sys.argv[2]) if len(sys.argv) > 2 else 40000 K = int(sys.argv[3]) if len(sys.argv) > 3 else 800 st = build(E0c); R, M = st["R"], st["M"]; t_dyn = np.sqrt(R**3 / M) rng = np.random.default_rng(3) Pp = sample(st, n_part, rng) part = CParticles(Pp.r.copy(), Pp.w.copy(), Pp.L.copy(), Pp.N.copy()) bg = StaticBackground(); grid = CosmoGrid(x_out=3.0 * R, K=K) met0 = solve_metric(grid, bg, part, 0.0) for _ in range(4): part.N *= M / met0.m_edge[-1]; met0 = solve_metric(grid, bg, part, 0.0) comp0 = 2 * met0.m_edge[1:] / met0.R_edge[1:] mex = np.interp(met0.R_edge, st["r"], st["m"]); ins = (met0.R_edge > 0.2 * R) & (met0.R_edge < R) print(f"initial data: renormalisation factor of N = {part.N[0] / Pp.N[0]:.4f}; exact max 2m/r = {np.max(2 * st['m'][1:] / st['r'][1:]):.4f}; max |m_edge/m_exact - 1| on 0.2R