computeFlappingPower {afpt} | R Documentation |
Calculate aerodynamic power flapping flight
Description
The function calculates the aerodynamic power required for the specified bird (or bat) at the specified flight speed.
Usage
computeFlappingPower(bird,speed,...,frequency,strokeplane)
Arguments
bird |
object describing the relevant morphological parameters of the bird (or bat); this object should be created using the |
speed |
a numeric vector of the airspeed. |
... |
optional arguments (see details) |
frequency |
wingbeat frequency as single numeric value, a numeric vector matching the speed vector, a closure object returning a numeric value as a function of speed, or the character string 'recompute'. The latter will recompute the default frequency for the current flight condition (density) and the current total mass of the bird (assuming the frequency in bird is the default wingbeat frequency). If not provided, the function will look for a default wingbeat frequency in the bird object. |
strokeplane |
angle of the strokeplane in degrees, as a single numeric value, a numeric vector matching the speed vector, a closure object describing the strokeplane angle as a function of speed. Alternatively providing character string "opt" will tell the function to optimize the strokeplane angle for minimum aerodynamic power. |
Details
This function estimates aerodynamic power for a animal in forward flight based on morphology and wingbeat kinematics (Klein Heerenbrink, 2015). The model takes into account span reduction during the upstroke, which is typical for vertebrate forward flight. ... The minimal input required for the function is a description of the animal (as provided by the Bird constructor) and the speed(range) for which to compute the aerodynamic power. Distinct from other models, this model also requires wingbeat frequency and strokeplane angle. Higher wingbeat frequency tends to lower the induced power, but it may increase profile power. If no wingbeat frequency is provided, the function will use the reference wingbeat frequency from the bird object. Otherwise the user can specify values (either as vectors or as closure object). The user can provide additional optional arguments:
bodyDragCoefficient
single numeric value, a numeric vector matching the speed vector, or a closure object as a function of speed. If not provided, the function will look for a default value in the bird object.
addedDrag
single numeric value or a numeric vector matching the speed vector. This represents additional "drag" (in Newtons) that must be overcome (e.g. during climb).
flightcondition
object describing the atmospheric conditions (density, viscosity, gravity).
Aerodynamic model
computeFlappingPower
first computes the drag components for non-flapping flight:
D_\mathrm{ind} = \frac{L^2}{q \pi b^2}
D_\mathrm{pro,0} = C_{D_\mathrm{pro,0}} q S
D_\mathrm{pro,2} = k_{p} \frac{L^2}{q S}
D_\mathrm{par} = C_{D_\mathrm{b}} q S_\mathrm{b} + D_\mathrm{added}
which combine to the non-flapping thrust requirement T_0 = \sum D_{<>}
. Here q = \frac{1}{2}\rho U^2
is the dynamic pressure depending on density (\rho
) and speed (U
).
To account for how flapping the wings affects the drag on the wings, computeFlappingPower
computes factors f_{D_\mathrm{ind}}
, f_{D_\mathrm{pro,0}}
and f_{D_\mathrm{pro,2}}
, which are functions of the strokeplane angle and the (reduced) wingbeat frequency. These factors relate to the returned drag factors kD.ind
, kD.pro0
and kD.pro2
through
k_{D,<>}=1+f_{D,<>} \frac{T}{L}
The actual drag in flapping flight is found by multiplying each non-flapping drag component with its respective drag factor. This means that the actual thrust requirement (thrust ratio T/L
) can be computed as
\frac{T}{L} = \frac{T_0}{L - f_{D\mathrm{ind}}D_\mathrm{ind} - f_{D\mathrm{pro,0}}D_\mathrm{pro,0} - f_{D\mathrm{pro,2}}D_\mathrm{pro,2} }
Finally, computeFlappingPower
computes the power factors in a similar way to the drag factors (i.e. k_{P,i}=1+f_{P,i}\frac{T}{L}
, with f_{P,i}
functions of strokeplane angle and wingbeat frequency).
The total aerodynamic power is then computed as
P = k_{P\mathrm{ind}} D_\mathrm{ind}U + k_{P\mathrm{pro,0}} D_\mathrm{pro,0}U + k_{P\mathrm{pro,2}} D_\mathrm{pro,2}U + D_\mathrm{par}U
Wingbeat optimization
The underlying numerical model that is represented by functions f_{D,i}
and f_{P,i}
, has optimised the flapping amplitude for minimum induced power. This means computeFlappingPower
implicitly optimizes flapping amplitude, which is the value amplitude
returned in the output.
computeFlappingPower
takes strokeplane angle as input. The underlying numerical model has only explored strokeplane angles over a range of 0 (vertical) to 50 degrees, the latter being defined as having the down-stroke moving forward. In many cases it will be possible to find a strokeplane angle for which the total aerodynamic power is minimal. At high speeds this optimum will be for a vertical strokeplane while at lower speeds it will be more horizontal. By passing strokeplane="opt"
as an argument to computeFlappingPower
, it will try to numerically find the optimal strokeplane angle, using the function optimize
.
Value
A data.frame including elements
speed |
specified speed for which power is computed. |
power |
total aerodynamic power. |
power.chem |
total chemical power. |
strokeplane |
used strokeplane angle (either specified or optimized). |
amplitude |
wingbeat amplitude (implicitly optimized for minimum induced power). |
frequency |
wingbeat frequency (specified). |
flags.redFreqLo |
TRUE if reduced frequency too low (<1; outside model range). |
flags.redFreqHi |
TRUE if reduced frequency too high (>6; outside model range). |
flags.thrustHi |
TRUE if thrust requirement too high (>0.3; outside model range). |
flags.speedLo |
TRUE if speed is too low (invalidating the forward flight assumption). |
kD.ind |
induced drag factor |
kD.pro0 |
zero lift profile drag factor |
kD.pro2 |
lift dependent profile drag factor |
kP.ind |
induced power factor |
kP.pro0 |
zero lift profile power factor |
kP.pro2 |
lift dependent profile power factor |
CDpro0 |
used zero lift profile drag coefficient (laminar boundary layer friction) |
ReynoldsNumber |
mean chord Reynolds number |
Dnf.ind |
non-flapping induced drag (N) |
Dnf.pro0 |
non-flapping zero lift profile drag (N) |
Dnf.pro2 |
non-flapping lift dependent profile drag (N) |
Dnf.par |
non-flapping parasitic drag (including body drag and apparent drag due to climbing) |
L |
lift (N) |
Note
This model aims to predict the optimal flight performance for a bird. Particularly, the induced drag and induced power assume an ideal load distribution over the wing equivalent to the elliptical lift distribution for non-flapping wings. This means that induced power will typically be underestimated.
Author(s)
Marco Klein Heerenbrink
References
Klein Heerenbrink, M., Johansson, L. C. and Hedenström, A. (2015) Power of the wingbeat: modelling the effects of flapping wings in vertebrate flight. Proc. R. Soc. A 471, 2177 doi:10.1098/rspa.2014.0952
See Also
Bird
, amplitude
, fD.ind
, fD.pro0
, fD.pro2
, fP.ind
, fP.pro0
, fP.pro2
Examples
## Define a bird:
myBird = Bird(
massTotal = 0.215, # (kg) total body mass
wingSpan = 0.67, # (m) maximum wing span
wingArea = 0.0652, # (m2) maximum wing area
type = "passerine"
)
## define a speed range
speedrange <- seq(5,14,length.out=5)
## compute aerodynamic power for that speed range:
Paero <- computeFlappingPower(myBird,speedrange)
print(Paero[c("speed","power","frequency","strokeplane")])
# speed power frequency strokeplane
# 1 5.00 2.789751 5.948083 46.56887
# 2 7.25 2.129466 5.948083 31.89129
# 3 9.50 2.203773 5.948083 22.51896
# 4 11.75 2.740763 5.948083 16.49120
# 5 14.00 3.673714 5.948083 12.09174
## prescribe strokeplane angle:
Paero <- computeFlappingPower(myBird,speedrange,strokeplane=20)
print(Paero[c("speed","power","frequency","strokeplane")])
# speed power frequency strokeplane
# 1 5.00 2.950259 5.948083 20
# 2 7.25 2.141581 5.948083 20
# 3 9.50 2.204132 5.948083 20
# 4 11.75 2.741335 5.948083 20
# 5 14.00 3.676224 5.948083 20
## prescribe frequency as a function of speed:
funFrequency = function(U){19.8 - 4.7*U + 0.45*U^2 - 0.0138*U^3}
Paero <- computeFlappingPower(myBird,speedrange,frequency=funFrequency,strokeplane='opt')
print(Paero[c("speed","power","frequency","strokeplane")])
# speed power frequency strokeplane
# 1 5.00 2.810431 5.825000 46.16223
# 2 7.25 2.356278 4.119247 25.99702
# 3 9.50 2.390251 3.930725 17.94304
# 4 11.75 2.860463 4.316291 14.52910
# 5 14.00 3.794431 4.332800 11.70058
## examine effect of frequency for a single airspeed:
speedrange <- rep(10,5) # repeated speed
freqrange <- seq(3,10,length.out=5) # frequency range
Paero <- computeFlappingPower(myBird,speedrange,frequency=freqrange,strokeplane='opt')
print(Paero[c("speed","power","frequency","strokeplane")])
# speed power frequency strokeplane
# 1 10 2.681028 3.00 13.87797
# 2 10 2.367982 4.75 18.90949
# 3 10 2.263765 6.50 21.52433
# 4 10 2.219739 8.25 21.71519
# 5 10 2.200852 10.00 20.18503