Skip to main content

StreamerModel

Enum StreamerModel 

Source
#[non_exhaustive]
pub enum StreamerModel { Filippone, OpenRocket, }
Expand description

How a streamer’s drag area is estimated. A streamer of length l and width w has a planform (one-side) area S = l w and an aspect ratio AR = l/w.

The two models disagree by a factor of about four in drag area, so docs/physics/recovery.md sets out what each is fitted to and how each compares with the only free-drop data in hand (the decision record on streamer and tumble drag, ADR-013).

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Filippone

J. Carruthers and A. Filippone, “Aerodynamic Drag of Streamers and Flags”, Journal of Aircraft 42(4), 2005, pp. 976-982, on the planform area, from wind-tunnel tests of cotton streamers at AR 3.3 to 30 and 6 to 18.9 m/s. It fits one power curve per planform area:

  • C_D = 0.561 AR^−0.480 at S = 0.025 m² (eq. 2; Figure 2’s trend line reads 0.561 AR^−0.4795),
  • C_D = 0.6514 AR^−0.6075 at S = 0.05 m² (the trend line on Figure 3, which the text does not repeat as an equation),
  • C_D = 0.405 AR^−0.494 at S = 0.075 m² (eq. 1; Figure 4 reads 0.4046 AR^−0.494).

hpr interpolates between neighbouring curves linearly in ln S and holds the end curve outside the fitted range. That interpolation is hpr’s, not the paper’s. All three are needed because C_D is far from linear in ln S: at AR = 3.3 the middle curve sits 0.3% below the smallest area’s rather than 63% of the way to the largest’s, so blending only the extremes reads 18% low there.

The correlations are for streamers clamped at the luff; the paper measures more drag when the luff is free, which is what a descending streamer has.

This is the default: on the one free-drop measurement in hand that a flat correlation should fit (Kidwell’s unpleated streamer) it is 9% fast where Self::OpenRocket is 88% fast. Both are fast on his pleated streamers, which neither models (docs/physics/recovery.md).

§

OpenRocket

The OpenRocket technical documentation v13.05, Appendix C (printed pages 113-118): C_Dm = 0.034 ((ρ_m + 25 g/m²)/(105 g/m²)) ((l + 1 m)/l) on the planform area, fitted to wind-tunnel tests of model-rocket streamers (w 0.01 to 0.09 m, l 0.2 to 1.0 m, surface density 10 to 80 g/m², 6 to 12 m/s), with a stated 12 to 27% error on an independent set.

Use it to compare with OpenRocket. Against Kidwell’s free drops it is low in drag area by 4.2 times on his flat crêpe streamer and 7.8 times on his pleated Micafilm one, which is 88% and 154% fast in descent rate (docs/physics/recovery.md).

Implementations§

Source§

impl StreamerModel

Source

pub const FILIPPONE_ASPECT_RATIO_RANGE: (f64, f64)

The aspect ratios AR = l/w the correlations were fitted over. Outside it they only extrapolate, and as AR → 0 the power law runs away (C_D → ∞), which is why a flight refuses a strip wider than it is long (MIN_STREAMER_ASPECT_RATIO).

Source

pub fn drag_area_m2( self, length_m: f64, width_m: f64, surface_density_kg_m2: f64, ) -> f64

The drag area C_D S of a streamer, m².

surface_density_kg_m2 is the fabric’s, which only Self::OpenRocket uses. Outside the ranges each correlation was fitted over this extrapolates; a flight refuses the shapes that make it meaningless (crate::Simulation::with_recovery).

Trait Implementations§

Source§

impl Clone for StreamerModel

Source§

fn clone(&self) -> StreamerModel

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 Copy for StreamerModel

Source§

impl Debug for StreamerModel

Source§

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

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

impl Default for StreamerModel

Source§

fn default() -> StreamerModel

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for StreamerModel

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for StreamerModel

Source§

impl Hash for StreamerModel

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for StreamerModel

Source§

fn eq(&self, other: &StreamerModel) -> 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 StreamerModel

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 StreamerModel

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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

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.