Skip to content

Allocation

jetfuelburn.utility.allocation

footprint_allocation_by_area

footprint_allocation_by_area(
    fuel_per_flight,
    size_factor_eco,
    size_factor_premiumeco,
    size_factor_business,
    size_factor_first,
    seats_eco,
    seats_premiumeco,
    seats_business,
    seats_first,
    load_factor_eco,
    load_factor_premiumeco,
    load_factor_business,
    load_factor_first,
)

Given the fuel burn per flight \(F\), the number of seats in each cabin class \(S_i\), the load factor in each cabin class \(L_i\) and the size factor of each cabin class \(s_i\), returns the fuel burn per passenger specific to each cabin class \(f_i\).

\[ f_i = \frac{1}{L_i} \frac{s_i F}{\sum_i s_i S_i} \]

where

Symbol Unit (eg.) Description
\(F\) kg Fuel burn per flight
\(f_i\) kg Fuel burn per passenger in seating class \(i\)
\(L_i\) dimensionless Load factor in seating class \(i\)
\(s_i\) dimensionless Size factor of seating class \(i\)
\(S_i\) dimensionless Number of seats in seating class \(i\)

Summing over the fuel burn of all seating classes, we again get the total fuel burn per flight \(F\):

\[ F = \sum_i f_i S_i L_i = \sum_i \frac{1}{L_i} \frac{s_i F}{\sum_i s_i S_i} S_i L_i = F \frac{\sum_i s_i}{\sum_i s_i} \]

The size factor of a class is defined as:

\[ s_i = \frac{A_i}{A_{economy}} \]

where \(A_i\) is the area occupied by a passenger in class \(i\) and \(A_{economy}\) is the area occupied by a passenger in economy class.

This approach is suggested by both ICAO and IATA as the "allocation by area" method.

Notes

IATA RP 1726 (Section 2.4.2) recommends the following size factors:

Economy Premium Economy Business First
Narrow-Body 1.0 1.00 1.5 1.5
Wide-Body 1.0 1.5 4.0 5.0
Warnings

If a certain seating class is not present, all related parameters (seats, size_factor, load_factor) should be set to 0.

References

Raises:

Type Description
ValueError

If fuel_per_flight < 0 or (load_factor_eco, load_factor_premiumeco, load_factor_business, load_factor_first) not between 0 and 1.

Parameters:

Name Type Description Default
fuel_per_flight float

Fuel burn per flight.

required
size_factor_eco float

Size factor for economy class (1 by definition).

required
size_factor_premiumeco float

Size factor for premium economy class.

required
size_factor_business float

Size factor for business class.

required
size_factor_first float

Size factor for first class.

required
seats_eco int

Number of seats in economy class.

required
seats_premiumeco int

Number of seats in premium economy class.

required
seats_business int

Number of seats in business class.

required
seats_first int

Number of seats in first class.

required
load_factor_eco float

Load factor for economy class (between 0 and 1).

required
load_factor_premiumeco float

Load factor for premium economy class (between 0 and 1).

required
load_factor_business float

Load factor for business class (between 0 and 1).

required
load_factor_first float

Load factor for first class (between 0 and 1).

required

Returns:

Type Description
dict[float, float, float, float]

Fuel burn per passenger per flight in economy, premium economy, business and first class.

Example

Editor (session: default)Run
from jetfuelburn import ureg
from jetfuelburn.utility.allocation import footprint_allocation_by_area
footprint_allocation_by_area(
    fuel_per_flight=14000*ureg.kg,
    size_factor_eco=1,
    size_factor_premiumeco=0,
    size_factor_business=1.5,
    size_factor_first=0,
    seats_eco=154,
    seats_premiumeco=0,
    seats_business=24,
    seats_first=0,
    load_factor_eco=0.9,
    load_factor_premiumeco=0,
    load_factor_business=0.5,
    load_factor_first=0,
)
OutputClear

