37 P_O = (E_O_R - L_O *
_s(TH_O), E_D + L_O *
_c(TH_O))
38 P_F = (E_F_R + L_F *
_s(TH_F), E_D + L_F *
_c(TH_F))
39 fo = [(P_O[0] - G *
_c(TH_O), P_O[1] - G *
_s(TH_O)), (P_O[0] + G *
_c(TH_O), P_O[1] + G *
_s(TH_O))]
40 ff = [(P_F[0] - G *
_c(TH_F), P_F[1] + G *
_s(TH_F)), (P_F[0] + G *
_c(TH_F), P_F[1] - G *
_s(TH_F))]
41 r1, r2 = fo[0][0] - 0.3, ff[1][0] + 0.3
44 (E_O_R - F_O *
_c(TH_O), 0.0), (E_O_R + F_O *
_c(TH_O), 2 * E_D),
45 (E_F_R - F_F *
_c(TH_F), 2 * E_D), (E_F_R + F_F *
_c(TH_F), 0.0),
47 (r2, T), (r2, ff[1][1]), ff[1], ff[0], (ff[0][0], T),
48 (fo[1][0], T), fo[1], fo[0], (r1, fo[0][1]), (r1, T),
51 return loop, P_O, P_F, fo, ff, r1, r2
73 path, (P_O, P_F, fo, ff, r1, r2) = synthetic
74 prof = read_plate_profile(path)
75 assert prof[
"thickness"] == pytest.approx(T * IN, rel=1e-9)
76 assert prof[
"plate_radius"] == pytest.approx(R * IN, rel=1e-9)
77 assert not prof[
"axis_hole"]
78 lox, fuel = prof[
"channels"]
80 a_lox = (fo[0][0] - r1) * (T - fo[0][1]) + (fo[1][0] - fo[0][0]) * (T - P_O[1])
81 a_fuel = (r2 - ff[1][0]) * (T - ff[1][1]) + (ff[1][0] - ff[0][0]) * (T - P_F[1])
82 assert lox[
"flow_area"] == pytest.approx(a_lox * IN ** 2, rel=1e-9)
83 assert fuel[
"flow_area"] == pytest.approx(a_fuel * IN ** 2, rel=1e-9)
84 assert lox[
"depth"] == pytest.approx((T - fo[0][1]) * IN, rel=1e-9)
85 assert lox[
"ligament_min"] == pytest.approx(fo[0][1] * IN, rel=1e-9)
86 assert prof[
"face_groove"][
"depth"] == pytest.approx(2 * E_D * IN, rel=1e-9)
92 h = drilled_passages(read_plate_profile(path), {
"O": TH_O,
"F": TH_F})
93 assert h[
"O"][
"exit_r"] == pytest.approx(E_O_R * IN, rel=1e-9)
94 assert h[
"F"][
"exit_r"] == pytest.approx(E_F_R * IN, rel=1e-9)
95 assert h[
"O"][
"exit_depth"] == pytest.approx(E_D * IN, rel=1e-9)
96 assert h[
"O"][
"length"] == pytest.approx(L_O * IN, rel=1e-9)
97 assert h[
"F"][
"length"] == pytest.approx(L_F * IN, rel=1e-9)
98 assert h[
"O"][
"entry_off_square_deg"] == pytest.approx(0.0, abs=1e-6)
100 a, b = h[
"F"][
"flank_slant"]
101 assert a == pytest.approx(b, rel=1e-9)
and a == pytest.approx(F_F * IN, rel=1e-9)
112 path, (P_O, P_F, fo, ff, r1, r2) = synthetic
113 prof = read_plate_profile(path)
114 r_floor = 0.5 * (r1 + fo[0][0])
115 assert section_thickness(prof, r_floor * IN) == pytest.approx(fo[0][1] * IN, rel=1e-9)
116 r_groove = 0.5 * (E_O_R + E_F_R)
117 assert section_thickness(prof, r_groove * IN) == pytest.approx((T - 2 * E_D) * IN, rel=1e-9)
118 assert section_thickness(prof, 0.2 * IN) == pytest.approx(T * IN, rel=1e-9)
135 """By hand from the sketch's coordinates (inches). LOX channel: 0.300 wide floor 0.4868 deep,
136 then a facet 0.0819 across rising 0.0573: 0.300 x 0.4868 + 0.0819 x (0.4868 - 0.0573/2)
137 = 0.18357 in^2. LOX exit at the flank midpoint, r = (1.209 + 1.291)/2 = 1.250 in; the passage
138 to the facet midpoint (1.06575, 0.29185) from (1.250, 0.0287) is 0.3213 in = 8.16 mm."""
140 prof = load_plate_profile(DRAWING)
141 assert prof[
"thickness"] == pytest.approx(0.75 * IN, rel=1e-6)
142 lox, fuel = prof[
"channels"]
143 assert lox[
"flow_area"] == pytest.approx(0.18357 * IN ** 2, rel=2e-3)
144 assert lox[
"r_lo"] == pytest.approx(0.7248 * IN, rel=1e-4)
145 assert fuel[
"r_hi"] == pytest.approx(2.2322 * IN, rel=1e-4)
146 h = drilled_passages(prof, {
"O": 35.0,
"F": 48.0})
147 assert h[
"O"][
"exit_r"] == pytest.approx(1.250 * IN, rel=1e-4)
148 assert h[
"O"][
"length"] == pytest.approx(0.3213 * IN, rel=1e-3)
149 assert h[
"O"][
"channel"] == 0
and h[
"F"][
"channel"] == 1
163 lay = layout_from_config(cfg, drawings=
False)
164 assert lay[
"drawing"][
"thickness"] == pytest.approx(0.75 * IN, rel=1e-6)
165 assert lay[
"passages"][
"O"][
"plate_l_over_d"] == pytest.approx(8.16e-3 / cfg.injector.geometry.oxidizer.d_jet, rel=2e-3)
166 assert not [w
for w
in lay[
"warnings"]
if w[
"code"].startswith(
"drawing_")
and w[
"level"] ==
"bad"]
168 assert [w
for w
in lay[
"warnings"]
if w[
"code"] ==
"drawing_igniter" and w[
"level"] ==
"warn"]
170 cfg.injector.geometry.oxidizer.spacing *= (31.75 + 0.5) / 31.75
171 lay = layout_from_config(cfg, drawings=
False)
172 assert [w
for w
in lay[
"warnings"]
if w[
"code"] ==
"drawing_ring_O" and w[
"level"] ==
"bad"]
178 net = _ring_manifold_for(cfg,
"oxidizer", 1140.0, 1.8e-4, 24, cfg.injector.geometry.oxidizer.d_jet)
179 lox = __import__(
"engine.core.injectors.plate_dxf", fromlist=[
"x"]).load_plate_profile(DRAWING)[
"channels"][0]
180 assert net.A_ch == pytest.approx(lox[
"flow_area"], rel=1e-12)
181 assert net.D_h == pytest.approx(lox[
"hydraulic_diameter"], rel=1e-12)
182 assert net.s == pytest.approx(2 * math.pi * lox[
"r_centroid"] / 24, rel=1e-12)