Drag

The key drag contributions are assumed to come from the fuselage, wing and tail surfaces, and the lift-induced drag calculated at the Trefftz plane. Wave drag is not explicitly modelled.

Axisymmetric fuselage drag

The fuselage profile drag is determined by a quasi-axisymmetric coupled viscous-inviscid calculation. See Simplified Viscous/Inviscid Analysis for Nearly-Axisymmetric Bodies by M. Drela.

This method does not require any wetted area approximations or fineness-ratio correlations, but does require the geometry to be specified in the form of a cross-sectional area distribution $A{\scriptstyle (x)}$ and a perimeter distribution $b_0{\scriptstyle (x)}$, shown in the Figure below. For a round cross-section these are, of course, related. To allow treating more general fuselage cross-sections, they are assumed to be specified separately. The cross section sizes and shapes can vary along the body, provided the variation is reasonably smooth.

ADfuse

📖 Theory - axisymmetric fuselage profile drag

The viscous calculation produces displacement, momentum, and kinetic energy areas $\Delta^*, \Theta, \Theta^* {\scriptstyle (x)}$.

The cross-sectional area over the center cylindrical portion is $A_{\rm fuse}$, which has already been defined by

\[\begin{aligned} A_{\rm fuse} = \left[ \pi + n_{\rm fweb}\left( 2\theta_{\rm fb}+ \sin 2 \theta_{\rm fb}\right) \right] R_{\rm fuse}^2 \;+\; 2 \left[ R_{\rm fuse}+ n_{\rm fweb}w_{\rm fb}\right] \Delta R_{\rm fuse}. \end{aligned}\]

This also defines the radius of the equivalent round cylinder. $\begin{aligned} R_{\rm cyl}& = & \sqrt{\frac{A_{\rm fuse}}{\pi}} \end{aligned}.$

The equivalent radii over the tapering nose and radius are then defined via the following convenient functions.

\[\begin{aligned} R {\scriptstyle (x)}& = & \left\{ \begin{array}{lcl} \displaystyle R_{\rm cyl} \left[ \: 1 - \left( \frac{x_{{\rm blend}_1} \!-\! x}{x_{{\rm blend}_1} \!-\! x_{\rm nose}} \right)^{\!\! a} \; \right]^{\! 1/a} & , & x_{\rm nose}< x < x_{{\rm blend}_1} \\[1.0em] \displaystyle R_{\rm cyl} & , & x_{{\rm blend}_1} < x < x_{{\rm blend}_{\,2}} \\[0.5em] \displaystyle R_{\rm cyl} \left[ \: 1 - \left( \frac{x \!-\! x_{{\rm blend}_{\,2}}}{x_{\rm end} \!-\! x_{{\rm blend}_{\, 2}}} \right)^{\!\! b} \; \right] & , & x_{{\rm blend}_{\,2}} < x < x_{\rm tail} \end{array} \right. \\ a & \simeq 1.6 & \\ b & \simeq 2.0 & \end{aligned}\]

The $x_{{\rm blend}_1}$ and $x_{{\rm blend}_{\,2}}$ locations are the nose and tailcone blend points, and do not necessarily have to be exactly the same as the $x_{{\rm shell}_1}$ and $x_{{\rm shell}_{\,2}}$ locations which define the loaded pressure shell. Likewise, $x_{\rm end}$ is the aerodynamic endpoint of the tailcone, and is distinct from its structural endpoint $x_{\rm conend}$. The $a$ and $b$ constant values above give reasonable typical fuselage shapes.

If the fuselage is nearly round, the necessary area and perimeter distributions follow immediately.

\[\begin{aligned} A {\scriptstyle (x)}& = & \pi \, {R{\scriptstyle (x)}}^2 \\ b_0 {\scriptstyle (x)}& = & 2 \pi R {\scriptstyle (x)} \end{aligned}\]

This would be suitably modified for non-circular cross-sections.

With this geometry definition, the viscous/inviscid calculation procedure provides the momentum and kinetic energy area distributions along the body and wake,

\[\begin{aligned} \left\{ \Theta {\scriptstyle (s)}\, , \: \Theta^* {\scriptstyle (s)}\right\} & = & f_{\rm f_{excr}} \: {\cal F}(M_{{\scriptscriptstyle \infty}}, Re_\ell\, ; \, A {\scriptstyle (x)}, b_0 {\scriptstyle (x)}) \end{aligned}\]

where ${\cal F}$ denotes the overall viscous/inviscid calculation procedure, and $f_{\rm f_{excr}} \geq 1$ is an empirical factor to allow for fuselage excrescence drag sources.

Specific values of interest are the momentum area $\Theta_{\rm wake}$ at the wake numerical endpoint $s_{\rm wake}$, the far-downstream momentum area $\Theta_{\scriptscriptstyle \infty}$, and the kinetic energy area $\Theta_{\scriptscriptstyle T\!E}$ at the body endpoint or trailing edge.

\[\begin{aligned} \Theta_{\rm wake}& = & \Theta (s_{\rm wake}) \\ H_{\rm avg} & = & {\textstyle \frac{1}{2}}\left[ H(s_{\rm wake}) + 1 + (\gamma\!-\!1) M_{{\scriptscriptstyle \infty}}^2 \right] \\ \Theta_{\scriptscriptstyle \infty}& = & \Theta_{\rm wake} \left( \frac{u_e (s_{\rm wake})}{V_{\!{\scriptscriptstyle \infty}}} \right)^{H_{\rm avg}} \\ \Theta^*_{\scriptscriptstyle T\!E}& = & \Theta^*(s_{\scriptscriptstyle T\!E}) \end{aligned}\]

The equation above is the Squire-Young formula, with $H_{\rm avg}$ being the average shape parameter between the end of the wake and far downstream.

The fuselage surface + wake dissipated power in the absence of BLI is then evaluated as follows, consistent with the usual wake momentum defect relations.

\[\begin{aligned} C'_{\!D_{\rm fuse}} & \equiv & \frac{\Phi_{\rm surf}-P_{V_{\rm surf}} + \Phi_{\rm wake}-P_{V_{\rm wake}}} {{\textstyle \frac{1}{2}}\rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}^3 S} \hspace{6ex} \rm{(without BLI)} \hspace{-9.0ex} \\ C'_{\!D_{\rm fuse}} & = & \frac{D_{\rm fuse}}{{\textstyle \frac{1}{2}}\rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}^2 S} \;=\; \frac{2 \Theta_{\scriptscriptstyle \infty}}{S} \hspace{17ex} \rm{(without BLI)} \hspace{-9.0ex} \end{aligned}\]