Source code in jetfuelburn/utility/allocation.py
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
def footprint_allocation_by_area(
    fuel_per_flight: float,
    size_factor_eco: float,
    size_factor_premiumeco: float,
    size_factor_business: float,
    size_factor_first: float,
    seats_eco: int,
    seats_premiumeco: int,
    seats_business: int,
    seats_first: int,
    load_factor_eco: float,
    load_factor_premiumeco: float,
    load_factor_business: float,
    load_factor_first: float,
) -> dict[float, float, float, float]:
    r"""
    Given the fuel burn per flight $F$, the number of seats in each cabin class $S_i$,
    the load factor in each cabin class $L_i$ and the size factor of each cabin class $s_i$,
    returns the fuel burn per passenger specific to each cabin class $f_i$.

    $$
        f_i = \frac{1}{L_i} \frac{s_i F}{\sum_i s_i S_i}
    $$

    where

    | Symbol | Unit (eg.)    | Description                                  |
    | ------ | ------------- | -------------------------------------------- |
    | $F$    | kg            | Fuel burn per flight                         |
    | $f_i$  | kg            | Fuel burn per passenger in seating class $i$ |
    | $L_i$  | dimensionless | Load factor in seating class $i$             |
    | $s_i$  | dimensionless | Size factor of seating class $i$             |
    | $S_i$  | dimensionless | Number of seats in seating class $i$         |

    Summing over the fuel burn of all seating classes, we again get the total fuel burn per flight $F$:

    $$
    F = \sum_i f_i S_i L_i = \sum_i \frac{1}{L_i} \frac{s_i F}{\sum_i s_i S_i} S_i L_i = F \frac{\sum_i s_i}{\sum_i s_i}
    $$

    The _size factor_ of a class is defined as:

    $$
        s_i = \frac{A_i}{A_{economy}}
    $$

    where $A_i$ is the area occupied by a passenger in class $i$ and
    $A_{economy}$ is the area occupied by a passenger in economy class.

    This approach is suggested by both ICAO and IATA as the "allocation by area" method.

    Notes
    -----
    IATA RP 1726 (Section 2.4.2) recommends the following size factors:

    |             | Economy | Premium Economy | Business | First |
    | ----------- | ------- | --------------- | -------- | ----- |
    | __Narrow-Body__ | 1.0     | 1.00            | 1.5      | 1.5   |
    | __Wide-Body__   | 1.0     | 1.5             | 4.0      | 5.0   |

    Warnings
    --------
    If a certain seating class is not present, all related parameters
    (`seats`, `size_factor`, `load_factor`) should be set to 0.

    References
    --------
    - [IATA Recommended Practice RP 1726: Passenger CO2 Calculation Methodology](https://web.archive.org/web/20230526103741/https://www.iata.org/contentassets/139d686fa8f34c4ba7a41f7ba3e026e7/iata-rp-1726_passenger-co2.pdf)
    - [ICAO Carbon Emissions Calculator Methodology (Version 13.1)](https://web.archive.org/web/20240826103513/https://applications.icao.int/icec/Methodology%20ICAO%20Carbon%20Emissions%20Calculator_v13_Final.pdf)
    - [World Bank Policy Research Working Paper 6471 _"Calculating the Carbon Footprint from Different Classes of Air Travel"_](https://documents1.worldbank.org/curated/en/141851468168853188/pdf/WPS6471.pdf)

    Raises
    ------
    ValueError
        If `fuel_per_flight` < 0 or
        (`load_factor_eco`, `load_factor_premiumeco`, `load_factor_business`, `load_factor_first`) not between 0 and 1.

    Parameters
    ----------
    fuel_per_flight : float
        Fuel burn per flight.
    size_factor_eco : float
        Size factor for economy class (1 by definition).
    size_factor_premiumeco : float
        Size factor for premium economy class.
    size_factor_business : float
        Size factor for business class.
    size_factor_first : float
        Size factor for first class.
    seats_eco : int
        Number of seats in economy class.
    seats_premiumeco : int
        Number of seats in premium economy class.
    seats_business : int
        Number of seats in business class.
    seats_first : int
        Number of seats in first class.
    load_factor_eco : float
        Load factor for economy class (between 0 and 1).
    load_factor_premiumeco : float
        Load factor for premium economy class (between 0 and 1).
    load_factor_business : float
        Load factor for business class (between 0 and 1).
    load_factor_first : float
        Load factor for first class (between 0 and 1).

    Returns
    -------
    dict[float, float, float, float]
        Fuel burn per passenger per flight in economy, premium economy, business and first class.

    Example
    -------
    ```pyodide install="jetfuelburn"
    from jetfuelburn import ureg
    from jetfuelburn.utility.allocation import footprint_allocation_by_area
    footprint_allocation_by_area(
        fuel_per_flight=14000*ureg.kg,
        size_factor_eco=1,
        size_factor_premiumeco=0,
        size_factor_business=1.5,
        size_factor_first=0,
        seats_eco=154,
        seats_premiumeco=0,
        seats_business=24,
        seats_first=0,
        load_factor_eco=0.9,
        load_factor_premiumeco=0,
        load_factor_business=0.5,
        load_factor_first=0,
    )
    ```
    """

    if not fuel_per_flight > 0:
        raise ValueError("Fuel burn per flight must be >0.")
    if not (0 <= load_factor_eco <= 1):
        raise ValueError("Load factor (economy class) must be between 0 and 1.")
    if not (0 <= load_factor_premiumeco <= 1):
        raise ValueError("Load factor (premium economy class) must be between 0 and 1.")
    if not (0 <= load_factor_business <= 1):
        raise ValueError("Load factor (business class) must be between 0 and 1.")
    if not (0 <= load_factor_first <= 1):
        raise ValueError("Load factor (first class) must be between 0 and 1.")

    if size_factor_eco != 1 or seats_eco == 0:
        raise ValueError("Economy class must have size factor 1 and at least one seat.")
    fuel_eco = (
        (1 / load_factor_eco)
        * (size_factor_eco * fuel_per_flight)
        / (
            size_factor_eco * seats_eco
            + size_factor_premiumeco * seats_premiumeco
            + size_factor_business * seats_business
            + size_factor_first * seats_first
        )
    )
    if load_factor_premiumeco == 0 or seats_premiumeco == 0:
        fuel_premiumeco = 0
    else:
        fuel_premiumeco = (
            (1 / load_factor_premiumeco)
            * (size_factor_premiumeco * fuel_per_flight)
            / (
                size_factor_eco * seats_eco
                + size_factor_premiumeco * seats_premiumeco
                + size_factor_business * seats_business
                + size_factor_first * seats_first
            )
        )
    if load_factor_business == 0 or seats_business == 0:
        fuel_business = 0
    else:
        fuel_business = (
            (1 / load_factor_business)
            * (size_factor_business * fuel_per_flight)
            / (
                size_factor_eco * seats_eco
                + size_factor_premiumeco * seats_premiumeco
                + size_factor_business * seats_business
                + size_factor_first * seats_first
            )
        )
    if load_factor_first == 0 or seats_first == 0:
        fuel_first = 0
    else:
        fuel_first = (
            (1 / load_factor_first)
            * (size_factor_first * fuel_per_flight)
            / (
                size_factor_eco * seats_eco
                + size_factor_premiumeco * seats_premiumeco
                + size_factor_business * seats_business
                + size_factor_first * seats_first
            )
        )

    return {
        "fuel_eco": fuel_eco,
        "fuel_premiumeco": fuel_premiumeco,
        "fuel_business": fuel_business,
        "fuel_first": fuel_first,
    }