buffalo_wings.airfoil.SplineAirfoil

class buffalo_wings.airfoil.SplineAirfoil(*, upper, lower, provenance=None)[source]

Bases: Airfoil

Bezier-backed spline airfoil runtime.

Notes

This name is intentionally backend-neutral. The first implemented spline subtype stores upper and lower Bezier curves directly while keeping the public runtime family name generic enough for future B-spline and NURBS-backed implementations.

Methods

arc_length(u_s, u_e)

Calculate the arc-length distance between two points on surface.

arc_length_breakpoints()

Return the breakpoint locations in arc-length coordinates.

breakpoint_parameter_limits(*, index)

Return parameter limits for one breakpoint.

breakpoints()

Return the airfoil boundary and leading-edge breakpoints.

camber_curve(*[, num_points, spacing])

Return a camber-curve representation for this airfoil.

chord()

Return the airfoil chord length.

curvature_from_xi(xi, *, surface)

Return one-surface curvature values at surface-local xi locations.

d2ydx2(u)

Return the second surface derivative at curve parameter locations.

dydx(u)

Return the surface slope at curve parameter locations.

k(u)

Calculate the curvature at parameter location.

leading_edge()

Return the leading-edge location.

normal(u)

Calculate the unit normal at parameter location.

slope_from_xi(xi, *, surface)

Return one-surface slope values at surface-local xi locations.

tangent(u)

Calculate the unit tangent at parameter location.

to_spec()

Return the schema definition needed to recreate this airfoil.

trailing_edge()

Return the midpoint of the trailing-edge points.

u_from_s(s)

Return curve parameters that correspond to arc length.

u_from_x(x, *, surface)

Return curve parameters that correspond to x.

u_from_xi(xi, *, surface)

Convert surface-local xi coordinates to native parameters.

xi_from_u(u)

Convert native parameters to surface-local xi coordinates.

xy_from_s(s)

Return curve coordinates at arc-length locations.

xy_from_u(u)

Evaluate the spline-backed airfoil coordinates.

xy_from_xi(xi, *, surface)

Return one-surface coordinates at surface-local xi locations.

xy_s(s)

Calculate first derivatives at arc-length location.

xy_s_breakpoint(*, index)

Return one-sided arc-length derivatives at one breakpoint.

xy_ss(s)

Calculate second derivatives at arc-length location.

xy_ss_breakpoint(*, index)

Return one-sided arc-length second derivatives at one breakpoint.

xy_u(u)

Evaluate first derivatives with respect to the airfoil parameter.

xy_u_breakpoint(*, index)

Return one-sided first derivatives at one breakpoint.

xy_uu(u)

Evaluate second derivatives with respect to the airfoil parameter.

xy_uu_breakpoint(*, index)

Return one-sided second derivatives at one breakpoint.

Attributes

length

Return the full airfoil surface length.

lower

Return the lower spline curve.

provenance

Return the optional spline provenance metadata.

spec

Return the persisted spline schema for this airfoil.

upper

Return the upper spline curve.

property upper: BezierCurve2D

Return the upper spline curve.

Returns:

Upper-surface Bezier curve.

Return type:

BezierCurve2D

property lower: BezierCurve2D

Return the lower spline curve.

Returns:

Lower-surface Bezier curve.

Return type:

BezierCurve2D

property provenance: SplineAirfoilProvenanceSpec | None

Return the optional spline provenance metadata.

Returns:

Deep-copied provenance metadata when available.

Return type:

dict[str, object] | None

property spec: SplineAirfoilSpec

Return the persisted spline schema for this airfoil.

Returns:

Bezier-backed spline schema definition with upper and lower control points ordered from leading edge to trailing edge. Provenance metadata is deep-copied into the returned schema when present.

Return type:

SplineAirfoilSpec

xy_from_u(u)[source]

Evaluate the spline-backed airfoil coordinates.

Parameters:

u (buffalo_core.typing.FloatInput) – Airfoil parameter values in [-1, 1]. Negative values evaluate the lower surface from trailing edge toward the leading edge. Nonnegative values evaluate the upper surface from leading edge toward the trailing edge.