If BLI is present at or near the trailing edge, the upstream boundary layer and corresponding surface dissipation $\Phi_{\rm surf}$ will be mostly unaffected. But the viscous fluid flowing into the wake is now reduced by the ingestion fraction ${f_{\rm {\scriptscriptstyle BLI}_{\scriptstyle \,f}}}$, so that the wake dissipation $\Phi_{\rm wake}$ will be reduced by the same fraction. This then gives the following overall fuselage dissipation coefficient for the BLI case.

\[\begin{aligned} C_{\!D_{\rm fuse}} &\!=\! & \frac{\Phi_{\rm surf}\!-\!P_{V_{\rm surf}} \,+\, (\Phi_{\rm wake}\!-\!P_{V_{\rm wake}})(1\!-\!{f_{\rm {\scriptscriptstyle BLI}_{\scriptstyle \,f}}})} {{\textstyle \frac{1}{2}}\rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}^3 S} \hspace{3ex} \mathrm{(with BLI)} \hspace{-2ex} \\ C_{\!D_{\rm fuse}} & \!\simeq\! & C_{\!D_{\rm fuse}} \,-\, C_{\Phi_{\rm wake}} {f_{\rm {\scriptscriptstyle BLI}_{\scriptstyle \,f}}} \hspace{23ex} \mathrm{(with BLI)} \hspace{-2ex} \\[0.5em] \rm{where} \hspace{3ex} C_{\Phi_{\rm wake}} & \!=\! & \frac{2 \Theta_{\scriptscriptstyle \infty}}{S} \:-\: \frac{\Theta^*_{\scriptscriptstyle T\!E}}{S} \end{aligned}\]

TASOPT.aerodynamics.axisol!Method
axisol!(xnose, xend, xblend1, xblend2, Amax, 
      anose, btail, iclose,
      Mach, nc, nldim,
        xl, zl, sl, dyl, ql)

Calculates compressible potential flow about a quasi-axisymmetric body, using a simple piecewise-constant source line.

🔃 Inputs and Outputs

Inputs:

  • xnose::Float64: X (axial) location of nose point.
  • xend::Float64: X location of tail point.
  • xblend1::Float64: X location of nose-section blend point.
  • xblend2::Float64: X location of tail-section blend point.
  • Amax::Float64: Maximum cross-sectional area.
  • anose::Float64: Nose-section shape exponent.
  • btail::Float64: Tail-section shape exponent.
  • iclose::Integer: If 0, tail tapers to a point, otherwise to an edge.
  • Mach::Float64: Freestream Mach number for Prandtl-Glauert.
  • nc::Integer: Number of control points to be used.
  • nldim::Integer: Max dimension of passed arrays.

