Approximation for Koch Chart density altitude for an increase in takeoff roll and decrease in climb rate based on pressure altitude and temperature.

e_pilot_density_altitude(
  pres_alt = 0,
  temp_C = 15,
  dist_takeoff_sea_level = 1000,
  climb_rate_sea_level = 500,
  sw_propeller = c("fixed_pitch", "constant_speed")[2]
)

Arguments

pres_alt

pressure altitude, inches of Mg

temp_C

temperature, degrees celsius

dist_takeoff_sea_level

POH distance for takeoff at standard temperature and pressure (STP)

climb_rate_sea_level

POH distance for climb at standard temperature and pressure (STP)

sw_propeller

Select propeller to be "fixed_pitch" or "constant_speed"

Value

out named list including density_altitude, dist_takeoff_dens_alt, climb_rate_dens_alt, and all the input parameters.

Details

dens_alt = (145426 * (1 - (((288.16 - pres_alt * 0.001981) / 288.16)^5.2563 / ((273.16 + temp_C) / 288.16))^0.235))

Equations and approximations from "Axioms of Flight",

James Embree, Flight Information Publications,

St. Louis MO, 1984. ISBN 0-9601062-7-8

Approximation (good to 8000 feet density altitude):

  • Takeoff distance:

    • For fixed pitch prop, increase sea level standard day takeoff distance 15% for each 1000 foot increase in density altitude.

    • For constant speed prop, increase by 13%.

  • Climb rate

    • For fixed pitch prop, decrease sea level standard day climb rate 7.5% for each 1000 foot increase in density altitude.

    • For constant speed prop, decrease by 7%.

Example takeoff for fixed pitch prop:

  • dist_takeoff_dens_alt = dist_takeoff_sealevel * (1 + ((dens_alt / 1000) * 0.15))

