turbo_moc.deprecated.geometry.annular module#
turbo_moc.geometry.annular – true 3D annular wrap of an axial blade row, from a hub radius to a shroud radius.
Unlike turbo_moc.geometry.radial (which maps a blade’s CHORDWISE position to radius, for radial-flow-style visualization), this module keeps the blade’s axial (chordwise) stations fixed across span and instead sweeps a SPAN parameter r from r_hub to r_shroud, wrapping the blade’s pitchwise extent circumferentially at each radius:
z_i = y (axial, unchanged across span)
x_i = x * (r_i / r_hub) if flare == "pitch_scale"
= x if flare == "constant"
theta_i = theta0 + x_i / r_i (arc length = r_i * theta)
X_i, Y_i = r_i * cos(theta_i), r_i * sin(theta_i)
“pitch_scale” matches the convention already used by turbo_moc.geometry.blade.export_flared_blade_step (pitch grows proportionally with radius at constant blade count); under it theta_i is constant across span, i.e. a straight radial-fiber blade – the standard simplification, not something hard-coded here.
Blade axis convention (see turbo_moc.geometry.radial’s module docstring): a stator’s blade_curve/trailing_edge have x = pitchwise, y = chordwise (after the final profile rotation); a rotor’s “blade” has x = chordwise, y = pitchwise.
- turbo_moc.deprecated.geometry.annular.wrap_blade_annular(blade_data, r_hub, r_shroud, n_blades=1, flare='pitch_scale', n_span=13, theta0=0.0, source='stator', n_preview=None)[source]#
Wrap a Phase-2-style stator blade (parametrize_stator_blade/_semi’s output) or a Phase-3-style rotor blade (design_rotor_vortex_blade’s output) onto a true annulus from r_hub to r_shroud: the blade curves circumferentially at every span station, not just a flat hub/tip loft.
- Parameters:
- blade_datadict
Stator: needs “blade_curve” and “trailing_edge” ({“x”, “y”} each, mm). Rotor: needs “blade” ({“x”, “y”}).
- r_hub, r_shroudfloat
Hub/shroud radii (same length units as blade_data, mm).
- n_bladesint
TRUE number of blades around the full annulus – sets the angular spacing (2*pi/n_blades) between copies. Changing this always changes how tightly packed the returned copies are, even if only a few of them are actually returned (see n_preview).
- flarestr
“pitch_scale” (pitch grows with radius, matching export_flared_blade_step’s convention) or “constant” (profile unchanged across span).
- n_spanint
Number of span stations from r_hub to r_shroud (>= 2).
- theta0float
Angular offset [rad] of the blade’s own reference (index-0) copy.
- sourcestr
“stator” or “rotor” – which blade_data shape to expect.
- n_previewint or None
Cap on how many of the n_blades copies to actually compute/return (e.g. for a responsive Mesh3d preview) – purely a rendering cap, NEVER changes d_theta/the physical spacing above. None (default) returns all n_blades copies.
- Returns:
- dict
“curve”: {“r”, “x”, “y”, “z”} each shape (n_drawn, n_span, n_pts) – the main blade contour (blade_curve for stator, blade for rotor). “trailing_edge”: same shape, or None for a rotor (its TE is part of the closed “blade” contour already). “r_hub”/”r_shroud”/”n_blades”/”n_span”/”flare”/”units” echoed back (“n_blades” is always the TRUE count, not n_drawn).