Outputs:

  • nl::Integer: Number of output surface and wake points.
  • ilte::Integer: Index of TE point.
  • xl::Array{Float64}: X (axial) locations of surface segment endpoints.
  • zl::Array{Float64}: Z (vertical) locations of surface segment endpoints.
  • sl::Array{Float64}: Arc lengths along surface and wake.
  • dyl::Array{Float64}: Half-width of edge-type tail section.
  • ql::Array{Float64}: Velocities V/V_inf along surface and wake.

See theory above or Section 3 of Simplified Viscous/Inviscid Analysis for Nearly-Axisymmetric Bodies. See also fusebl!.

source
TASOPT.aerodynamics.blsysMethod
blsys(simi, lami, wake, direct, Mach, uinv, hksep,
      x, b, rn, th, ds, ue,
      h , h_th, h_ds,
      hk, hk_th, hk_ds, hk_ue,
      hc, hc_th, hc_ds, hc_ue,
      hs, hs_th, hs_ds, hs_ue,
      cf, cf_th, cf_ds, cf_ue,
      di, di_th, di_ds, di_ue,
      xm,bm,rnm,thm,dsm,uem, 
      hm , hm_thm, hm_dsm,
      hkm, hkm_thm, hkm_dsm, hkm_uem,
      hcm, hcm_thm, hcm_dsm, hcm_uem,
      hsm, hsm_thm, hsm_dsm, hsm_uem,
      cfm, cfm_thm, cfm_dsm, cfm_uem,
      dim, dim_thm, dim_dsm, dim_uem)

Computes Jacobian matrices for BL solution at an axial station. Called repeatedly by blax.

🔃 Inputs and Outputs

Inputs:

  • simi::Integer: Self-similar BL profile flag.
  • lami::Integer: Laminar flow flag.
  • wake::Integer: In wake? Flag.
  • direct::Integer: Direct solution flag.
  • Mach::Float64: Mach number for compressibility.
  • uinv::Float64: Inviscid velocity.
  • x::Float64: Arc length.
  • b::Float64: Lateral width of BL.
  • rn::Float64: $dr/dn$, $= 0$ for 2D.
  • th::Float64: Momentum thickness.
  • ds::Float64: Displacement thickness.
  • ue::Float64: Edge velocity.
  • h::Float64: Shape parameter.
  • hk::Float64: Kinematic shape parameter.
  • hc::Float64: density shape parameter (Whitfield).
  • hs::Float64: kinetic energy shape parameter.
  • cf::Float64: Skin friction factor.
  • di::Float64: Dissipation factor.

m denotes the previous point (minus one) in the upstream. _z denotes partial derivative with respect to z (z = th, ds, ue).

Outputs:

  • aa::Array{Float64, 3, 3}: Jacobian matrix (wrt current point vars).
  • bb::Array{Float64, 3, 3}: Jacobian matrix (wrt previous point vars).
  • rr::Array{Float64, 3}: Residual.

See Section 4 of Simplified Viscous/Inviscid Analysis for Nearly-Axisymmetric Bodies.

source
TASOPT.aerodynamics.blaxMethod
blax(ndim, n,ite, xi, bi, rni, uinv, Reyn, Mach, fexcr)

Axisymmetric boundary layer + wake calculation routine. Uses specified inviscid velocity, corrects for viscous displacement to allow calculation of separated flow.

🔃 Inputs and Outputs

Inputs:

  • ndim::Integer: physical array dimension.
  • n::Integer: number of boundary layer + wake points.
  • ite::Integer: index of trailing edge point, start of wake.
  • xi::Array{Float64}: arc length array (BL coordinate).
  • bi::Array{Float64}: lateral width of BL at surface (i.e., body perimeter). $b_i$ = 0 for wake, 1 for 2D.
  • rni::Array{Float64}: $dr/dn$ to account for near-axisymmetric bodies, 0 for 2D.
  • uinv::Array{Float64}: inviscid velocity, $u_{inv}$.
  • Reyn::Float64: Reynolds number, $\rho_{ref} u_{ref} l_{ref} / \mu_{ref}$.
  • Mach::Float64: Mach number, $M = u_{ref} / a_{ref}$.
  • fexcr::Float64: excrescence multiplier applied to wall $c_f$, 1 for smooth wall.

Assumed units for all quantities:

  • l_ref: same unit as used for input xi,bi.
  • u_ref: freestream velocity.
  • a_ref: freestream speed of sound.
  • rho_ref: freestream density.
  • mu_ref: freestream viscosity.

