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.
Files changed (203) hide show
  1. {openap-2.4 → openap-2.5.0}/.github/workflows/build-publish.yml +12 -4
  2. {openap-2.4 → openap-2.5.0}/.gitignore +2 -1
  3. {openap-2.4 → openap-2.5.0}/PKG-INFO +58 -19
  4. {openap-2.4 → openap-2.5.0}/README.md +44 -12
  5. openap-2.5.0/openap/__init__.py +34 -0
  6. {openap-2.4 → openap-2.5.0}/openap/addon/bada3.py +120 -219
  7. {openap-2.4 → openap-2.5.0}/openap/addon/bada4.py +76 -125
  8. openap-2.5.0/openap/aero.py +414 -0
  9. openap-2.5.0/openap/backends/__init__.py +80 -0
  10. openap-2.5.0/openap/backends/casadi_backend.py +126 -0
  11. openap-2.5.0/openap/backends/jax_backend.py +121 -0
  12. openap-2.5.0/openap/backends/numpy_backend.py +110 -0
  13. openap-2.5.0/openap/backends/protocol.py +113 -0
  14. openap-2.5.0/openap/base.py +120 -0
  15. openap-2.5.0/openap/casadi.py +64 -0
  16. openap-2.5.0/openap/contrail.py +500 -0
  17. {openap-2.4 → openap-2.5.0}/openap/drag.py +113 -45
  18. openap-2.5.0/openap/emission.py +259 -0
  19. openap-2.5.0/openap/extra/__init__.py +96 -0
  20. {openap-2.4 → openap-2.5.0}/openap/extra/filters.py +11 -10
  21. openap-2.5.0/openap/extra/fuzzy.py +142 -0
  22. {openap-2.4 → openap-2.5.0}/openap/extra/nav.py +21 -22
  23. {openap-2.4 → openap-2.5.0}/openap/fuel.py +67 -37
  24. {openap-2.4 → openap-2.5.0}/openap/gen.py +52 -38
  25. openap-2.5.0/openap/geo.py +320 -0
  26. openap-2.5.0/openap/jax.py +71 -0
  27. {openap-2.4 → openap-2.5.0}/openap/kinematic.py +11 -13
  28. {openap-2.4 → openap-2.5.0}/openap/mass.py +13 -6
  29. {openap-2.4 → openap-2.5.0}/openap/phase.py +16 -20
  30. {openap-2.4 → openap-2.5.0}/openap/prop.py +26 -19
  31. {openap-2.4 → openap-2.5.0}/openap/thrust.py +90 -65
  32. {openap-2.4 → openap-2.5.0}/pyproject.toml +23 -14
  33. {openap-2.4 → openap-2.5.0}/scripts/gen_airport_database.py +1 -1
  34. {openap-2.4 → openap-2.5.0}/scripts/gen_engine_data_v27.py +1 -1
  35. {openap-2.4 → openap-2.5.0}/scripts/inspect_engine_ff_emission.py +1 -1
  36. openap-2.5.0/tests/test_aero.py +526 -0
  37. openap-2.5.0/tests/test_backends.py +549 -0
  38. openap-2.5.0/tests/test_contrail.py +413 -0
  39. openap-2.5.0/tests/test_geo.py +386 -0
  40. openap-2.5.0/tests/test_ndarrayconvert.py +204 -0
  41. openap-2.5.0/uv.lock +1605 -0
  42. openap-2.4/openap/__init__.py +0 -8
  43. openap-2.4/openap/base.py +0 -90
  44. openap-2.4/openap/casadi/__init__.py +0 -36
  45. openap-2.4/openap/casadi/aero_override.py +0 -383
  46. openap-2.4/openap/casadi/numpy_override.py +0 -9
  47. openap-2.4/openap/contrail.py +0 -129
  48. openap-2.4/openap/emission.py +0 -223
  49. openap-2.4/openap/extra/__init__.py +0 -61
  50. openap-2.4/openap/extra/aero.py +0 -403
  51. openap-2.4/openap/extra/fuzzy.py +0 -199
  52. openap-2.4/uv.lock +0 -1419
  53. {openap-2.4 → openap-2.5.0}/LICENSE +0 -0
  54. {openap-2.4 → openap-2.5.0}/examples/data/flight_a319_opensky.csv +0 -0
  55. {openap-2.4 → openap-2.5.0}/examples/data/flight_a320_qar.csv +0 -0
  56. {openap-2.4 → openap-2.5.0}/examples/example_fuel_emission_opensky_data.ipynb +0 -0
  57. {openap-2.4 → openap-2.5.0}/examples/example_fuel_qar_data.ipynb +0 -0
  58. {openap-2.4 → openap-2.5.0}/openap/addon/__init__.py +0 -0
  59. {openap-2.4 → openap-2.5.0}/openap/data/.gitignore +0 -0
  60. {openap-2.4 → openap-2.5.0}/openap/data/LICENSE +0 -0
  61. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/_synonym.csv +0 -0
  62. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a19n.yml +0 -0
  63. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a20n.yml +0 -0
  64. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a21n.yml +0 -0
  65. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a318.yml +0 -0
  66. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a319.yml +0 -0
  67. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a320.yml +0 -0
  68. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a321.yml +0 -0
  69. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a332.yml +0 -0
  70. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a333.yml +0 -0
  71. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a343.yml +0 -0
  72. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a359.yml +0 -0
  73. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/a388.yml +0 -0
  74. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b37m.yml +0 -0
  75. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b38m.yml +0 -0
  76. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b39m.yml +0 -0
  77. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b3xm.yml +0 -0
  78. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b734.yml +0 -0
  79. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b737.yml +0 -0
  80. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b738.yml +0 -0
  81. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b739.yml +0 -0
  82. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b744.yml +0 -0
  83. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b748.yml +0 -0
  84. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b752.yml +0 -0
  85. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b763.yml +0 -0
  86. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b772.yml +0 -0
  87. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b773.yml +0 -0
  88. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b77w.yml +0 -0
  89. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b788.yml +0 -0
  90. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/b789.yml +0 -0
  91. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/c550.yml +0 -0
  92. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/crj9.yml +0 -0
  93. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e145.yml +0 -0
  94. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e170.yml +0 -0
  95. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e190.yml +0 -0
  96. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e195.yml +0 -0
  97. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/e75l.yml +0 -0
  98. {openap-2.4 → openap-2.5.0}/openap/data/aircraft/glf6.yml +0 -0
  99. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/_synonym.csv +0 -0
  100. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a20n.yml +0 -0
  101. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a319.yml +0 -0
  102. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a320.yml +0 -0
  103. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a321.yml +0 -0
  104. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a332.yml +0 -0
  105. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a333.yml +0 -0
  106. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a343.yml +0 -0
  107. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a359.yml +0 -0
  108. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/a388.yml +0 -0
  109. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b38m.yml +0 -0
  110. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b734.yml +0 -0
  111. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b737.yml +0 -0
  112. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b738.yml +0 -0
  113. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b739.yml +0 -0
  114. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b744.yml +0 -0
  115. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b748.yml +0 -0
  116. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b752.yml +0 -0
  117. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b772.yml +0 -0
  118. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b77w.yml +0 -0
  119. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b788.yml +0 -0
  120. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/b789.yml +0 -0
  121. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/c550.yml +0 -0
  122. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/e190.yml +0 -0
  123. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/e195.yml +0 -0
  124. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/e75l.yml +0 -0
  125. {openap-2.4 → openap-2.5.0}/openap/data/dragpolar/glf6.yml +0 -0
  126. {openap-2.4 → openap-2.5.0}/openap/data/engine/engines.csv +0 -0
  127. {openap-2.4 → openap-2.5.0}/openap/data/fuel/fuel_models.csv +0 -0
  128. {openap-2.4 → openap-2.5.0}/openap/data/nav/airports.csv +0 -0
  129. {openap-2.4 → openap-2.5.0}/openap/data/nav/fix.dat +0 -0
  130. {openap-2.4 → openap-2.5.0}/openap/data/nav/nav.dat +0 -0
  131. {openap-2.4 → openap-2.5.0}/openap/data/wrap/_synonym.csv +0 -0
  132. {openap-2.4 → openap-2.5.0}/openap/data/wrap/a319.txt +0 -0
  133. {openap-2.4 → openap-2.5.0}/openap/data/wrap/a320.txt +0 -0
  134. {openap-2.4 → openap-2.5.0}/openap/data/wrap/a321.txt +0 -0
  135. {openap-2.4 → openap-2.5.0}/openap/data/wrap/a332.txt +0 -0
  136. {openap-2.4 → openap-2.5.0}/openap/data/wrap/a333.txt +0 -0
  137. {openap-2.4 → openap-2.5.0}/openap/data/wrap/a343.txt +0 -0
  138. {openap-2.4 → openap-2.5.0}/openap/data/wrap/a388.txt +0 -0
  139. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b737.txt +0 -0
  140. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b738.txt +0 -0
  141. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b739.txt +0 -0
  142. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b744.txt +0 -0
  143. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b752.txt +0 -0
  144. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b763.txt +0 -0
  145. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b77w.txt +0 -0
  146. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b788.txt +0 -0
  147. {openap-2.4 → openap-2.5.0}/openap/data/wrap/b789.txt +0 -0
  148. {openap-2.4 → openap-2.5.0}/openap/data/wrap/e190.txt +0 -0
  149. {openap-2.4 → openap-2.5.0}/openap/extra/statistics.py +2 -2
  150. {openap-2.4 → openap-2.5.0}/scripts/README.md +0 -0
  151. {openap-2.4 → openap-2.5.0}/scripts/acropole_aircraft_params.csv +0 -0
  152. {openap-2.4 → openap-2.5.0}/scripts/build_fuel_model.py +0 -0
  153. {openap-2.4 → openap-2.5.0}/scripts/db/airports.csv +0 -0
  154. {openap-2.4 → openap-2.5.0}/scripts/db/emission.csv +0 -0
  155. {openap-2.4 → openap-2.5.0}/scripts/db/engines.csv +0 -0
  156. {openap-2.4 → openap-2.5.0}/scripts/engine2.py +0 -0
  157. {openap-2.4 → openap-2.5.0}/scripts/extract.py +0 -0
  158. {openap-2.4 → openap-2.5.0}/scripts/fuel_flow_correction_factor.py +0 -0
  159. {openap-2.4 → openap-2.5.0}/scripts/gen_engine_cruise_perf.py +0 -0
  160. {openap-2.4 → openap-2.5.0}/scripts/input/civtfspec.csv +0 -0
  161. {openap-2.4 → openap-2.5.0}/scripts/input/civtfspec.xls +0 -0
  162. {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v23 (web).xlsx +0 -0
  163. {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v25a (web).xlsx +0 -0
  164. {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v27 (web).xlsx +0 -0
  165. {openap-2.4 → openap-2.5.0}/scripts/input/edb-emissions-databank v28B (web).xlsx +0 -0
  166. {openap-2.4 → openap-2.5.0}/scripts/input/engine_cruise_performance.csv +0 -0
  167. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a319.csv +0 -0
  168. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a320.csv +0 -0
  169. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a321.csv +0 -0
  170. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a332.csv +0 -0
  171. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a333.csv +0 -0
  172. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a343.csv +0 -0
  173. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/a388.csv +0 -0
  174. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b737.csv +0 -0
  175. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b738.csv +0 -0
  176. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b739.csv +0 -0
  177. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b744.csv +0 -0
  178. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b752.csv +0 -0
  179. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b763.csv +0 -0
  180. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b77w.csv +0 -0
  181. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b788.csv +0 -0
  182. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/b789.csv +0 -0
  183. {openap-2.4 → openap-2.5.0}/scripts/input/wrap/e190.csv +0 -0
  184. {openap-2.4 → openap-2.5.0}/scripts/plot_fuel_model.py +0 -0
  185. {openap-2.4 → openap-2.5.0}/scripts/test_acropole.py +0 -0
  186. {openap-2.4 → openap-2.5.0}/scripts/wrap_csv_to_fwf.py +0 -0
  187. {openap-2.4 → openap-2.5.0}/test/data/flight_phase_test.csv +0 -0
  188. {openap-2.4 → openap-2.5.0}/test/data/flight_phlab.csv +0 -0
  189. {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_08.csv +0 -0
  190. {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_10.csv +0 -0
  191. {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_12.csv +0 -0
  192. {openap-2.4 → openap-2.5.0}/test/flights/C550/phlab_20170320_14.csv +0 -0
  193. {openap-2.4 → openap-2.5.0}/test/test_actypes.py +0 -0
  194. {openap-2.4 → openap-2.5.0}/test/test_bada.py +0 -0
  195. {openap-2.4 → openap-2.5.0}/test/test_drag.py +0 -0
  196. {openap-2.4 → openap-2.5.0}/test/test_emission.py +0 -0
  197. {openap-2.4 → openap-2.5.0}/test/test_fuel.py +0 -0
  198. {openap-2.4 → openap-2.5.0}/test/test_kinematic.py +0 -0
  199. {openap-2.4 → openap-2.5.0}/test/test_nav.py +0 -0
  200. {openap-2.4 → openap-2.5.0}/test/test_phase.py +0 -0
  201. {openap-2.4 → openap-2.5.0}/test/test_prop.py +0 -0
  202. {openap-2.4 → openap-2.5.0}/test/test_thrust.py +0 -0
  203. {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
- release:
5
- types:
6
- - published
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,4 +1,5 @@
1
1
  tmp
2
+ .venv
2
3
 
3
4
  # Byte-compiled / optimized / DLL files
4
5
  __pycache__/
@@ -94,4 +95,4 @@ ENV/
94
95
 
95
96
 
96
97
  #vs code
97
- .vscode
98
+ .vscode
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openap
3
- Version: 2.4
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.9
19
- Requires-Dist: matplotlib>=3.1
20
- Requires-Dist: numpy>=1.24
21
- Requires-Dist: pandas>=1.2
22
- Requires-Dist: pyyaml>=5.1
23
- Requires-Dist: scipy>=1.7
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
- This repository contains the OpenAP model data and Python packages for aircraft performance and emission calculations.
35
+ [![PyPI version](https://img.shields.io/pypi/v/openap.svg)](https://pypi.org/project/openap/)
36
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/openap.svg)](https://pypi.org/project/openap/)
37
+ [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](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
- Examples:
89
+ Example:
77
90
 
78
91
  ```python
79
92
  import openap
80
93
 
81
- openap.prop.aircraft("A320")
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) # -> kg/s
100
+ ff = fuelflow.enroute(mass=60000, tas=250, alt=30000)
101
+ print(ff) # fuel flow: 0.92 (kg/s)
84
102
  ```
85
103
 
86
- The input parameters can be scalar, list, or ndarray. Most of the OpenAP methods' parameters are in aeronautical units, such as knots, feet, feet/min. The mass is always in SI units, i.e., kilograms.
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
- ## Symbolic Implementation for CasADi
118
+ ## Alternative Backends: CasADi and JAX
101
119
 
102
- The OpenAP model can also be used with the CasADi library for symbolic computations. The symbolic model is available in the `openap.casadi` package. For example, you can use the following code to create a symbolic model for fuel flow:
120
+ OpenAP supports multiple computational backends beyond NumPy:
103
121
 
104
- ```python
105
- from openap.casadi import FuelFlow
122
+ - **CasADi**: For symbolic computations and optimization
123
+ - **JAX**: For automatic differentiation and GPU acceleration
106
124
 
107
- fuelflow = FuelFlow()
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
- All the methods of `openap.casadi.FuelFlow()` are the same as those of `openap.FuelFlow()`, and they are now symbolic functions that can be used to compute fuel flow for given flight conditions in CasADi `DM`, `SX`, or `MX` types.
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
- How did we implement this? When the `casadi` module is initiated, a metaclass is used to replace the `sci` function from `numpy`, which overrides all the `numpy` functions with `casadi` functions. For more details, check the `openap/casadi/__init__.py` code.
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
- This repository contains the OpenAP model data and Python packages for aircraft performance and emission calculations.
3
+ [![PyPI version](https://img.shields.io/pypi/v/openap.svg)](https://pypi.org/project/openap/)
4
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/openap.svg)](https://pypi.org/project/openap/)
5
+ [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](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
- Examples:
57
+ Example:
52
58
 
53
59
  ```python
54
60
  import openap
55
61
 
56
- openap.prop.aircraft("A320")
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) # -> kg/s
68
+ ff = fuelflow.enroute(mass=60000, tas=250, alt=30000)
69
+ print(ff) # fuel flow: 0.92 (kg/s)
59
70
  ```
60
71
 
61
- The input parameters can be scalar, list, or ndarray. Most of the OpenAP methods' parameters are in aeronautical units, such as knots, feet, feet/min. The mass is always in SI units, i.e., kilograms.
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
- ## Symbolic Implementation for CasADi
86
+ ## Alternative Backends: CasADi and JAX
76
87
 
77
- The OpenAP model can also be used with the CasADi library for symbolic computations. The symbolic model is available in the `openap.casadi` package. For example, you can use the following code to create a symbolic model for fuel flow:
88
+ OpenAP supports multiple computational backends beyond NumPy:
78
89
 
79
- ```python
80
- from openap.casadi import FuelFlow
90
+ - **CasADi**: For symbolic computations and optimization
91
+ - **JAX**: For automatic differentiation and GPU acceleration
81
92
 
82
- fuelflow = FuelFlow()
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
- All the methods of `openap.casadi.FuelFlow()` are the same as those of `openap.FuelFlow()`, and they are now symbolic functions that can be used to compute fuel flow for given flight conditions in CasADi `DM`, `SX`, or `MX` types.
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
- How did we implement this? When the `casadi` module is initiated, a metaclass is used to replace the `sci` function from `numpy`, which overrides all the `numpy` functions with `casadi` functions. For more details, check the `openap/casadi/__init__.py` code.
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
+ ]