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.
📖 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!
— Methodaxisol!(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!
.
TASOPT.aerodynamics.blsys
— Methodblsys(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.
TASOPT.aerodynamics.blax
— Methodblax(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 inputxi
,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
.
TASOPT.aerodynamics.blvar
— Methodblvar(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.
TASOPT.aerodynamics.fusebl!
— Methodfusebl!(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 ofaircraft
model integer/flag parameters.parg::AbstractArray{Float64}
: Vector ofaircraft
model geometry parameters.para::AbstractArray{Float64}
: Vector ofaircraft
model aerodynamic parameters.parm::AbstractArray{Float64}
: Vector ofaircraft
model mission parameters.ip::Integer
: Index of flight point inpar
arrays.
Outputs:
- No explicit outputs. Computed drag values are saved to
para
ofaircraft
model.
See Simplified Viscous/Inviscid Analysis for Nearly-Axisymmetric Bodies. See also blax
and axisol!
.
In an upcoming revision, an aircraft
struct and auxiliary indices will be passed in lieu of pre-sliced par
arrays.
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.
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.cditrp
— Method cditrp(para, wing, htail)
Computes the induced drag via the Trefftz plane. Calls trefftz1
.
🔃 Inputs and Outputs
Inputs:
para::AbstractArray{Float64}
: Array ofaircraft
model aerodynamic parameters.wing::TASOPT.Wing
: Wing Structure.htail::TASOPT.Tail
: Htail Structure.
Outputs:
- No explicit outputs. Computed induced drag value and span efficiency are saved to
para
ofaircraft
model.
In an upcoming revision, an aircraft
struct and auxiliary indices will be passed in lieu of pre-sliced par
arrays.
TASOPT.aerodynamics.trefftz1
— Methodtrefftz1(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 planezcent::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 achieveCLsurfsp
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.
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.surfcd2
— Method surfcd2(wing, γt, γs,
Mach, CL, CLhtail,
Reco, aRexp, kSuns, fexcd,
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:
Wing::TASOPT.Wing
: Wing Structure.γt::Float64
: Outer-panel load taper ratio pt/po.γs::Float64
: Inner-panel load taper ratio ps/po.Mach::Float64
: Mach number.CL::Float64
: Wing CL.CLhtail::Float64
: Htail CL.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
].
This function will be renamed for clarity of use.
TASOPT.aerodynamics.surfcd
— Methodsurfcd(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.
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.
TASOPT.aerodynamics.airtable
— Methodairtable(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.
TASOPT.aerodynamics.airfun
— Methodairfun(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.
Total drag calculation
TASOPT.aerodynamics.cdsum!
— Methodcdsum!(parg,para,pare, wing, htail, vtail, 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 withCDwing
, - $C_{D,vtail}$ (
CDvtail
) is the vertical tail profile drag computed in a similar manner withCDwing
, - $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:
parg::AbstractArray{Float64}
: Vector ofaircraft
model geometry parameters.para::AbstractArray{Float64}
: Vector ofaircraft
model aerodynamic parameters.pare::AbstractArray{Float64}
: Vector ofaircraft
model engine parameters.Wing::TASOPT.Wing
: Wing Structure.Htail::TASOPT.Tail
: Htail Structure.Vtail::TASOPT.Tail
: Vtail Structure.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
ofaircraft
model.
See Section 2.14 of the TASOPT Technical Desc. See also trefftz1
, fusebl!
, surfcd2
, surfcd
, cfturb
, and cditrp
.
In an upcoming revision, an aircraft
struct and auxiliary indices will be passed in lieu of pre-sliced par
arrays.
Other utilities
TASOPT.aerodynamics.cfturb
— Function 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} \]
For example, the turbulent flat plate $C_f$ for a $Re$ of $10e6$ can be calculated as follows:
Re = 10e6
cfturb(Re)
0.002954557862895432