Outputs:

  • uei::Array{Float64}: edge velocity, ($u_{e,i} = u_{inv,i} +$ {displacement correction}).
  • dsi::Array{Float64}: displacement thickness ($\delta^*$).
  • thi::Array{Float64}: momentum thickness ($\theta$).
  • tsi::Array{Float64}: kinetic energy thickness ($\theta^*$).
  • dci::Array{Float64}: density flux thickness ($\delta^{**}$).
  • cfi::Array{Float64}: skin friction coefficient, normalized with local $\rho$, $u$ ($c_{f,i}$).
  • cdi::Array{Float64}: dissipation coefficient , normalized with local $\rho$,$u$ ($c_{\mathcal{D},i}$).
  • cti::Array{Float64}: max shear-stress coefficient, normalized with local $\rho$,$u$ ($c_{t,i}$).
  • hki::Array{Float64}: kinematic shape parameter ($H_{K,i}$).
  • phi::Array{Float64}: integrated dissipation ($\Phi$).

Other outputs of interest can be computed as follows. These are in units of l_ref, rho_ref, u_ref

  • beffi: Effective perimeter, $b_{eff,i} = b_i + 2 \pi \delta^* dr/dn$.
  • rhi: Edge density, $\rho_i = (1 + \frac{(\gamma-1)}{2}M^2 (1.0-u_{e,i}^2))^\frac{1}{(\gamma-1)}$.
  • mdef: Total mass defect, $\rho_i u_{e,i} \delta^* b_{eff}$.
  • Pdef: Total momentum defect, $\rho_i u_{e,i}^2 \theta b_{eff}$.
  • Edef: Total kinetic energy defect, $\frac{1}{2} \rho_i u_{e,i}^3 \theta^* b_{eff}$.
  • tauwb: Wall shear force/span, $\frac{\tau_w}{b} = \frac{1}{2} u_{e,i}^2 c_{f,i} b_{eff}$.
  • Diss: Dissipation integral, $\rho_i u_{e,i}^3 c_{\mathcal{D},i} b_{eff,i}$.

Body profile drag D_p is the far-downstream momentum defect $P_\infty$, best obtained by applying Squire-Young to the last wake point, $i = n$ :

  • $P_{end} = \rho_i u_{e,i}^2 \theta b_{eff}$
  • $H_{end} = \delta^*/\theta$
  • $H_{\infty} = 1 + (\gamma-1) M^2$
  • $H_{avg} = \frac{1}{2} (H_{end} + H_{inf})$
  • $P_{inf} = P_{end} u_{e,i}^{H_{avg}} = D_p$

See Section 4 of Simplified Viscous/Inviscid Analysis for Nearly-Axisymmetric Bodies. See also blsys and blvar. Deprecates blax.

source
TASOPT.aerodynamics.blvarMethod
blvar(simi, lami, wake, Reyn, Mach, fexcr, x, θ, δs, ue)

Returns the boundary layer variables needed for solution.

🔃 Inputs and Outputs

Inputs:

  • simi::Integer: Self-similar BL profile flag.
  • lami::Integer: Laminar flow flag.
  • wake::Integer: In wake flag.
  • Reyn::Float64: Reynolds number.
  • Mach::Float64: Mach number for compressibility.
  • fexcr::Float64: Excrescence factor.

Outputs:

  • h::Float64 : Shape parameter.
  • hk::Float64: Kinematic shape parameter.
  • hc::Float64: Density shape parameter (Whitfield).
  • hs::Float64: Kinetic energy shape parameter.
  • cf::Float64: Skin friction factor.
  • cd::Float64: Dissipation factor and their derivatives.
source
TASOPT.aerodynamics.fusebl!Method
fusebl!(pari, parg, para, ip)

Calculates surface velocities, boundary layer, wake for a quasi-axisymmetric body in compressible flow.

A compressible source line represents the potential flow. An integral BL formulation with lateral divergence represents the surface BL and wake. An added-source distribution represents the viscous displacement influence on the potential flow. The body shape is defined by its area and perimeter distributions A(x), b0(x), which are defined by the various geometric parameters in parg.

🔃 Inputs and Outputs

Inputs:

  • pari::AbstractVector{Int64}: Vector of aircraft model integer/flag parameters.
  • parg::AbstractArray{Float64}: Vector of aircraft model geometry parameters.
  • para::AbstractArray{Float64}: Vector of aircraft model aerodynamic parameters.
  • parm::AbstractArray{Float64}: Vector of aircraft model mission parameters.
  • ip::Integer: Index of flight point in par arrays.

Outputs:

  • No explicit outputs. Computed drag values are saved to para of aircraft model.

See Simplified Viscous/Inviscid Analysis for Nearly-Axisymmetric Bodies. See also blax and axisol!.

Future Changes

In an upcoming revision, an aircraft struct and auxiliary indices will be passed in lieu of pre-sliced par arrays.

source

Trefftz plane drag calculation

