CoCiP Benchmark¶
Running CoCiP periodically on a fixed scenario helps identify both intended and unintended changes. Early in its development, pycontrails was evaluated against existing implementations of CoCiP [Schumann, 2012]. Because bug fixes and model improvements have since changed its results, this page compares pycontrails releases against one another. Every release runs the identical CoCiP simulation, so changes in model output and runtime can be traced directly to the release that made them.
The simulation covers 19,326 flights over Europe on 30 January 2020, using the ADS-B flight trajectories of GAIA [Teoh et al., 2024] and ERA5 model-level meteorology. January 2020 predates the COVID-19 decline in air traffic, and according to ERA5, the 30th had the largest share of persistent contrail regions over Europe of any day that month (select_day.py). For each release, the benchmark records CoCiP’s output for every flight alongside the totals across all flights (run_benchmark.py).
The benchmark uses the CoCiP parameter choices of [Teoh et al., 2024]. Some
parameters, such as max_age, have existed since the first pycontrails release, while others
were only added later, such as unterstrasser_ice_survival_fraction in 0.50.1. Each release runs
with the parameters available in it.
Every run uses a c3-highmem-4 Google Compute Engine instance (4 vCPUs, 32 GB of memory), with the latest Python version the release supports and the package dependencies available on its release date.
When a release fails on some flights, for example because it does not support their aircraft type,
the benchmark excludes them. If the skipped flights cannot be identified in advance, the benchmark
applies a patch from a later release instead. The table below lists the number of excluded flights,
and benchmark_results.csv lists the patches
applied. Releases 0.9.0 and 0.15.1 are omitted entirely, as they fail on all or nearly all flights.
Releases before 0.11.0 have no Fleet-mode and run CoCiP one flight at a time, which would take
about 40 hours for all flights. Instead, these releases run on a fixed random sample of 2,000
flights, and their totals and runtime are scaled by 19,326 / 2,000. When 0.11.0 runs on the same
sample, its scaled energy forcing is 5.5% above its result on all flights, which indicates the size
of the sampling error.
Releases 0.19.1 to 0.28.2 use too much memory to run Fleet-mode on all flights at once, so they
run it on 64 batches of flights, one after another. Their runtime is the sum of the batch runtimes.
In the plots below, the numbered markers link to a row in the table of changes.
Results¶
Flights excluded¶
Number of flights excluded because the release fails on them.
Totals¶
Total energy forcing, contrail length times age, length of flight segments forming persistent contrails, and fuel burn over all flights evaluated with CoCiP.
Energy forcing per flight¶
Distribution of the energy forcing per flight for selected releases. Each histogram shows the fraction of the flights run in each bin. Flights with energy forcing between -1010 and 1010 J, which include those with none, are left out.
Runtime Performance¶
Time spent running CoCiP, not counting loading the flights and meteorology, and peak memory of the process. Runtimes of releases run on the sample are scaled to all flights.
Changes¶
# |
Release |
Release date |
Change |
|---|---|---|---|
1 |
0.2.0 |
2021-11-16 |
|
2 |
0.3.0 |
2021-11-23 |
|
3 |
0.6.0 |
2021-12-03 |
|
4 |
0.7.1 |
2021-12-11 |
|
5 |
0.8.1 |
2022-01-11 |
|
6 |
0.11.0 |
2022-01-31 |
|
7 |
0.12.3 |
2022-02-16 |
|
8 |
0.16.0 |
2022-03-10 |
|
9 |
0.17.1 |
2022-03-10 |
|
10 |
0.18.0 |
2022-03-21 |
|
11 |
0.19.1 |
2022-04-06 |
|
12 |
0.20.2 |
2022-04-25 |
|
13 |
0.22.0 |
2022-05-27 |
|
14 |
0.25.9 |
2022-08-12 |
|
15 |
0.26.0 |
2022-09-15 |
|
16 |
0.27.0 |
2022-09-27 |
|
17 |
0.28.3 |
2022-10-13 |
|
18 |
0.28.9 |
2022-11-14 |
|
19 |
0.29.0 |
2022-11-18 |
|
20 |
0.29.1 |
2022-11-25 |
|
21 |
0.31.4 |
2022-12-08 |
|
22 |
0.33.0 |
2023-01-25 |
|
23 |
0.36.0 |
2023-02-24 |
|
24 |
0.40.0 |
2023-04-14 |
|
25 |
0.43.0 |
2023-06-23 |
|
26 |
0.44.0 |
2023-06-23 |
|
27 |
0.46.0 |
2023-08-16 |
|
28 |
0.47.3 |
2023-10-20 |
|
29 |
0.49.0 |
2023-11-21 |
|
30 |
0.50.1 |
2024-04-08 |
|
31 |
0.50.2 |
2024-04-17 |
|
32 |
0.51.0 |
2024-05-23 |
|
33 |
0.51.1 |
2024-05-31 |
|
34 |
0.52.2 |
2024-08-01 |
|
35 |
0.54.3 |
2024-11-21 |
|
36 |
0.54.7 |
2025-02-19 |
|
37 |
0.55.0 |
2025-09-02 |
|
38 |
0.59.1 |
2025-11-19 |
|
39 |
0.60.1 |
2025-12-15 |
|
40 |
0.60.2 |
2026-01-15 |
|
41 |
0.60.5 |
2026-03-31 |
|
42 |
0.61.0 |
2026-04-15 |
|
43 |
0.63.0 |
2026-04-30 |
|
44 |
0.63.1 |
2026-05-28 |
|
All results¶
Consecutive releases with equal results share a row, with the range of their runtimes and peak
memory. benchmark_results.csv has every
field of every release’s summary, including the Python and dependency versions, the machine, and
the sample details.
Releases |
Flights dropped |
Energy forcing (J) |
Persistent length (km) |
Fuel burn (kg) |
Runtime (s) |
Peak memory (GB) |
|---|---|---|---|---|---|---|
0.1.0 |
2,474 |
9.853e+17 |
— |
4.029e+07 |
29,789 |
18.8 |
0.2.0 |
3,169 |
9.826e+17 |
5.314e+06 |
3.996e+07 |
29,878 |
19.0 |
0.3.0 |
3,169 |
9.746e+17 |
4.951e+06 |
3.996e+07 |
21,095 |
15.8 |
0.5.0 |
3,169 |
9.747e+17 |
4.951e+06 |
3.996e+07 |
21,709 |
15.8 |
0.6.0 |
3,169 |
9.634e+17 |
4.951e+06 |
3.996e+07 |
21,308 |
15.5 |
0.7.1 – 0.8.0 |
2,474 |
9.661e+17 |
5.011e+06 |
4.029e+07 |
21,915–23,929 |
15.5 |
0.8.1 |
2,725 |
9.661e+17 |
5.011e+06 |
4.025e+07 |
24,958 |
15.5 |
0.11.0 – 0.12.0 |
971 |
7.495e+17 |
— |
3.792e+07 |
316–322 |
26.8 |
0.12.3 – 0.14.0 |
971 |
9.400e+17 |
— |
3.792e+07 |
326–337 |
26.7–26.9 |
0.15.0 – 0.15.3 |
971 |
9.396e+17 |
— |
3.790e+07 |
313–338 |
26.9 |
0.16.0 – 0.17.0 |
971 |
1.013e+18 |
— |
4.349e+07 |
337–342 |
28.3 |
0.17.1 |
935 |
1.013e+18 |
— |
4.354e+07 |
336 |
28.3 |
0.18.0 – 0.19.0 |
935 |
1.017e+18 |
— |
4.354e+07 |
323–327 |
28.1 |
0.19.1 – 0.20.1 |
935 |
1.017e+18 |
5.506e+06 |
4.354e+07 |
1,038–1,052 |
21.4 |
0.20.2 – 0.20.3 |
370 |
1.017e+18 |
5.506e+06 |
4.362e+07 |
1,022–1,048 |
22.0 |
0.21.0 – 0.22.4 |
370 |
1.024e+18 |
5.506e+06 |
4.362e+07 |
964–1,342 |
21.9–22.0 |
0.23.0 – 0.25.2 |
370 |
1.024e+18 |
5.506e+06 |
4.362e+07 |
977–1,229 |
21.3–22.0 |
0.25.3 – 0.25.8 |
370 |
1.020e+18 |
5.506e+06 |
4.362e+07 |
969–988 |
21.3 |
0.25.9 – 0.26.0 |
0 |
1.001e+18 |
5.507e+06 |
4.363e+07 |
526–1,007 |
21.4–24.0 |
0.27.0 – 0.28.2 |
0 |
1.536e+18 |
5.648e+06 |
4.363e+07 |
528–553 |
21.9–22.0 |
0.28.3 – 0.28.7 |
0 |
1.534e+18 |
5.648e+06 |
4.363e+07 |
192–195 |
27.9–28.1 |
0.28.8 |
0 |
1.534e+18 |
5.648e+06 |
4.363e+07 |
188 |
28.0 |
0.28.9 |
0 |
2.418e+18 |
5.648e+06 |
4.363e+07 |
181 |
25.6 |
0.29.0 |
2,862 |
1.851e+18 |
5.487e+06 |
4.147e+07 |
166 |
24.0 |
0.29.1 – 0.31.3 |
114 |
1.886e+18 |
5.639e+06 |
4.362e+07 |
182–190 |
24.9–25.1 |
0.31.4 – 0.32.2 |
114 |
1.472e+18 |
5.639e+06 |
4.362e+07 |
178–192 |
24.5–24.7 |
0.33.0 – 0.35.2 |
114 |
1.526e+18 |
5.801e+06 |
4.192e+07 |
174–183 |
24.2–25.5 |
0.36.0 – 0.41.0 |
114 |
1.481e+18 |
5.653e+06 |
4.071e+07 |
123–202 |
22.3–25.5 |
0.42.0 – 0.42.2 |
114 |
1.482e+18 |
5.655e+06 |
4.073e+07 |
131–132 |
22.3–22.4 |
0.43.0 |
114 |
9.799e+17 |
5.249e+06 |
4.073e+07 |
116 |
19.0 |
0.44.0 |
114 |
9.648e+17 |
5.304e+06 |
3.971e+07 |
91 |
19.4 |
0.44.1 – 0.45.0 |
114 |
9.648e+17 |
5.304e+06 |
3.971e+07 |
97–100 |
20.0–20.2 |
0.46.0 – 0.47.2 |
114 |
9.736e+17 |
5.852e+06 |
3.971e+07 |
97–99 |
19.2–19.8 |
0.47.3 |
114 |
9.425e+17 |
5.852e+06 |
3.971e+07 |
101 |
19.2 |
0.48.0 – 0.48.1 |
114 |
9.425e+17 |
5.852e+06 |
3.971e+07 |
98–104 |
18.4–18.5 |
0.49.0 – 0.49.3 |
114 |
9.717e+17 |
5.936e+06 |
4.141e+07 |
99–109 |
18.5–18.6 |
0.49.4 – 0.50.0 |
114 |
9.714e+17 |
5.934e+06 |
4.132e+07 |
104–107 |
18.6 |
0.50.1 |
114 |
7.659e+17 |
5.934e+06 |
4.132e+07 |
104 |
18.4 |
0.50.2 |
115 |
7.583e+17 |
5.916e+06 |
4.090e+07 |
107 |
18.4 |
0.51.0 |
115 |
1.026e+18 |
5.908e+06 |
4.090e+07 |
106 |
18.8 |
0.51.1 – 0.52.0 |
115 |
1.048e+18 |
5.964e+06 |
4.183e+07 |
108–110 |
18.8 |
0.52.1 |
115 |
1.048e+18 |
5.964e+06 |
4.183e+07 |
103 |
18.8 |
0.52.2 – 0.54.2 |
114 |
1.053e+18 |
5.967e+06 |
6.479e+07 |
90–114 |
15.7–15.8 |
0.54.3 – 0.54.6 |
1 |
1.085e+18 |
5.991e+06 |
6.708e+07 |
110–116 |
15.5–16.1 |
0.54.7 |
1 |
1.098e+18 |
5.991e+06 |
6.708e+07 |
110 |
15.4 |
0.54.8 – 0.54.11 |
1 |
1.100e+18 |
5.991e+06 |
6.711e+07 |
110–113 |
15.6–16.3 |
0.54.12 – 0.58.0 |
1 |
1.101e+18 |
5.998e+06 |
6.711e+07 |
113–128 |
15.7–16.3 |
0.59.0 |
1 |
1.101e+18 |
5.998e+06 |
6.711e+07 |
114 |
15.5 |
0.59.1 – 0.60.0 |
771 |
8.331e+17 |
5.734e+06 |
6.375e+07 |
110 |
14.7–14.8 |
0.60.1 |
1 |
8.373e+17 |
5.998e+06 |
6.711e+07 |
113 |
15.2 |
0.60.2 |
1 |
1.154e+18 |
5.998e+06 |
6.711e+07 |
141 |
16.3 |
0.60.3 |
1 |
1.155e+18 |
5.998e+06 |
6.711e+07 |
144 |
15.4 |
0.60.4 |
1 |
1.148e+18 |
5.998e+06 |
6.711e+07 |
145 |
15.4 |
0.60.5 |
1 |
1.253e+18 |
6.039e+06 |
6.829e+07 |
148 |
15.1 |
0.61.0 – 0.62.0 |
8 |
5.141e+17 |
6.025e+06 |
6.684e+07 |
239–244 |
15.0 |
0.63.0 |
1 |
5.131e+17 |
6.012e+06 |
6.654e+07 |
256 |
15.3 |
0.63.1 – 0.63.3 |
1 |
8.336e+17 |
6.012e+06 |
6.654e+07 |
248–252 |
15.1–15.2 |
0.63.4 – 0.64.0 |
1 |
8.395e+17 |
6.012e+06 |
6.654e+07 |
240–248 |
15.2–15.3 |
0.65.0 |
1 |
8.396e+17 |
6.012e+06 |
6.654e+07 |
238 |
15.3 |
0.66.0 |
1 |
8.396e+17 |
6.012e+06 |
6.654e+07 |
242 |
15.2 |