28 cg = cfg.chamber_geometry
30 cg.expansion_ratio = _EPS
31 cg.A_exit = float(cg.A_throat) * float(cg.expansion_ratio)
33 cg.chamber_diameter = _DIN
34 ox = cfg.injector.geometry.oxidizer
35 fu = cfg.injector.geometry.fuel
38 ox.impingement_angle = 82.30
39 ox.spacing = 0.0041361
42 fu.impingement_angle = 56.83
43 fu.spacing = 0.0038040
44 cfg.lox_tank.initial_pressure_psi = float(_PO_PSI)
45 cfg.fuel_tank.initial_pressure_psi = float(_PF_PSI)
69 base_path = ROOT /
"configs" /
"impinging_lox_ch4_8000N.yaml"
70 Po_pa = float(_PO_PSI) * 6894.76
71 Pf_pa = float(_PF_PSI) * 6894.76
73 print(
"Fixed geometry: 7435 N optimum (throat/exit/sync, 77 LOX / 119 CH4 jets)")
74 print(f
"A_exit/A_throat = {_EPS:.6f}\n")
76 for name, (c_o, c_f)
in CASES.items():
77 cfg = load_config(str(base_path))
81 res = rnr.evaluate(Po_pa, Pf_pa, silent=
True)
82 d = res.get(
"diagnostics")
or {}
83 pc = float(res.get(
"Pc", 0))
84 dp_o = d.get(
"delta_p_injector_O")
85 dp_f = d.get(
"delta_p_injector_F")
86 r_o = float(dp_o) / pc
if dp_o
is not None and pc > 0
else float(
"nan")
87 r_f = float(dp_f) / pc
if dp_f
is not None and pc > 0
else float(
"nan")
89 cd_o_eff = float(d.get(
"Cd_O", float(
"nan")))
90 cd_f_eff = float(d.get(
"Cd_F", float(
"nan")))
93 f
"Case {name}: target Cd_O={c_o} Cd_F={c_f} "
94 f
"(diagnostics Cd_O={cd_o_eff:.4f} Cd_F={cd_f_eff:.4f})"
96 print(f
" thrust [N]={res.get('F'):.4f}")
97 print(f
" MR={res.get('MR'):.6f}")
98 print(f
" momentum_ratio_R={d.get('momentum_ratio_R')}")
99 print(f
" ΔP_O/Pc={r_o:.6g}")
100 print(f
" ΔP_F/Pc={r_f:.6g}")