Trefftz plane analysis computes the induced drag from lifting surfaces. The lift distributions are propagated downstream, accounting for streamline contraction from fuselage thickness variation as shown in the Figure below.

Two shaded streamtubes are shown. Wake center radius $y'_o$ is nonzero due to the fuselage viscous wake displacement area.

The vorticity in the wake is numerially integrated at collocation points to determine the overall induced drag.

T

Trefftz Plane vortices $i,i\!+\!1 \ldots$ and collocation points $i\!+\!1/2$ used for velocity, impulse, and kinetic energy calculations. Left/right symmetry is exploited.

📖 Theory - induced drag $C_{d,i}$

The induced drag is calculated using a discrete vortex Trefftz-Plane analysis. The circulation of the wing wake immediately behind the trailing edge is

\[\begin{aligned} \Gamma_{\!{\rm wing}} {\scriptstyle (\eta)} & = \frac{\tilde{p} {\scriptstyle (\eta)}}{\rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}} \; \simeq \; \frac{p {\scriptstyle (\eta)}}{\rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}} \, \sqrt{1 \!-\! \eta^{k_t}} \\ k_t & \simeq 16 \end{aligned}\]

where the approximation realistically represents the tip lift rolloff for typical taper ratios, and is consistent with the assumed $f_{L_{\scriptstyle t}}\simeq -0.05$ value for the tip lift loss factor. This circulation is convected into the wake along streamlines which will typically constrict behind the fuselage by continuity. The Figure above shows two possible aft fuselage taper shapes, giving two different wake constrictions.

An annular streamtube at the wing contracts to another annular streamtube in the wake with the same cross-sectional area. The $y$ and $y'$ locations on the wing and wake which are connected by a streamline are therefore related by the correspondence function.

\[\begin{aligned} y'{\scriptstyle (y)}& = & \sqrt{ y^2 - y_o^2 + {y'_o}^2} \end{aligned}\]

The Trefftz Plane circulation $\Gamma {\scriptstyle (y')}$ is then given by the coordinate shift. The mapping function $y'{\scriptstyle (y)}$ is not defined for $y \! < \! y_o$, so the circulation there is simply set from the $y_o$ value.

\[\begin{aligned} \Gamma_{\rm wake} {\scriptstyle (y')}& = & \left\{ \begin{array}{lcl} \Gamma_{\!{\rm wing}} \left( y {\scriptstyle (y')}\right) & , & y \!>\! y_o \\ \Gamma_{\!{\rm wing}} \left( y_o \right) \end{array} \right. \end{aligned}\]

The Trefftz Plane analysis uses point vortices. The circulation ([Gamwake]) is evaluated at the midpoints of $n$ intervals along the wake trace, spaced more or less evenly in the Glauert angle to give a cosine distribution in physical space. The wake's vertical $z$ positions are simply taken directly from the wing.

\[\begin{aligned} \theta_{i+1/2} & = & \frac{\pi}{2} \, \frac{i-1/2}{n} \hspace{2ex} , \hspace{2ex} i = 1 \ldots n \\ y_{i+1/2} & = & \frac{b}{2} \, \cos \theta_{i+1/2} \\ y'_{i+1/2} & = & \sqrt{y_{i+1/2}^2 - y_o^2 + {y'_o}^2} \\ z'_{i+1/2} & = & z_{i+1/2} \\ \Gamma_{\!i+1/2} & = & \Gamma_{\!{\rm wing}} (y_{i+1/2}) \end{aligned}\]

The locations of $n+1$ trailing vortices are computed similarly.

\[\begin{aligned} \theta_i & = & \frac{\pi}{2} \, \frac{i-1}{n} \hspace{2ex} , \hspace{2ex} i = 1 \ldots n\!+\!1 \\ y_i & = & \frac{b}{2} \, \cos \theta_i \\ y'_i & = & \sqrt{y_i^2 - y_o^2 + {y'_o}^2} \\ z'_i & = & z_i \end{aligned}\]

The circulations of these trailing vortices are the differences of the adjacent bound circulations, with the circulation beyond the tips effectively zero.