Returns:

Tuple (x, y) of float64 arrays matching the normalized shape of u.

Return type:

tuple[FloatArray, FloatArray]

xy_u(u)[source]

Evaluate first derivatives with respect to the airfoil parameter.

Parameters:

u (buffalo_core.typing.FloatInput) – Airfoil parameter values in [-1, 1].

Returns:

Tuple (dx/du, dy/du) of float64 arrays matching the normalized shape of u.

Return type:

tuple[FloatArray, FloatArray]

Notes

If u matches one of breakpoints() exactly, this method returns the minus-side derivative limit.

xy_uu(u)[source]

Evaluate second derivatives with respect to the airfoil parameter.

Parameters:

u (buffalo_core.typing.FloatInput) – Airfoil parameter values in [-1, 1].

Returns:

Tuple (d^2x/du^2, d^2y/du^2) of float64 arrays matching the normalized shape of u.

Return type:

tuple[FloatArray, FloatArray]

Notes

If u matches one of breakpoints() exactly, this method returns the minus-side derivative limit.

u_from_xi(xi, *, surface)[source]

Convert surface-local xi coordinates to native parameters.

Parameters:
  • xi (buffalo_core.typing.FloatInput) – Surface-local coordinates in [0, 1] measured from the leading edge to the trailing edge.

  • surface ({"lower", "upper"}) – Surface to evaluate.

Returns:

Signed native spline-airfoil parameters matching xi on the selected surface.

Return type:

buffalo_core.typing.FloatArray

Notes

The spline runtime uses the linear mapping u = +/- xi, with the sign determined by surface.

xi_from_u(u)[source]

Convert native parameters to surface-local xi coordinates.

Parameters:

u (buffalo_core.typing.FloatInput) – Signed native spline-airfoil parameters in [-1, 1].

Returns:

Surface-local xi values and upper-surface membership flags.

Return type:

SurfaceMappedValues

Notes

The spline runtime uses the linear mapping xi = |u|.

breakpoints()[source]

Return the airfoil boundary and leading-edge breakpoints.

Returns:

Ordered breakpoint list [-1.0, 0.0, 1.0]. The endpoints are boundary breakpoints and 0.0 is the leading-edge join between lower and upper surfaces.

Return type:

list[FloatScalar]

xy_u_breakpoint(*, index)[source]

Return one-sided first derivatives at one breakpoint.

Parameters:

index (int) – Breakpoint index into breakpoints().

Returns:

((x_u_minus, y_u_minus), (x_u_plus, y_u_plus)) for the selected breakpoint. Endpoint breakpoints return the same boundary value for both sides because only one in-domain side exists.

Return type:

tuple[tuple[FloatScalar, FloatScalar], tuple[FloatScalar, FloatScalar]]

xy_uu_breakpoint(*, index)[source]

Return one-sided second derivatives at one breakpoint.

Parameters:

index (int) – Breakpoint index into breakpoints().

Returns:

((x_uu_minus, y_uu_minus), (x_uu_plus, y_uu_plus)) for the selected breakpoint. Endpoint breakpoints return the same boundary value for both sides because only one in-domain side exists.

Return type:

tuple[tuple[FloatScalar, FloatScalar], tuple[FloatScalar, FloatScalar]]

xy_s_breakpoint(*, index)[source]

Return one-sided arc-length derivatives at one breakpoint.

Parameters:

index (int) – Breakpoint index into breakpoints().

Returns:

((x_s_minus, y_s_minus), (x_s_plus, y_s_plus)) for the selected breakpoint.

Return type:

tuple[tuple[FloatScalar, FloatScalar], tuple[FloatScalar, FloatScalar]]

Notes

This method composes the exact arc-length tangent values from the exact native breakpoint derivatives returned by xy_u_breakpoint(). If one side has zero native speed, the generic sampled fallback is retained for that breakpoint.

xy_ss_breakpoint(*, index)[source]

Return one-sided arc-length second derivatives at one breakpoint.

Parameters:

index (int) – Breakpoint index into breakpoints().

Returns:

((x_ss_minus, y_ss_minus), (x_ss_plus, y_ss_plus)) for the selected breakpoint.

Return type:

tuple[tuple[FloatScalar, FloatScalar], tuple[FloatScalar, FloatScalar]]

Notes

This method composes the exact arc-length curvature-vector values from the exact native breakpoint derivatives returned by xy_u_breakpoint() and xy_uu_breakpoint(). If one side has zero native speed, the generic sampled fallback is retained for that breakpoint.

arc_length(u_s, u_e)

Calculate the arc-length distance between two points on surface.

Parameters:
  • u_s (buffalo_core.typing.FloatScalar) – Start point of distance calculation.

  • u_e (buffalo_core.typing.FloatInput) – End point of distance calculation.

Returns:

Distance from start point to end point.

Return type:

buffalo_core.typing.FloatArray

arc_length_breakpoints()

Return the breakpoint locations in arc-length coordinates.

Returns:

Arc-length coordinates measured from the minimum native parameter.

Return type:

list[FloatScalar]

Notes

These values include the two curve endpoints as boundary markers. Interior breakpoints correspond to the native-parameter interior breakpoints returned by breakpoints().

breakpoint_parameter_limits(*, index)

Return parameter limits for one breakpoint.

Notes

Endpoint breakpoints return the exact boundary parameter. Interior breakpoints return nearby one-sided parameters chosen within the neighboring breakpoint interval for the current generic breakpoint-side implementation. These limits exist to support the sampled fallback in the generic *_breakpoint methods and should not be treated as the primary source of truth when a subclass can provide exact one-sided values directly.

Return type:

tuple[TypeAliasForwardRef(‘buffalo_core.typing.FloatScalar’), TypeAliasForwardRef(‘buffalo_core.typing.FloatScalar’)]

camber_curve(*, num_points=81, spacing='cosine')

Return a camber-curve representation for this airfoil.

Parameters:
  • num_points (int, default 81) – Number of shared surface samples to use when an approximate camber line must be derived from the airfoil geometry.

  • spacing ({"uniform", "cosine"}, default "cosine") – Spacing rule used for the shared surface-local sample locations in the approximate extraction path.

Returns:

Exact or approximate camber-curve result for this airfoil.

Return type:

AirfoilCamberResult

Raises:

ValueError – If num_points or spacing is invalid for the approximate extraction path.

chord()

Return the airfoil chord length.

Returns:

Distance between the leading-edge reference and trailing-edge midpoint reference.

Return type:

buffalo_core.typing.FloatScalar

curvature_from_xi(xi, *, surface)

Return one-surface curvature values at surface-local xi locations.

Parameters:
  • xi (buffalo_core.typing.FloatInput) – Surface-local coordinates in [0, 1] measured from the leading edge to the trailing edge.

  • surface ({"lower", "upper"}) – Surface to evaluate.

Returns:

Surface-oriented curvature values on the selected surface.

Return type:

buffalo_core.typing.FloatArray

d2ydx2(u)

Return the second surface derivative at curve parameter locations.

Parameters:

u (buffalo_core.typing.FloatInput) – Airfoil parameters.

Returns:

Second derivative values d^2y/dx^2 evaluated at u.

Return type:

buffalo_core.typing.FloatArray

dydx(u)

Return the surface slope at curve parameter locations.

Parameters:

u (buffalo_core.typing.FloatInput) – Airfoil parameters.

Returns:

Surface slope values dy/dx evaluated at u.

Return type:

buffalo_core.typing.FloatArray

k(u)

Calculate the curvature at parameter location.

Parameters:

u (buffalo_core.typing.FloatInput) – Parameter for desired locations.

Returns:

Curvature of surface matching the normalized shape of u.

Return type:

buffalo_core.typing.FloatArray

leading_edge()

Return the leading-edge location.

Returns:

(x, y) location of the leading-edge reference point.

Return type:

tuple[FloatScalar, FloatScalar]

property length: buffalo_core.typing.FloatScalar

Return the full airfoil surface length.

Returns:

Total airfoil surface length measured from the lower trailing edge to the upper trailing edge.

Return type:

buffalo_core.typing.FloatScalar

normal(u)

Calculate the unit normal at parameter location.

Parameters:

u (buffalo_core.typing.FloatInput) – Parameter for desired locations.

Returns:

Tuple (n_x, n_y) of float64 arrays matching the normalized shape of u.

Return type:

tuple[FloatArray, FloatArray]

slope_from_xi(xi, *, surface)

Return one-surface slope values at surface-local xi locations.

Parameters:
  • xi (buffalo_core.typing.FloatInput) – Surface-local coordinates in [0, 1] measured from the leading edge to the trailing edge.

  • surface ({"lower", "upper"}) – Surface to evaluate.

Returns:

Surface slope values dy/dx on the selected surface.

Return type:

buffalo_core.typing.FloatArray

tangent(u)

Calculate the unit tangent at parameter location.

Parameters:

u (buffalo_core.typing.FloatInput) – Parameter for desired locations.

Returns:

Tuple (t_x, t_y) of float64 arrays matching the normalized shape of u.

Return type:

tuple[FloatArray, FloatArray]

to_spec()

Return the schema definition needed to recreate this airfoil.

Returns:

Serialized airfoil definition that can recreate this runtime object.

Return type:

AirfoilDefinitionSpec

Notes

For runtime families covered by the current schema round-trip contract, this returns the same schema content as spec.

trailing_edge()

Return the midpoint of the trailing-edge points.

Returns:

(x, y) location of the trailing-edge midpoint reference.

Return type:

tuple[FloatScalar, FloatScalar]

u_from_s(s)

Return curve parameters that correspond to arc length.

Parameters:

s (buffalo_core.typing.FloatInput) – Arc lengths measured from the lower trailing edge.

Returns:

Curve parameters corresponding to s.

Return type:

buffalo_core.typing.FloatArray

Raises:

ValueError – When arc-length provided is larger than airfoil surface length.

u_from_x(x, *, surface)

Return curve parameters that correspond to x.

Parameters:
  • x (buffalo_core.typing.FloatInput) – Chordwise coordinates in the normalized airfoil frame.

  • surface ({"lower", "upper"}) – Surface to solve on.

Returns:

Curve parameters on the requested surface.

Return type:

buffalo_core.typing.FloatArray

Raises:

ValueError – If any requested chordwise coordinate lies outside the reachable x-range of the selected surface.

xy_from_s(s)

Return curve coordinates at arc-length locations.

Parameters:

s (buffalo_core.typing.FloatInput) – Arc length location of point.

Returns:

(x, y) coordinates matching the normalized shape of s.

Return type:

tuple[FloatArray, FloatArray]

xy_from_xi(xi, *, surface)

Return one-surface coordinates at surface-local xi locations.

Parameters:
  • xi (buffalo_core.typing.FloatInput) – Surface-local coordinates in [0, 1] measured from the leading edge to the trailing edge.

  • surface ({"lower", "upper"}) – Surface to evaluate.

Returns:

Tuple (x, y) of float64 arrays matching the normalized shape of xi.

Return type:

tuple[FloatArray, FloatArray]

xy_s(s)

Calculate first derivatives at arc-length location.

Parameters:

s (buffalo_core.typing.FloatInput) – Arc length location of point.

Returns:

(dx/ds, dy/ds) coordinates matching the normalized shape of s.

Return type:

tuple[FloatArray, FloatArray]

Notes

If s matches one of arc_length_breakpoints() exactly, this method returns the minus-side derivative limit. Subclasses should override xy_s_breakpoint() when exact one-sided breakpoint derivatives are available analytically.

xy_ss(s)

Calculate second derivatives at arc-length location.

Parameters:

s (buffalo_core.typing.FloatInput) – Arc length location of point.

Returns:

(d^2x/ds^2, d^2y/ds^2) coordinates matching the normalized shape of s.

Return type:

tuple[FloatArray, FloatArray]

Notes

If s matches one of arc_length_breakpoints() exactly, this method returns the minus-side derivative limit. Subclasses should override xy_ss_breakpoint() when exact one-sided breakpoint second derivatives are available analytically.