Skip to main content

FinAero

Struct FinAero 

Source
pub struct FinAero { /* private fields */ }
Expand description

One fin’s normal force through the speed regimes: its geometry and outline, and the two ends of its transonic join, computed once.

  • Subsonic, M ≤ 0.8: Diederich’s slope with Prandtl–Glauert (FinGeometry::single_fin_slope) at the quarter mean aerodynamic chord.
  • Supersonic, from M_s = max(1.2, 1/cos Γ_L, 1/cos Γ_T, √(1 + 1/A²), √(1 + (c_t/2s)²)): linear theory (FinOutline::supersonic). Its strips need supersonic leading and trailing edges, whose Mach numbers square to the edge, M cos Γ_L and M cos Γ_T, are past 1 (NACA TN 2114’s case). Its half-load tip cone holds while the mirror fin’s cone stays off this fin’s tip, β ≥ c_t/(2s) with c_t the tip chord, and while βA ≥ 1, with A = 2s²/A_fin the aspect ratio of the fin and its mirror image (for a rectangle the two agree, and the slope peaks there at 2A). So a swept, stubby or inverse-tapered fin starts later than Mach 1.2.
  • Transonic, between: slope and CP each linear in M between their values at the two ends. No method in the sources gives this region in closed form (MIL-HDBK-762 reads it from transonic-similarity charts, pp. 5-104–5-105); the join keeps both continuous, with the slope’s peak at M_s, where linear theory takes over.

Implementations§

Source§

impl FinAero

Source

pub fn geometry(&self) -> &FinGeometry

The fin’s subsonic geometry.

Source

pub fn outline(&self) -> &FinOutline

Its outline.

Source

pub fn reference_area_m2(&self) -> f64

The reference area of the slopes, m².

Source

pub fn supersonic_mach(&self) -> f64

Where supersonic linear theory starts, M_s. It can pass Mach 5 for a stubby or a very swept fin (a strake 0.5 m long and 0.02 m tall starts at Mach 12.5); the fin’s slope and CP then stay on the join toward that value up to the normal force’s limit, and linear theory is never used.

Source

pub fn new( planform: &FinPlanform, reference_area_m2: f64, ) -> Result<Self, AeroError>

A planform’s normal force on reference_area_m2.

§Errors

As FinGeometry::from_planform and FinOutline::from_planform, and AeroError::Domain for a non-positive reference area.

Source

pub fn loading(&self, mach: f64) -> Result<FinLoading, AeroError>

The fin’s slope and CP at mach.

§Errors

AeroError::Mach outside [0, 5) (crate::model::NORMAL_FORCE_MACH_LIMIT).

Source§

impl FinAero

Source

pub fn roll( &self, mach: f64, body_radius_m: f64, reference_diameter_m: f64, ) -> Result<FinRoll, AeroError>

One fin’s roll forcing and damping at mach on a body of radius body_radius_m, on the reference area and the reference diameter reference_diameter_m, by strip theory (Barrowman 1967 §3.13–3.14 and appendix A; Niskanen 2009 §3.3):

  • Subsonic, to Mach 0.8: the fin’s lift at its mean aerodynamic chord, C_lδ = (C_Nα)₁ (r_t + y_MAC)/d (Barrowman eq. 3-35, Niskanen eq. 3.66), and each strip at the local incidence −pξ/V with the fin’s own slope per unit area, a = (C_Nα)₁ A_ref/A_fin: C_lp = −2a ∫ξ² dA/(A_ref d²) (Barrowman eq. 3-40–3-48, Niskanen eq. 3.67–3.70). Barrowman’s text writes the airfoil’s C_Nα0 for a; his computed curve for the Basic Finner, −34.2 at Mach 0 (Fig. 5-7), is this, −33.5, not the airfoil’s −69 (the roll decision, ADR-031).
  • Supersonic, from M_s (FinAero::supersonic_mach): the load 4α/β of FinOutline::supersonic, halved in the tip’s Mach cone, C_lδ = (4/β)(∫ξ dA − ½∫_cone ξ dA)/(A_ref d) and C_lp = −(8/β)(∫ξ² dA − ½∫_cone ξ² dA)/(A_ref d²) (Barrowman appendix A, first order).
  • Transonic, between: each linear in M, as the fin’s slope is.

ξ = r_t + y is the distance from the body axis.

§Errors

AeroError::Mach outside [0, 5), as FinAero::loading, and AeroError::Domain for a negative body radius or a non-positive reference diameter.

Source

pub fn roll_terms( &self, body_radius_m: f64, reference_diameter_m: f64, ) -> Result<FinRollTerms, AeroError>

The terms of FinAero::roll that don’t change with Mach, on a body of radius body_radius_m and the reference diameter reference_diameter_m.

§Errors

AeroError::Domain for a negative body radius or a non-positive reference diameter.

Trait Implementations§

Source§

impl Clone for FinAero

Source§

fn clone(&self) -> FinAero

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FinAero

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for FinAero

Source§

fn eq(&self, other: &FinAero) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for FinAero

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for FinAero

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.