\[\begin{aligned} \bar{\Gamma}_{\!i} & = & \left\{ \begin{array}{lcl} \hspace{6.5ex} -\Gamma_{\!i-1/2} & , & i = 1 \hspace{3.5em} \mathrm{(left tip)} \\ \Gamma_{\!i+1/2}-\Gamma_{\!i-1/2} & , & i = 2 \ldots n \\ \Gamma_{\!i+1/2} & , & i = n\!+\!1 \hspace{2em} \mathrm{(right tip)} \end{array} \right. \end{aligned}\]

The above definitions are also applied to the horizontal tail, with its discrete points simply appended to the list and $n$ increased accordingly.

The Trefftz plane calculation proceeds by first calculating the $y$-$z$ wake velocity components at the $y'_{i+1/2},z'_{i+1/2}$ interval midpoints, induced by all the trailing vortices and their left-side images.

\[\begin{aligned} v_{i+1/2} & = & \sum_{j=1}^{n+1} \frac{\bar{\Gamma}_{\!j}}{2\pi} \left[ \frac{-(z'_{i+1/2}\!-\!z'_j)} {(y'_{i+1/2}\!-\!y'_j)^2 + (z'_{i+1/2}\!-\!z'_j)^2} \,-\, \frac{-(z'_{i+1/2}\!-\!z'_j)} {(y'_{i+1/2}\!+\!y'_j)^2 + (z'_{i+1/2}\!-\!z'_j)^2} \right] \hspace{2em} \\ w_{i+1/2} & = & \sum_{j=1}^{n+1} \frac{\bar{\Gamma}_{\!j}}{2\pi} \left[ \frac{ y'_{i+1/2}\!-\!y'_j} {(y'_{i+1/2}\!-\!y'_j)^2 + (z'_{i+1/2}\!-\!z'_j)^2} \,-\, \frac{ y'_{i+1/2}\!+\!y'_j} {(y'_{i+1/2}\!+\!y'_j)^2 + (z'_{i+1/2}\!-\!z'_j)^2} \right] \end{aligned}\]

The overall lift and induced drag are then computed using the Trefftz Plane vertical impulse and kinetic energy. The sums are doubled to account for the left side image.

\[\begin{aligned} C_{\!L_{\scriptscriptstyle T\!P}} & = & \frac{2}{{\textstyle \frac{1}{2}}\rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}^2 S} \: \sum_{i=1}^{n} \: \rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}\, \Gamma_{\!i+1/2} \: (y'_{i+1}-y'_i) \\ C_{\!D_{\scriptscriptstyle T\!P}} & = & \frac{2}{{\textstyle \frac{1}{2}}\rho_{\scriptscriptstyle \infty}V_{\!{\scriptscriptstyle \infty}}^2 S} \: \sum_{i=1}^{n} -\frac{\rho_{\scriptscriptstyle \infty}}{2} \, \Gamma_{\!i+1/2} \left[ w_{i+1/2} \,(y'_{i+1}\!-\!y'_i) \:-\:v_{i+1/2} \,(z'_{i+1}\!-\!z'_i) \right] \end{aligned}\]

To minimize any modeling and numerical errors incurred in the wake contraction model and the point-vortex summations, the final induced drag value is scaled by the square of the surface-integral and Trefftz-Plane drag values.

\[\begin{aligned} C_{\!D_i} & = & C_{\!D_{\scriptscriptstyle T\!P}} \left(\frac{C_{\!L}}{C_{\!L_{\scriptscriptstyle T\!P}}} \right)^{\!2} \end{aligned}\]

This is equivalent to using the Trefftz Plane analysis to calculate the span efficiency rather than the actual induced drag coefficient.

TASOPT.aerodynamics.cditrpMethod
  cditrp(pari,parg,para)

Computes the induced drag via the Trefftz plane. Calls trefftz1.

🔃 Inputs and Outputs

Inputs:

  • pari::AbstractVector{Int64}: Vector of aircraft model integer/flag parameters.
  • parg::AbstractVector{Float64}: Vector of aircraft model geometry parameters.
  • para::AbstractArray{Float64}: Array of aircraft model aerodynamic parameters.

Outputs:

  • No explicit outputs. Computed induced drag value and span efficiency are saved to para of aircraft model.
Future Changes

In an upcoming revision, an aircraft struct and auxiliary indices will be passed in lieu of pre-sliced par arrays.

source
TASOPT.aerodynamics.trefftz1Method
trefftz1(nsurf, npout, npinn, npimg, 
      Sref, bref, b, bs, bo, bop, 
      zcent, po, gammat, gammas, 
      fLo,ktip, Lspec, CLsurfsp)

Trefftz plane routine for the induced drag computation of nsurf number of surfaces.

🔃 Inputs and Outputs

