39 """A -> pipe -> check valve (3 psi crack) -> pipe -> B, ``drop_psi`` apart."""
41 net.add_node(
"A",
"nitrogen", 293.0, pressure=500.0 * PSI)
42 net.add_node(
"M",
"nitrogen", 293.0)
43 net.add_node(
"N",
"nitrogen", 293.0)
44 net.add_node(
"B",
"nitrogen", 293.0, pressure=(500.0 - drop_psi) * PSI)
45 for node
in net.nodes.values():
47 check = build_component(
48 ComponentInstance.build(
52 "Cv":
Param(1.0,
"Cv", M,
""),
53 "bore":
Param(9.5,
"mm", M,
""),
54 "cracking_pressure":
Param(3.0,
"psi", M,
""),
55 "leak_reverse":
Param(1e-4,
"Cv", M,
""),
59 net.add_branch(
"P1",
_pipe(
"P1"),
"A",
"M")
60 net.add_branch(
"CV", check,
"M",
"N")
61 net.add_branch(
"P2",
_pipe(
"P2"),
"N",
"B")
62 return solve_steady(net, raise_on_failure=
False, tol=1e-4)
65@pytest.mark.parametrize("drop_psi", [1.0, 1.5, 2.0, 2.9])
79def _regulated(tank_psia: float, rise_psi: float) -> object:
80 """3000 psia bottle -> regulator (500 psia, 20 psi droop at 0.05 kg/s,
81 ``rise_psi`` of lockup rise) -> pipe -> a tank held at ``tank_psia``."""
82 reg = build_component(
83 ComponentInstance.build(
87 "setpoint":
Param(500.0,
"psia", M,
""),
88 "Cv":
Param(0.8,
"Cv", M,
""),
89 "bore":
Param(7.75,
"mm", M,
""),
90 "flow_droop":
Param(20.0,
"psi", M,
""),
91 "rated_flow":
Param(0.05,
"kg/s", M,
""),
92 "lockup_rise":
Param(rise_psi,
"psi", M,
""),
98 net.add_node(
"COPV",
"nitrogen", 293.0, pressure=3000.0 * PSI)
99 net.add_node(
"R",
"nitrogen", 293.0)
100 net.add_node(
"T",
"nitrogen", 293.0, pressure=tank_psia * PSI)
101 for node
in net.nodes.values():
103 net.add_branch(
"REG", reg,
"COPV",
"R")
104 net.add_branch(
"L",
_pipe(
"L", 0.5),
"R",
"T")
105 return solve_steady(net, raise_on_failure=
False, tol=1e-4, max_iterations=120)
108@pytest.mark.parametrize(
109 "tank_psia", [495.0, 499.0, 500.5, 501.5, 502.4, 504.0, 504.9, 506.0, 508.0]
143 """Lockup (set + rise) at zero flow, the droop line once the rise is paid
144 back, and no step between: the rise is lost at the droop's own rate."""
148 flow = FlowConditions(rho=39.0, mu=1.8e-5, p_upstream=3000.0 * PSI)
149 outlet =
lambda m: (3000.0 * PSI - reg.pressure_drop(m, flow)) / PSI
150 assert outlet(0.0) == pytest.approx(505.0)
151 assert outlet(1e-9) == pytest.approx(505.0, abs=1e-5)
153 assert outlet(0.0125) == pytest.approx(500.0 - 5.0)
154 assert outlet(0.05) == pytest.approx(500.0 - 20.0)
157@pytest.mark.parametrize("mdot", [0.0, 1e-6, 0.01, 0.05, 0.2])
159 """The closure changes nothing for a regulator that declares no rise (the
160 study drawings, LE4): outlet = set - droop m / rated, shut above it."""
164 flow = FlowConditions(rho=39.0, mu=1.8e-5, p_upstream=3000.0 * PSI)
165 dp = reg.pressure_drop(mdot, flow)
166 assert dp == (3000.0 * PSI) - (500.0 * PSI - 20.0 * PSI * mdot / 0.05)
167 shut = reg.is_choked(3000.0 * PSI - 502.6 * PSI, flow)
168 regulating = reg.is_choked(
169 3000.0 * PSI - 502.4 * PSI, flow
171 assert shut
and not regulating