turbo_moc.rotor.vortex_blade module#
turbo_moc.rotor.vortex_blade – supersonic impulse/reaction rotor blade design by the vortex-flow method of Goldman & Scullin (1968), “Analytical Investigation of Supersonic Turbomachinery Blading, I - Computer Program for Blading Design”, NASA TN D-4421 – the original, fully-worked, FORTRAN-validated source both Boxer et al. (1952, NACA RM L52B06) and Paniagua et al. (2014) build on. Generalized to real gases the same way Bufi & Cinnella (2018, DGMOC/RODEC) generalized it for dense gases.
This module is a direct, line-for-line port of NASA TN D-4421’s FORTRAN listing (its Main Program’s transition-arc marching loops, Eqs. 6/7/9/10/13, and the GSTAR/CSTAR/SIGMA geometric-parameter calculations), NOT a reimplementation from the paper’s prose or from Paniagua (2014)’s shorter, closed-form-looking Eqs. 11-19 – those turned out to describe something different from what they appear to (see “History” below). Validated to 4 decimal places against the report’s own worked example (Table II: BETAN=65, VIN=39, VOUT=35, VLOW=18, VUP=59, GAM=1.4 -> BETAT=-68.7395 deg, GSTAR=0.5544, CSTAR=1.6281, individual transition-arc coordinates matching point-for-point) before any real-gas generalization was attempted.
Physical picture (TN D-4421 Fig. 1): a uniform inlet flow (far upstream, flow angle beta_inlet) is turned into a supersonic free-vortex flow (M*R*=const) by an INLET TRANSITION ARC, held at constant Mach number through a CIRCULAR ARC concentric with the vortex center, then turned back into uniform flow (beta_outlet) by an OUTLET TRANSITION ARC. The pressure (lower/concave) surface and suction (upper/convex) surface are built independently this way, each with its own constant surface Mach number (M_lower, M_upper).
IMPORTANT – what pressure and suction actually bound: they are NOT the two sides of one solid blade closing into a simple polygon. Past their far corners the flow is uniform, so each surface asymptotes to a straight line at beta_inlet/beta_outlet; extending suction’s corners that way lands exactly pitch short of pressure’s corners (by construction – see the GSTAR discussion below) and the two extensions are parallel, so they never meet. This is the ordinary cascade far-field picture: THIS blade’s suction surface runs parallel, upstream and downstream, to the NEXT (pitch-shifted) blade’s pressure surface – together they bound one flow passage. The solid single-blade cross-section (blade in the returned dict) closes pressure to suction+pitch with a rounded leading/trailing edge: the upper wall is shifted a bit further than +pitch (by translate, solved so the trailing-edge fillet’s radius hits a target pitch/le_te_ratio), then each end is closed by a straight tangent segment plus a circular arc (built as a semicircle on that segment’s own diameter – see _close_blade_le_te). TN D-4421 itself only mentions closing segments (BE, GJ in its Fig. 1) and rounded LE/TE without giving a formula for their size; this module’s choice (pitch/le_te_ratio, default 25) is this project’s own, not TN D-4421’s.
History (why this replaced several earlier, unsuccessful attempts in this module): Paniagua (2014)’s own Eq. 17 (x*=-R*sin(phi), y*=R*cos(phi)) looks like a closed-form wall-position formula, and was tried literally first – it produced large, unphysical kinks at the transition-arc/circular-arc junction. TN D-4421’s FORTRAN reveals why: that formula gives the position along a REFERENCE characteristic curve (the “major vortex-expansion/ compression characteristic”), used only to construct MACH LINES – the actual wall position is found by intersecting each such Mach line with the PREVIOUS wall segment (a genuine two-line intersection, marching step by step), i.e. real characteristics marching, not a smooth closed-form curve. Implementing that literal marching (this module) fixes the kink entirely. Likewise, the earlier “each surface has no natural relationship to the other, pitch must be guessed” problem is resolved by TN D-4421’s own GSTAR calculation (Eq.-adjacent, “CALCULATE G* – THE DIMENSIONLESS BLADE SPACING”): extend the upper surface’s own inlet-far point along beta_inlet until it reaches the same x-coordinate as the lower surface’s own inlet-far point; the resulting y-gap IS the blade pitch – not a free input to guess, a derived output of the geometry.
Real-gas generalization: only the thermodynamic relations are replaced – R*(nu) = a_star/V(nu) (already shown numerically equivalent to inverting this report’s own perfect-gas f(R*) relation, Eq. 10b, for the perfect-gas case) and local Mach number/Mach angle via this package’s own V_of_nu/a_of_V real-gas Prandtl-Meyer table. The marching recursion itself (position via Mach-line/wall-segment intersection), the rotation formulas (Eqs. 6/7), and the GSTAR/CSTAR/SIGMA geometry are pure kinematics/geometry, unchanged by the thermodynamic model.
beta_outlet: ALWAYS derived from beta_inlet and M_inlet/M_outlet via mass-flux continuity across the transition, rho*V*cos(beta) = const – see _solve_beta_outlet’s docstring. This is the real-gas generalization of TN D-4421’s own Eq. 9 (“BETAT”), verified to reproduce the report’s own Table II value (-68.7395 deg) to 10+ significant figures when evaluated with perfect-gas relations, so it is the same physics as Eq. 9, not a different formula standing in for it. It is deliberately NOT an overridable free input (unlike Bufi & Cinnella (2018)’s convention, which this module followed in earlier versions): an inconsistent beta_outlet doesn’t just distort the geometry, it produces a self-intersecting wall with no warning that anything is wrong – e.g. M_inlet=M_outlet with beta_inlet=0 has NO consistent solution except beta_outlet=0 itself, and there is no way to tell from the output alone that a self-intersecting result traces back to this rather than a bug. If a specific exit flow angle is the actual design target, choose M_inlet/M_outlet to hit it via continuity instead.
Units: this module works entirely in the SAME units as its FluidManager (SI: Pa, K, m/s) for thermodynamic quantities, and returns GEOMETRY nondimensionalized by r* (the physical radius of the sonic-velocity streamline for whichever surface’s vortex flow, in meters) unless an explicit r_star length scale is supplied to rescale to physical units – see design_rotor_vortex_blade’s docstring.
- turbo_moc.rotor.vortex_blade.design_rotor_vortex_blade(fluid_name, P0_rel, T0_rel, M_inlet, M_outlet, M_lower, M_upper, beta_inlet, backend='HEOS', Q0_rel=nan, r_star=None, num_points=60, le_te_ratio=25.0)[source]#
Design a supersonic rotor blade section by the vortex-flow method, following NASA TN D-4421 (Goldman & Scullin, 1968) – see this module’s docstring for exactly how, why it replaced earlier (Paniagua Eq. 17 based) attempts in this module.
- Parameters:
- fluid_namestr
CoolProp fluid name.
- P0_rel, T0_relfloat
Relative-frame stagnation pressure [Pa] and temperature [K] at the rotor inlet (subcooled-liquid/single-phase convention – pass Q0_rel in [0,1] instead for a saturated two-phase inlet).
- M_inlet, M_outletfloat
Relative Mach number far upstream/downstream of the rotor (in the uniform-flow regions, before/after the transition arcs). Together with beta_inlet these set the degree of reaction: M_outlet=M_inlet is the pure-impulse case (no static enthalpy drop across the rotor); M_outlet != M_inlet gives a reacting blade.
- M_lower, M_upperfloat
Constant Mach number held on the pressure (concave/lower) and suction (convex/upper) circular arcs.
- beta_inletfloat
Relative flow angle [deg] from the axial direction at inlet – the only free flow-angle input. beta_outlet is ALWAYS derived from beta_inlet/M_inlet/M_outlet via mass-flux continuity (rho*V*cos(beta) = const across the transition) – the real-gas generalization of TN D-4421’s own Eq. 9, see _solve_beta_outlet’s docstring – not a free input, by design: an inconsistent beta_outlet doesn’t just distort the geometry, it produces a self-intersecting wall (mass isn’t actually conserved), with no warning otherwise. If you want a specific exit flow angle, choose M_inlet/M_outlet to hit it via continuity rather than overriding beta_outlet directly (not currently supported – would mean solving continuity for M_outlet given both betas instead).
- r_starfloat or None
Physical radius [m] of the sonic-velocity streamline to rescale the (nondimensional) geometry by. None returns x*, y* (units of r*, i.e. dimensionless).
- num_pointsint
Points per transition arc (endpoints included) – a fine-grained stand-in for TN D-4421’s explicit Delta-nu marching.
- le_te_ratiofloat
Target pitch/r_TE ratio used to size the rounded leading/trailing edges that close the solid blade (default 25). The upper wall’s extra shift beyond pitch is solved so the trailing-edge arc’s radius hits pitch/le_te_ratio exactly; the leading-edge radius is then whatever that same shift produces at the other end (equal to the TE radius only for the pure-impulse, beta_inlet==beta_outlet case) – see _close_blade_le_te’s docstring.
- Returns:
- dict
Flat, JSON-safe dict:
pressure/suction(each {“x”,”y”}, nondimensional by r* unless r_star given, in each surface’s OWN local frame – own vortex center at the origin – plusmach_lines_inlet/mach_lines_outlet, lists of (x0,y0,x1,y1) characteristic segments from the marching recursion).suctionadditionally carriesextension_inlet/extension_outlet(x0,y0,x1,y1): straight stubs continuing the suction surface at beta_inlet/beta_outlet out to pressure’s far- corner x – see the module docstring’s “IMPORTANT” note for why these do NOT meet pressure (they bound the passage to the NEXT blade, offset by pitch, not this blade’s own pressure side). Also:pitch(TN D-4421’s GSTAR: the natural blade-to-blade spacing derived from the geometry, not a free input),chord(CSTAR, the lower surface’s own inlet-far-to-outlet-far distance),solidity(chord/pitch), and the design parameters echoed back.