computeFlappingPower {afpt}R Documentation

Calculate aerodynamic power flapping flight


The function calculates the aerodynamic power required for the specified bird (or bat) at the specified flight speed.





object describing the relevant morphological parameters of the bird (or bat); this object should be created using the Bird constructor.


a numeric vector of the airspeed.


optional arguments (see details)


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.


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.


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:


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.


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).


object describing the atmospheric conditions (density, viscosity, gravity).

Aerodynamic model

computeFlappingPower first computes the drag components for non-flapping flight:

D.ind = L^2 / (q * π * b^2)

D.pro0 = q * C.Dpro0 * S

D.pro2 = kp * L^2 / (q * S)

D.par = q * C.Dbody * S.b + D.added

which combine to the non-flapping thrust requirement T.0 = sum(D.<>). Here q = ρ * U^2 / 2 is the dynamic pressure depending on density (ρ) and speed (U). To account for how flapping the wings affects the drag on the wings, computeFlappingPower computes factors fD.ind, fD.pro0 and fD.pro2, 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

kD.<> = 1 + fD.<> * 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

T/L = T.0 / (L - fD.ind * D.ind - fD.pro0 * D.pro0 - fD.pro2 * D.pro2)

Finally, computeFlappingPower computes the power factors in a similar way to the drag factors (i.e. kP.i = 1 + fP.i * T/L, with fP.i functions of strokeplane angle and wingbeat frequency). The total aerodynamic power is then computed as

P = kP.ind * D.ind * U + kP.pro0 * D.pro0 * U + kP.pro2 * D.pro2 * U + D.par * U

Wingbeat optimization

The underlying numerical model that is represented by functions fD.i and fP.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.


A data.frame including elements


specified speed for which power is computed.


total aerodynamic power.


total chemical power.


used strokeplane angle (either specified or optimized).


wingbeat amplitude (implicitly optimized for minimum induced power).


wingbeat frequency (specified).


TRUE if reduced frequency too low (<1; outside model range).


TRUE if reduced frequency too high (>6; outside model range).


TRUE if thrust requirement too high (>0.3; outside model range).


TRUE if speed is too low (invalidating the forward flight assumption).


induced drag factor


zero lift profile drag factor


lift dependent profile drag factor


induced power factor


zero lift profile power factor


lift dependent profile power factor


used zero lift profile drag coefficient (laminar boundary layer friction)


mean chord Reynolds number


non-flapping induced drag (N)


non-flapping zero lift profile drag (N)


non-flapping lift dependent profile drag (N)


non-flapping parasitic drag (including body drag and apparent drag due to climbing)


lift (N)


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.


Marco Klein Heerenbrink


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


## 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)
#   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)
#   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')
#   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')
#   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

[Package afpt version Index]