Ко всем библиотекам · scripts

scripts/debug_ueq.py

27 строк · 1.6 KB · pbhgr @ 9e8e13d · как текст

import sys, numpy as np
sys.path.insert(0, '.')
from pbhgr.cosmo_ev import Background, CosmoGrid, CParticles, CosmoRun, CosmoRunConfig, solve_metric
from pbhgr.cosmo_id import yoo_spherical_cmc, sample_shells_quiet
bg = Background(5.0); rm = np.sqrt(6); t_H = bg.t_i*(np.sqrt(6)/0.2)**3; x_out = 5*rm
grid = CosmoGrid(x_out, 1000); prof = yoo_spherical_cmc(0.3, r_max=x_out*1.05)
x, P, Lsq, N = sample_shells_quiet(prof, grid.x_edge, 4); part = CParticles(x, P, Lsq, N)
run = CosmoRun(grid, bg, part, CosmoRunConfig(cfl=0.4, t_end=0.5*t_H, diag_every=10**9), bg.t_i)
met = run.run()
run.cfg.t_end = 2*t_H; dt = 0.2*run.dt(met)
met0 = met; run._step(dt); met1 = solve_metric(grid, bg, part, run.t)
R = met0.R_edge; H0, H1 = bg.H(met0.t), bg.H(met1.t)
def terms(met):
    K = bg.K(met.t); beta = met.alpha_edge*R*met.Kth_edge if met is met0 else met.alpha_edge*met.R_edge*met.Kth_edge
    dbeta = np.gradient(beta, met.dR); KR = K - 2*met.Kth_edge
    return beta*met.dA_edge, met.A_edge*dbeta, -met.alpha_edge*met.A_edge*KR
t0 = terms(met0); t1 = terms(met1)
fd_x = (met1.A_edge - met0.A_edge)/dt
corr = 0.5*(H0*met0.R_edge*met0.dA_edge + H1*met1.R_edge*met1.dA_edge)
pred = [0.5*(a+b) for a, b in zip(t0, t1)]
print(f"t/t_H={met0.t/t_H:.3f}, dt={dt:.3e}, H={H0:.4e}")
print("  x/rm    A-1        fd_x       -HRA'     sum(fd)     bA'        Ab'       -aAK_R     pred      resid")
for xr in (0.05, 0.2, 0.5, 1.0, 1.5, 2.0, 3.0, 4.5):
    j = int(xr*rm/grid.dx)
    p = sum(pp[j] for pp in pred); f = fd_x[j] - corr[j]
    print(f"  {xr:4.2f} {met0.A_edge[j]-1:+.3e} {fd_x[j]:+.3e} {-corr[j]:+.3e} {f:+.3e} {pred[0][j]:+.3e} {pred[1][j]:+.3e} {pred[2][j]:+.3e} {p:+.3e} {f-p:+.3e}")