STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
compare_layer1_w_mom_8000n.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2"""Run short Layer-1 smoke trials at several W_MOM values (requirements dict).
3
4Compare impinging momentum_ratio_R vs thrust/MR/ΔP bands on configs/impinging_lox_ch4_8000N.yaml.
5"""
6
7from __future__ import annotations
8
9import argparse
10import copy
11import sys
12from pathlib import Path
13
14ROOT = Path(__file__).resolve().parents[1]
15sys.path.insert(0, str(ROOT))
16
17from engine.core.runner import PintleEngineRunner # noqa: E402
18from engine.optimizer.layers.layer1_static_optimization import run_layer1_optimization # noqa: E402
19from engine.pipeline.io import load_config # noqa: E402
20
21
22def main() -> None:
23 ap = argparse.ArgumentParser(description=__doc__)
24 ap.add_argument("--config", type=str, default=str(ROOT / "configs/impinging_lox_ch4_8000N.yaml"))
25 ap.add_argument("--layer1-max-iterations", type=int, default=22)
26 args = ap.parse_args()
27
28 cfg_path = Path(args.config)
29 weights = [300.0, 1000.0, 3000.0]
30 base_cfg = load_config(str(cfg_path))
31
32 print("\n=== Layer-1 W_MOM comparison (same smoke budget per trial) ===")
33
34 for w_mom in weights:
35 cfg = copy.deepcopy(base_cfg)
36 req = cfg.design_requirements.model_dump()
37 req["W_MOM"] = float(w_mom)
38 pcfg = {
39 "mode": "optimizer_controlled",
40 "max_lox_pressure_psi": float(req["max_lox_tank_pressure_psi"]),
41 "max_fuel_pressure_psi": float(req["max_fuel_tank_pressure_psi"]),
42 }
43
44 _, results = run_layer1_optimization(
45 cfg,
46 PintleEngineRunner(copy.deepcopy(base_cfg)),
47 req,
48 target_burn_time=float(req.get("target_burn_time", 6.0)),
49 tolerances={"thrust": 0.10, "apogee": 0.15},
50 pressure_config=pcfg,
51 layer1_smoke=True,
52 layer1_max_iterations=int(args.layer1_max_iterations),
53 layer1_cma_restarts=1,
54 )
55 perf = results.get("performance") or {}
56 print(
57 f"W_MOM={w_mom:g}\tR={perf.get('momentum_ratio_R')}\tMR={perf.get('MR')}\t"
58 f"F={perf.get('F')}\tdP_O/Pc={perf.get('injector_dp_ratio_O')}\t"
59 f"dP_F/Pc={perf.get('injector_dp_ratio_F')}\t"
60 f"AoAf={perf.get('geom_ao_af')}\texp_R1={perf.get('expected_ao_af_for_R1')}"
61 )
62
63
64if __name__ == "__main__":
65 main()