69 *, c_sound: float, gamma: float = 1.2,
70 rho: float = 4.0) -> MeanFlowSpec:
71 """Uniform-property closed cylinder mean flow (verification case V1).
73 Constant sound speed / density / gamma everywhere, no heat release (passive) — the
74 exact configuration the analytic mode formula in Section VII.A (case V1) assumes.
76 mesh = cylinder_mesh(L, R, nx, nr)
81 c=np.full(n, c_sound),
82 gamma=np.full(n, gamma),
87 notes=
"V1 analytic-cylinder verification case; no real propellant/Pc/MR"),
92 *, c1: float, c2: float, gamma: float = 1.2,
93 rho: float = 4.0) -> MeanFlowSpec:
94 """Two-zone duct with a sound-speed (temperature) jump at x=L1 (verification case V2).
96 ``c1`` applies on ``[0, L1]``, ``c2`` on ``[L1, L1+L2]`` — a step discontinuity, not
97 a smooth profile, which is exactly why this uses ``c_element`` (see ``MeanFlowSpec``
98 docstring) rather than the ordinary per-node ``c`` field. ``rho`` is passed through
99 uniformly for now; density does jump physically alongside sound speed at a real
100 temperature interface (rho = p/(R*T), same p, different T), but the passive
101 Helmholtz operator (Eq. 10) only ever uses ``c``, so it plays no role in this case.
103 mesh, zone = two_zone_duct_mesh(L1, L2, R, nx1, nx2, nr)
105 c_element = np.where(zone == 1, c1, c2)
109 node_zone = np.ones(n, dtype=np.int64)
110 right_of_interface = mesh.nodes[:, 0] > L1 + 1e-9
111 node_zone[right_of_interface] = 2
112 c_node_proxy = np.where(node_zone == 1, c1, c2)
118 gamma=np.full(n, gamma),
123 notes=f
"V2 temperature-jump verification case; c1={c1}, c2={c2}, interface at x={L1}"),
MeanFlowSpec synthetic_two_zone_duct(float L1, float L2, float R, int nx1, int nx2, int nr, *, float c1, float c2, float gamma=1.2, float rho=4.0)