openap 2.4__tar.gz → 2.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openap-2.4 → openap-2.5.0}/.github/workflows/build-publish.yml +12 -4
- {openap-2.4 → openap-2.5.0}/.gitignore +2 -1
- {openap-2.4 → openap-2.5.0}/PKG-INFO +58 -19
- {openap-2.4 → openap-2.5.0}/README.md +44 -12
- openap-2.5.0/openap/__init__.py +34 -0
- {openap-2.4 → openap-2.5.0}/openap/addon/bada3.py +120 -219
- {openap-2.4 → openap-2.5.0}/openap/addon/bada4.py +76 -125
- openap-2.5.0/openap/aero.py +414 -0
- openap-2.5.0/openap/backends/__init__.py +80 -0
- openap-2.5.0/openap/backends/casadi_backend.py +126 -0
- openap-2.5.0/openap/backends/jax_backend.py +121 -0
- openap-2.5.0/openap/backends/numpy_backend.py +110 -0
- openap-2.5.0/openap/backends/protocol.py +113 -0
- openap-2.5.0/openap/base.py +120 -0
- openap-2.5.0/openap/casadi.py +64 -0
- openap-2.5.0/openap/contrail.py +500 -0
- {openap-2.4 → openap-2.5.0}/openap/drag.py +113 -45
- openap-2.5.0/openap/emission.py +259 -0
- openap-2.5.0/openap/extra/__init__.py +96 -0
- {openap-2.4 → openap-2.5.0}/openap/extra/filters.py +11 -10
- openap-2.5.0/openap/extra/fuzzy.py +142 -0
- {openap-2.4 → openap-2.5.0}/openap/extra/nav.py +21 -22
- {openap-2.4 → openap-2.5.0}/openap/fuel.py +67 -37
- {openap-2.4 → openap-2.5.0}/openap/gen.py +52 -38
- openap-2.5.0/openap/geo.py +320 -0
- openap-2.5.0/openap/jax.py +71 -0
- {openap-2.4 → openap-2.5.0}/openap/kinematic.py +11 -13
- {openap-2.4 → openap-2.5.0}/openap/mass.py +13 -6
- {openap-2.4 → openap-2.5.0}/openap/phase.py +16 -20
- {openap-2.4 → openap-2.5.0}/openap/prop.py +26 -19
- {openap-2.4 → openap-2.5.0}/openap/thrust.py +90 -65
- {openap-2.4 → openap-2.5.0}/pyproject.toml +23 -14
- {openap-2.4 → openap-2.5.0}/scripts/gen_airport_database.py +1 -1
- {openap-2.4 → openap-2.5.0}/scripts/gen_engine_data_v27.py +1 -1
- {openap-2.4 → openap-2.5.0}/scripts/inspect_engine_ff_emission.py +1 -1
- openap-2.5.0/tests/test_aero.py +526 -0
- openap-2.5.0/tests/test_backends.py +549 -0
- openap-2.5.0/tests/test_contrail.py +413 -0
- openap-2.5.0/tests/test_geo.py +386 -0
- openap-2.5.0/tests/test_ndarrayconvert.py +204 -0
- openap-2.5.0/uv.lock +1605 -0
- openap-2.4/openap/__init__.py +0 -8
- openap-2.4/openap/base.py +0 -90
- openap-2.4/openap/casadi/__init__.py +0 -36
- openap-2.4/openap/casadi/aero_override.py +0 -383
- openap-2.4/openap/casadi/numpy_override.py +0 -9
- openap-2.4/openap/contrail.py +0 -129
- openap-2.4/openap/emission.py +0 -223
- openap-2.4/openap/extra/__init__.py +0 -61
- openap-2.4/openap/extra/aero.py +0 -403
- openap-2.4/openap/extra/fuzzy.py +0 -199
- openap-2.4/uv.lock +0 -1419
- {openap-2.4 → openap-2.5.0}/LICENSE +0 -0
- {openap-2.4 → openap-2.5.0}/examples/data/flight_a319_opensky.csv +0 -0
- {openap-2.4 → openap-2.5.0}/examples/data/flight_a320_qar.csv +0 -0
- {openap-2.4 → openap-2.5.0}/examples/example_fuel_emission_opensky_data.ipynb +0 -0
- {openap-2.4 → openap-2.5.0}/examples/example_fuel_qar_data.ipynb +0 -0
- {openap-2.4 → openap-2.5.0}/openap/addon/__init__.py +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/.gitignore +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/LICENSE +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/_synonym.csv +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a19n.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a20n.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a21n.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a318.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a319.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a320.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a321.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a332.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a333.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a343.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a359.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a388.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b37m.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b38m.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b39m.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b3xm.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b734.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b737.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b738.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b739.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b744.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b748.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b752.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b763.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b772.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b773.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b77w.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b788.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b789.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/c550.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/crj9.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e145.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e170.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e190.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e195.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e75l.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/aircraft/glf6.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/_synonym.csv +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a20n.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a319.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a320.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a321.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a332.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a333.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a343.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a359.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a388.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b38m.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b734.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b737.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b738.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b739.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b744.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b748.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b752.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b772.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b77w.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b788.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b789.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/c550.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/e190.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/e195.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/e75l.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/glf6.yml +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/engine/engines.csv +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/fuel/fuel_models.csv +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/nav/airports.csv +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/nav/fix.dat +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/nav/nav.dat +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/_synonym.csv +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/a319.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/a320.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/a321.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/a332.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/a333.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/a343.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/a388.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b737.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b738.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b739.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b744.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b752.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b763.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b77w.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b788.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/b789.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/data/wrap/e190.txt +0 -0
- {openap-2.4 → openap-2.5.0}/openap/extra/statistics.py +2 -2
- {openap-2.4 → openap-2.5.0}/scripts/README.md +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/acropole_aircraft_params.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/build_fuel_model.py +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/db/airports.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/db/emission.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/db/engines.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/engine2.py +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/extract.py +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/fuel_flow_correction_factor.py +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/gen_engine_cruise_perf.py +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/civtfspec.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/civtfspec.xls +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v23 (web).xlsx +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v25a (web).xlsx +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v27 (web).xlsx +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v28B (web).xlsx +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/engine_cruise_performance.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a319.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a320.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a321.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a332.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a333.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a343.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a388.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b737.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b738.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b739.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b744.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b752.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b763.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b77w.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b788.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b789.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/input/wrap/e190.csv +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/plot_fuel_model.py +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/test_acropole.py +0 -0
- {openap-2.4 → openap-2.5.0}/scripts/wrap_csv_to_fwf.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/data/flight_phase_test.csv +0 -0
- {openap-2.4 → openap-2.5.0}/test/data/flight_phlab.csv +0 -0
- {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_08.csv +0 -0
- {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_10.csv +0 -0
- {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_12.csv +0 -0
- {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_14.csv +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_actypes.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_bada.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_drag.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_emission.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_fuel.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_kinematic.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_nav.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_phase.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_prop.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_thrust.py +0 -0
- {openap-2.4 → openap-2.5.0}/test/test_trajectory.py +0 -0
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
name: build and publish
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
-
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
7
|
workflow_dispatch:
|
|
8
8
|
|
|
9
|
+
permissions:
|
|
10
|
+
contents: write
|
|
11
|
+
|
|
9
12
|
jobs:
|
|
10
13
|
deploy:
|
|
11
14
|
runs-on: ubuntu-latest
|
|
@@ -30,4 +33,9 @@ jobs:
|
|
|
30
33
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
31
34
|
with:
|
|
32
35
|
user: __token__
|
|
33
|
-
password: ${{ secrets.PYPI_API_TOKEN_OPENAP }}
|
|
36
|
+
password: ${{ secrets.PYPI_API_TOKEN_OPENAP }}
|
|
37
|
+
|
|
38
|
+
- name: Create GitHub Release
|
|
39
|
+
uses: softprops/action-gh-release@v2
|
|
40
|
+
with:
|
|
41
|
+
generate_release_notes: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openap
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0
|
|
4
4
|
Summary: Open Aircraft Performance Model (OpenAP) in Python
|
|
5
5
|
Project-URL: homepage, https://openap.dev
|
|
6
6
|
Project-URL: repository, https://github.com/junzis/openap
|
|
@@ -15,17 +15,30 @@ Classifier: Intended Audience :: Science/Research
|
|
|
15
15
|
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
17
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
|
-
Requires-Python: >=3.
|
|
19
|
-
Requires-Dist: matplotlib>=3.
|
|
20
|
-
Requires-Dist: numpy>=1
|
|
21
|
-
Requires-Dist: pandas>=
|
|
22
|
-
Requires-Dist: pyyaml>=
|
|
23
|
-
Requires-Dist: scipy>=1.
|
|
18
|
+
Requires-Python: >=3.11
|
|
19
|
+
Requires-Dist: matplotlib>=3.8
|
|
20
|
+
Requires-Dist: numpy>=2.1
|
|
21
|
+
Requires-Dist: pandas>=2.0
|
|
22
|
+
Requires-Dist: pyyaml>=6.0
|
|
23
|
+
Requires-Dist: scipy>=1.14
|
|
24
|
+
Provides-Extra: all
|
|
25
|
+
Requires-Dist: casadi>=3.6; extra == 'all'
|
|
26
|
+
Requires-Dist: jax>=0.4; extra == 'all'
|
|
27
|
+
Provides-Extra: casadi
|
|
28
|
+
Requires-Dist: casadi>=3.6; extra == 'casadi'
|
|
29
|
+
Provides-Extra: jax
|
|
30
|
+
Requires-Dist: jax>=0.4; extra == 'jax'
|
|
24
31
|
Description-Content-Type: text/markdown
|
|
25
32
|
|
|
26
33
|
# OpenAP: Open Aircraft Performance Model and Toolkit
|
|
27
34
|
|
|
28
|
-
|
|
35
|
+
[](https://pypi.org/project/openap/)
|
|
36
|
+
[](https://pypi.org/project/openap/)
|
|
37
|
+
[](https://www.gnu.org/licenses/lgpl-3.0)
|
|
38
|
+
|
|
39
|
+
Open-source aircraft performance model and toolkit for Python. Calculate aircraft performance, fuel consumption, and emissions for air transportation studies and simulations.
|
|
40
|
+
|
|
41
|
+
**Requirements:** Python 3.11+
|
|
29
42
|
|
|
30
43
|
## 🕮 User Guide
|
|
31
44
|
|
|
@@ -73,17 +86,22 @@ The OpenAP Python library includes the following packages:
|
|
|
73
86
|
- `phase`: Module provides `FlightPhase()` class for determining flight phases.
|
|
74
87
|
- `gen`: Module provides `FlightGenerator()` class for trajectory generation.
|
|
75
88
|
|
|
76
|
-
|
|
89
|
+
Example:
|
|
77
90
|
|
|
78
91
|
```python
|
|
79
92
|
import openap
|
|
80
93
|
|
|
81
|
-
|
|
94
|
+
# Get aircraft properties
|
|
95
|
+
aircraft = openap.prop.aircraft("A320")
|
|
96
|
+
print(aircraft["mtow"]) # max takeoff weight: 78000 (kg)
|
|
97
|
+
|
|
98
|
+
# Calculate fuel flow during cruise
|
|
82
99
|
fuelflow = openap.FuelFlow("A320")
|
|
83
|
-
fuelflow.enroute(mass, tas, alt)
|
|
100
|
+
ff = fuelflow.enroute(mass=60000, tas=250, alt=30000)
|
|
101
|
+
print(ff) # fuel flow: 0.92 (kg/s)
|
|
84
102
|
```
|
|
85
103
|
|
|
86
|
-
|
|
104
|
+
**Units:** Input parameters can be scalar, list, or ndarray. Speeds are in knots, altitudes in feet, vertical rates in feet/min. Mass is in kilograms (SI).
|
|
87
105
|
|
|
88
106
|
### Add-ons
|
|
89
107
|
|
|
@@ -97,19 +115,40 @@ fuelflow = bada4.FuelFlow()
|
|
|
97
115
|
|
|
98
116
|
The methods and attributes of `openap.addon.bada4.FuelFlow()` are the same as those of `openap.FuelFlow()`.
|
|
99
117
|
|
|
100
|
-
##
|
|
118
|
+
## Alternative Backends: CasADi and JAX
|
|
101
119
|
|
|
102
|
-
|
|
120
|
+
OpenAP supports multiple computational backends beyond NumPy:
|
|
103
121
|
|
|
104
|
-
|
|
105
|
-
|
|
122
|
+
- **CasADi**: For symbolic computations and optimization
|
|
123
|
+
- **JAX**: For automatic differentiation and GPU acceleration
|
|
106
124
|
|
|
107
|
-
|
|
125
|
+
### Installation
|
|
126
|
+
|
|
127
|
+
Install with optional backend support:
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
pip install openap[casadi] # CasADi backend
|
|
131
|
+
pip install openap[jax] # JAX backend
|
|
132
|
+
pip install openap[all] # Both backends
|
|
108
133
|
```
|
|
109
134
|
|
|
110
|
-
|
|
135
|
+
### Usage
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
# CasADi backend
|
|
139
|
+
import openap.casadi as oc
|
|
140
|
+
|
|
141
|
+
fuelflow = oc.FuelFlow("A320")
|
|
142
|
+
fuelflow.enroute(mass, tas, alt) # works with CasADi DM, SX, or MX types
|
|
143
|
+
|
|
144
|
+
# JAX backend
|
|
145
|
+
import openap.jax as oj
|
|
146
|
+
|
|
147
|
+
fuelflow = oj.FuelFlow("A320")
|
|
148
|
+
fuelflow.enroute(mass, tas, alt) # works with JAX arrays
|
|
149
|
+
```
|
|
111
150
|
|
|
112
|
-
|
|
151
|
+
The API is identical to the standard `openap` module. The backends are implemented using a protocol-based architecture in `openap/backends/`.
|
|
113
152
|
|
|
114
153
|
## Citing OpenAP
|
|
115
154
|
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
# OpenAP: Open Aircraft Performance Model and Toolkit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://pypi.org/project/openap/)
|
|
4
|
+
[](https://pypi.org/project/openap/)
|
|
5
|
+
[](https://www.gnu.org/licenses/lgpl-3.0)
|
|
6
|
+
|
|
7
|
+
Open-source aircraft performance model and toolkit for Python. Calculate aircraft performance, fuel consumption, and emissions for air transportation studies and simulations.
|
|
8
|
+
|
|
9
|
+
**Requirements:** Python 3.11+
|
|
4
10
|
|
|
5
11
|
## 🕮 User Guide
|
|
6
12
|
|
|
@@ -48,17 +54,22 @@ The OpenAP Python library includes the following packages:
|
|
|
48
54
|
- `phase`: Module provides `FlightPhase()` class for determining flight phases.
|
|
49
55
|
- `gen`: Module provides `FlightGenerator()` class for trajectory generation.
|
|
50
56
|
|
|
51
|
-
|
|
57
|
+
Example:
|
|
52
58
|
|
|
53
59
|
```python
|
|
54
60
|
import openap
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
# Get aircraft properties
|
|
63
|
+
aircraft = openap.prop.aircraft("A320")
|
|
64
|
+
print(aircraft["mtow"]) # max takeoff weight: 78000 (kg)
|
|
65
|
+
|
|
66
|
+
# Calculate fuel flow during cruise
|
|
57
67
|
fuelflow = openap.FuelFlow("A320")
|
|
58
|
-
fuelflow.enroute(mass, tas, alt)
|
|
68
|
+
ff = fuelflow.enroute(mass=60000, tas=250, alt=30000)
|
|
69
|
+
print(ff) # fuel flow: 0.92 (kg/s)
|
|
59
70
|
```
|
|
60
71
|
|
|
61
|
-
|
|
72
|
+
**Units:** Input parameters can be scalar, list, or ndarray. Speeds are in knots, altitudes in feet, vertical rates in feet/min. Mass is in kilograms (SI).
|
|
62
73
|
|
|
63
74
|
### Add-ons
|
|
64
75
|
|
|
@@ -72,19 +83,40 @@ fuelflow = bada4.FuelFlow()
|
|
|
72
83
|
|
|
73
84
|
The methods and attributes of `openap.addon.bada4.FuelFlow()` are the same as those of `openap.FuelFlow()`.
|
|
74
85
|
|
|
75
|
-
##
|
|
86
|
+
## Alternative Backends: CasADi and JAX
|
|
76
87
|
|
|
77
|
-
|
|
88
|
+
OpenAP supports multiple computational backends beyond NumPy:
|
|
78
89
|
|
|
79
|
-
|
|
80
|
-
|
|
90
|
+
- **CasADi**: For symbolic computations and optimization
|
|
91
|
+
- **JAX**: For automatic differentiation and GPU acceleration
|
|
81
92
|
|
|
82
|
-
|
|
93
|
+
### Installation
|
|
94
|
+
|
|
95
|
+
Install with optional backend support:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
pip install openap[casadi] # CasADi backend
|
|
99
|
+
pip install openap[jax] # JAX backend
|
|
100
|
+
pip install openap[all] # Both backends
|
|
83
101
|
```
|
|
84
102
|
|
|
85
|
-
|
|
103
|
+
### Usage
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
# CasADi backend
|
|
107
|
+
import openap.casadi as oc
|
|
108
|
+
|
|
109
|
+
fuelflow = oc.FuelFlow("A320")
|
|
110
|
+
fuelflow.enroute(mass, tas, alt) # works with CasADi DM, SX, or MX types
|
|
111
|
+
|
|
112
|
+
# JAX backend
|
|
113
|
+
import openap.jax as oj
|
|
114
|
+
|
|
115
|
+
fuelflow = oj.FuelFlow("A320")
|
|
116
|
+
fuelflow.enroute(mass, tas, alt) # works with JAX arrays
|
|
117
|
+
```
|
|
86
118
|
|
|
87
|
-
|
|
119
|
+
The API is identical to the standard `openap` module. The backends are implemented using a protocol-based architecture in `openap/backends/`.
|
|
88
120
|
|
|
89
121
|
## Citing OpenAP
|
|
90
122
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from .aero import Aero
|
|
2
|
+
from .backends import CasadiBackend, JaxBackend, NumpyBackend, get_backend
|
|
3
|
+
from .geo import Geo
|
|
4
|
+
from .drag import Drag
|
|
5
|
+
from .emission import Emission
|
|
6
|
+
from . import aero
|
|
7
|
+
from .extra import filters, nav, statistics
|
|
8
|
+
from . import geo
|
|
9
|
+
from .fuel import FuelFlow
|
|
10
|
+
from .gen import FlightGenerator
|
|
11
|
+
from .kinematic import WRAP
|
|
12
|
+
from .phase import FlightPhase
|
|
13
|
+
from .thrust import Thrust
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"WRAP",
|
|
17
|
+
"Aero",
|
|
18
|
+
"CasadiBackend",
|
|
19
|
+
"Drag",
|
|
20
|
+
"Emission",
|
|
21
|
+
"FlightGenerator",
|
|
22
|
+
"FlightPhase",
|
|
23
|
+
"FuelFlow",
|
|
24
|
+
"Geo",
|
|
25
|
+
"JaxBackend",
|
|
26
|
+
"NumpyBackend",
|
|
27
|
+
"Thrust",
|
|
28
|
+
"aero",
|
|
29
|
+
"filters",
|
|
30
|
+
"geo",
|
|
31
|
+
"get_backend",
|
|
32
|
+
"nav",
|
|
33
|
+
"statistics",
|
|
34
|
+
]
|