(https://groups.google.com/g/rec.aviation.piloting/c/SDlMioBVqaA)

Examples


e_pilot_density_altitude(
    pres_alt               = 0
  , temp_C                 = 15
  , dist_takeoff_sea_level = 1000
  , climb_rate_sea_level   = 500
  , sw_propeller = c("fixed_pitch", "constant_speed")[1]
  )
#>       density_altitude  dist_takeoff_dens_alt    climb_rate_dens_alt 
#>                    "0"                 "1000"                  "500" 
#>               pres_alt                 temp_C dist_takeoff_sea_level 
#>                    "0"                   "15"                 "1000" 
#>   climb_rate_sea_level           sw_propeller 
#>                  "500"          "fixed_pitch" 
e_pilot_density_altitude(
    pres_alt               = 7170
  , temp_C                 = 30
  , dist_takeoff_sea_level = 770
  , climb_rate_sea_level   = 900
  , sw_propeller = c("fixed_pitch", "constant_speed")[1]
  )
#>       density_altitude  dist_takeoff_dens_alt    climb_rate_dens_alt 
#>                "10422"                 "1974"                  "197" 
#>               pres_alt                 temp_C dist_takeoff_sea_level 
#>                 "7170"                   "30"                  "770" 
#>   climb_rate_sea_level           sw_propeller 
#>                  "900"          "fixed_pitch" 
e_pilot_density_altitude(
    pres_alt               = 7170
  , temp_C                 = 30
  , dist_takeoff_sea_level = 770
  , climb_rate_sea_level   = 900
  , sw_propeller = c("fixed_pitch", "constant_speed")[2]
  )
#>       density_altitude  dist_takeoff_dens_alt    climb_rate_dens_alt 
#>                "10422"                 "1813"                  "243" 
#>               pres_alt                 temp_C dist_takeoff_sea_level 
#>                 "7170"                   "30"                  "770" 
#>   climb_rate_sea_level           sw_propeller 
#>                  "900"       "constant_speed" 


## Tables
# 1972 Piper Arrow II
dist_takeoff_sea_level <- 770
climb_rate_sea_level   <- 900
sw_propeller           <- c("fixed_pitch", "constant_speed")[2]

list_out <- list()
i_list <- 0

for (i_pres_alt in seq(0, 10000, by = 2000)) {
  ## i_pres_alt = 0
  for (i_temp_C in c(0, seq(15, 40, by = 5))) {
    ## i_temp_C = 0

    i_list <- i_list + 1

    list_out[[ i_list ]] <-
      e_pilot_density_altitude(
        pres_alt               = i_pres_alt
      , temp_C                 = i_temp_C
      , dist_takeoff_sea_level = dist_takeoff_sea_level
      , climb_rate_sea_level   = climb_rate_sea_level
      , sw_propeller           = sw_propeller
      )
  }
}

dat_out <-
  list_out %>%
  dplyr::bind_rows()
dat_out %>% print(n = 10)
#> # A tibble: 42 × 8
#>    density_altitude dist_takeof…¹ climb…² pres_…³ temp_C dist_…⁴ climb…⁵ sw_pr…⁶
#>    <chr>            <chr>         <chr>   <chr>   <chr>  <chr>   <chr>   <chr>  
#>  1 -1838            586           1016    0       0      770     900     consta…
#>  2 0                770           900     0       15     770     900     consta…
#>  3 587              829           863     0       20     770     900     consta…
#>  4 1161             886           827     0       25     770     900     consta…
#>  5 1724             943           791     0       30     770     900     consta…
#>  6 2275             998           757     0       35     770     900     consta…
#>  7 2816             1052          723     0       40     770     900     consta…
#>  8 659              836           859     2000    0      770     900     consta…
#>  9 2466             1017          745     2000    15     770     900     consta…
#> 10 3043             1075          708     2000    20     770     900     consta…
#> # … with 32 more rows, and abbreviated variable names ¹​dist_takeoff_dens_alt,
#> #   ²​climb_rate_dens_alt, ³​pres_alt, ⁴​dist_takeoff_sea_level,
#> #   ⁵​climb_rate_sea_level, ⁶​sw_propeller

# Note: pres_alt = pressure altitude at 29.92 inches Mg

# density altitude
dat_density_altitude <-
  dat_out %>%
  dplyr::select(
    density_altitude
  , pres_alt
  , temp_C
  ) %>%
  tidyr::pivot_wider(
    id_cols     = temp_C
  , names_from  = pres_alt
  , values_from = density_altitude
  )

# takeoff roll
dat_takeoff_roll <-
  dat_out %>%
  dplyr::select(
    dist_takeoff_dens_alt
  , pres_alt
  , temp_C
  ) %>%
  tidyr::pivot_wider(
    id_cols     = temp_C
  , names_from  = pres_alt
  , values_from = dist_takeoff_dens_alt
  )

# climb rate
dat_climbrate <-
  dat_out %>%
  dplyr::select(
    climb_rate_dens_alt
  , pres_alt
  , temp_C
  ) %>%
  tidyr::pivot_wider(
    id_cols     = temp_C
  , names_from  = pres_alt
  , values_from = climb_rate_dens_alt
  )

dat_density_altitude
#> # A tibble: 7 × 7
#>   temp_C `0`   `2000` `4000` `6000` `8000` `10000`
#>   <chr>  <chr> <chr>  <chr>  <chr>  <chr>  <chr>  
#> 1 0      -1838 659    3147   5628   8100   10564  
#> 2 15     0     2466   4924   7373   9815   12248  
#> 3 20     587   3043   5490   7930   10362  12785  
#> 4 25     1161  3607   6046   8476   10897  13311  
#> 5 30     1724  4161   6589   9010   11422  13826  
#> 6 35     2275  4703   7122   9533   11936  14331  
#> 7 40     2816  5234   7644   10046  12440  14826  
dat_takeoff_roll
#> # A tibble: 7 × 7
#>   temp_C `0`   `2000` `4000` `6000` `8000` `10000`
#>   <chr>  <chr> <chr>  <chr>  <chr>  <chr>  <chr>  
#> 1 0      586   836    1085   1333   1581   1827   
#> 2 15     770   1017   1263   1508   1752   1996   
#> 3 20     829   1075   1320   1564   1807   2050   
#> 4 25     886   1131   1375   1618   1861   2102   
#> 5 30     943   1186   1430   1672   1913   2154   
#> 6 35     998   1241   1483   1724   1965   2205   
#> 7 40     1052  1294   1535   1776   2015   2254   
dat_climbrate
#> # A tibble: 7 × 7
#>   temp_C `0`   `2000` `4000` `6000` `8000` `10000`
#>   <chr>  <chr> <chr>  <chr>  <chr>  <chr>  <chr>  
#> 1 0      1016  859    702    545    390    234    
#> 2 15     900   745    590    435    282    128    
#> 3 20     863   708    554    400    247    95     
#> 4 25     827   673    519    366    213    61     
#> 5 30     791   638    485    332    180    29     
#> 6 35     757   604    451    299    148    -3     
#> 7 40     723   570    418    267    116    -34