341 design: EngineDesign,
343 mdot_oxidiser: float,
345 density_oxidiser: float,
347 injector_dp_oxidiser: float,
348 injector_dp_fuel: float,
349 chamber_pressure: float,
350 supply_oxidiser: float = 0.0,
351 supply_fuel: float = 0.0,
353 """Assemble a balance from a solved operating point.
355 ``Cd`` is recovered from the flow and the pressure drop rather than
356 re-evaluated from the Reynolds model, so the identity closes on the numbers
357 the solver actually produced. Re-evaluating it would make the residual
358 report the difference between two ``Cd`` models instead of a real
359 inconsistency, which is the one thing the residual exists to catch.
362 def recovered_cd(mdot: float, rho: float, area: float, dp: float) -> float:
363 if area <= 0.0
or rho <= 0.0
or dp <= 0.0:
365 return abs(mdot) / (area * math.sqrt(2.0 * rho * dp))
368 propellant=design.oxidiser.propellant,
370 density=density_oxidiser,
371 area=design.oxidiser.area,
373 mdot_oxidiser, density_oxidiser, design.oxidiser.area, injector_dp_oxidiser
375 injector_dp=injector_dp_oxidiser,
376 supply_pressure=supply_oxidiser,
377 band=design.oxidiser.stiffness_band,
380 propellant=design.fuel.propellant,
382 density=density_fuel,
383 area=design.fuel.area,
384 cd=recovered_cd(mdot_fuel, density_fuel, design.fuel.area, injector_dp_fuel),
385 injector_dp=injector_dp_fuel,
386 supply_pressure=supply_fuel,
387 band=design.fuel.stiffness_band,
392 chamber_pressure=chamber_pressure,
393 design_ratio=design.design_mixture_ratio,
MixtureBalance balance_from(EngineDesign design, *, float mdot_oxidiser, float mdot_fuel, float density_oxidiser, float density_fuel, float injector_dp_oxidiser, float injector_dp_fuel, float chamber_pressure, float supply_oxidiser=0.0, float supply_fuel=0.0)