Inputs:

  • nsurf::Integer: Number of surfaces (typically wing and horizontal tail).
  • npout::Integer: Number of spanwise intervals (outer panel).
  • npinn::Integer: " " (inner panel).
  • npimg::Integer: " " (image inside fuselage).
  • b::Float64: Span.
  • bs::Float64: Wing-break span.
  • bo::Float64: Wing-root span.
  • bop::Float64: Span of wing-root streamline in Trefftz plane
  • zcent::Vector{Float64}: Vertical position at centerline for each surface.
  • gammat::Vector{Float64}, gammas::Vector{Float64}`: Wing lift distribution "taper" ratios for outer and inner wing sections, respectively.
  • fLo: wing root load adjustment factors (currently not implemented).
  • ktip::Float64: wing tip load adjustment factors.
  • Lspec::Integer: Flag for specified lift calculation (scales vorticities to achieve CLsurfsp before computing induced drag).
  • CLsurfsp::Vector{Float64}: Prescribed surface lift coefficient.

Outputs: -CLsurf::Vector{Float64}: Lift coefficients for each surface. -CL::Float64: Sum of lift coefficients of all surfaces. -CD::Float64: Sum of induced drag coefficients of all surfaces. -spanef::Float64: Span efficiency of combined surfaces ($= (CL^2 / (π*AR))/CD$).

See theory above or Sections 2.14.7 and 3.8.1 of the TASOPT Technical Desc.

source

Wing and tail surfaces

Lifting surface drag is determined via surfcd (when constant airfoil section cdf and cdp are already determined), and surfcd2 (when an explicit modelling and integration is desired). Airfoil performance is accessed via a lookup of precomputed airfoil data, airfun.

TASOPT.aerodynamics.surfcd2Method
surfcd2(S,
        b, bs, bo,
        λt, λs, γt, γs,
        toco, tocs, toct,
        Mach, sweep, co,
        CL, CLhtail, fLo, fLt,
        Reco, aRexp, kSuns, fexcd,
        AMa, Acl, Atau, ARe, A,
        fduo, fdus, fdut)

Calculates wing or tail surface profile CD by calculating the performance of wing segments explicitly via airfoil data (found in [./src/air/C.air] and accessed by [airfun], [airtable]). Called by cdsum! if icdfun flag set to 1.

🔃 Inputs and Outputs

Inputs:

  • S::Float64: Reference area.
  • b::Float64: Span.
  • bs::Float64: Outer panel break span.
  • bo::Float64: Wing-root (fuselage) span.
  • λt::Float64: Outer-panel chord taper ratio ct/co.
  • λs::Float64: Inner-panel chord taper ratio cs/co.
  • γt::Float64: Outer-panel load taper ratio pt/po.
  • γs::Float64: Inner-panel load taper ratio ps/po.
  • toco::Float64: Root airfoil t/c.
  • tocs::Float64: Break airfoil t/c.
  • toct::Float64: Tip airfoil t/c.
  • sweep::Float64: Wing sweep, degrees.
  • co::Float64: Wing root chord.
  • Reco::Float64: Reynolds number for co.
  • aRexp::Float64: Re-scaling exponent.
  • kSuns::Float64: Shock-unsweep area constant.
  • fexcd::Float64: Excrescence cd scaling factor.
  • fduo::Float64, fdus::Float64, fdut::Float64: Velocity-change fractions at wing root, break ("snag"), and tip due to fuselage flow.

Outputs:

  • clpo::Float64,clps::Float64,clpt::Float64: Perpendicular sectional lift coefficient at wing root, break ("snag"), and tip.
  • CDfwing::Float64: Friction profile cd in perp. plane.
  • CDpwing::Float64: Pressure profile cd in perp. plane.
  • CDwing::Float64: Overall profile CD.
  • CDover::Float64: Fuselage added CD due to lift carryover.

See Sections 2.14.3 and 3.8.3 of TASOPT Technical Desc. See also cdsum!, surfcd, [surfcm], and [airfun].

Future Changes

This function will be renamed for clarity of use.

source
TASOPT.aerodynamics.surfcdMethod
surfcd(S, 
b, bs, bo, 
λt, λs, sweep, 
co, cdf, cdp, 
Reco, Reref, 
aRexp, kSuns, fCDcen)

Computes wing or tail surface profile CD from pre-computed chord quantities and corrections. Called by cdsum! if icdfun flag set to 0.

Future Changes

This function may be renamed for clarity of use.

🔃 Inputs and Outputs

Inputs:

  • S::Float64: reference area.
  • b::Float64: span.
  • bs::Float64: outer panel break span.
  • bo::Float64: wing-root (fuselage) span.
  • λt::Float64: outer-panel taper ratio $ct/co$.
  • λs::Float64: inner-panel taper ratio $cs/co$.
  • sweep::Float64: wing sweep, degrees.
  • co::Float64: wing root chord.
  • cdf::Float64: friction profile cd.
  • cdp::Float64: pressure profile cd.
  • Reco::Float64: Reynolds number for co.
  • Reref::Float64: reference Reynolds number for cd scaling.
  • aRexp::Float64: Re-scaling exponent.
  • kSuns::Float64: shock-unsweep area constant.
  • fCDcen::Float64 : related to fraction of wing BLI (see Eqns. 619 - 621).

Outputs:

  • CDsurf: overall profile CD.
  • CDover: fuselage added CD due to lift carryover.

See Sections 2.14.3 and 3.8.3 of the TASOPT Technical Desc.

source
TASOPT.aerodynamics.airtableMethod
airtable(fname)

Reads airfoil file and outputs the matrix and splines as an airfoil.

The airfoil data is stored as a function of three variables, typically Mach number $\mathrm{Ma}$, lift coefficient $c_l$, and thickness to chord ratio $\tau$.

cdf(Ma, cl, τ), cdp(Ma, cl, τ), cm(Ma, cl, τ)
🔃 Inputs and Outputs

Inputs:

  • fname::String: Path to file.

Outputs:

  • airf::TASOPT.aerodynamics.airfoil: struct with airfoil performance characteristics.
source
TASOPT.aerodynamics.airfunMethod
airfun(cl, τ, Mach, air::airfoil)

Looks up airfoil performance data at specified conditions, as precomputed and found in ./src/airfoil_data/.

🔃 Inputs and Outputs

Inputs:

  • cl::Float64: Airfoil section lift coefficient.
  • τ::Float64: Airfoil section thickness-to-chord ratio.
  • Mach::Float64: Mach number.
  • air::TASOPT.aerodynamics.airfoil: airfoil structure with performance data.

Outputs:

  • cdf::Float64: Airfoil section skin friction drag.
  • cdp::Float64: Airfoil section pressure drag.
  • cdw::Float64: Airfoil section wave drag (unused and assumed 0 here; placeholder left for future implementation).
  • cm::Float64: Airfoil section pitching moment.
source

Total drag calculation

TASOPT.aerodynamics.cdsum!Method
cdsum!(pari,parg,para,pare,icdfun)

Calculates aircraft CD components for operating point, ipoint. If icdfun=1, computes wing cdf,cdp from airfoil database # iairf, otherwise uses default values in para array. Called by mission!, wsize, takeoff!, and odperf!.

The total drag is computed by

\[C_{D} = C_{D, i} + C_{D,fuse} + C_{D,wing} + C_{D,over} + C_{D,htail} + C_{D,vtail} + C_{D,strut} + C_{D,nace} + \Delta C_{D,BLI,f} + \Delta C_{D,BLI,w}\]

where:

  • $C_{D,i}$ (CDi) is the total induced drag including the wing and tail,
  • $C_{D,fuse}$ (CDfuse) is the fuselage profile drage computed by solving a boundary layer integral equation,
  • $C_{D,wing}$ (CDwing) is the wing profile drag (viscous + pressure) computed using airfoil data obtained from CFD,
  • $C_{D,over}$ (CDover) is the fuselage added CD due to lift carryover,
  • $C_{D,htail}$ (CDhtail) is the horizontal tail profile drag computed in a similar manner with CDwing,
  • $C_{D,vtail}$ (CDvtail) is the vertical tail profile drag computed in a similar manner with CDwing,
  • $C_{D,strut}$ (CDstrut) is the struct profile drag,
  • $C_{D,nace}$ (CDnace) is the nacelle profile drag,
  • $\Delta C_{D,BLI,f}$ (dCDBLIf) is related to the boundary layer ingestion on the fuselage,
  • and $\Delta C_{D,BLI,w}$ (dCDBLIw) is related to the boundary layer ingestion on the wing.
🔃 Inputs and Outputs

Inputs:

  • pari::AbstractVector{Int64}: Vector of aircraft model integer/flag parameters.
  • parg::AbstractArray{Float64}: Vector of aircraft model geometry parameters.
  • para::AbstractArray{Float64}: Vector of aircraft model aerodynamic parameters.
  • pare::AbstractArray{Float64}: Vector of aircraft model engine parameters.
  • icdfun::Integer: Flag if drag should be computed (=1) or if para values should be used (=0).

Outputs:

  • No explicit outputs. Computed drag values are saved to para of aircraft model.

See Section 2.14 of the TASOPT Technical Desc. See also trefftz1, fusebl!, surfcd2, surfcd, cfturb, and cditrp.

Future Changes

In an upcoming revision, an aircraft struct and auxiliary indices will be passed in lieu of pre-sliced par arrays.

source

Other utilities

TASOPT.aerodynamics.cfturbFunction
  cfturb(Re)

Returns the total $C_f$ for turbulent flat plate (one side) as a function of $\mathrm{Re}_l$

\[C_{f, turb} = \frac{0.523}{(\log(0.06\mathrm{Re}))^2} \]

source

For example, the turbulent flat plate $C_f$ for a $Re$ of $10e6$ can be calculated as follows:

Re = 10e6
cfturb(Re)
0.002954557862895432