pyBADA 0.1.6__tar.gz → 0.1.8__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 (154) hide show
  1. {pybada-0.1.6 → pybada-0.1.8}/PKG-INFO +17 -17
  2. {pybada-0.1.6 → pybada-0.1.8}/README.md +1 -1
  3. pybada-0.1.8/docs/source/API_reference/badaAircraft.rst +7 -0
  4. pybada-0.1.8/docs/source/API_reference/myTypes.rst +7 -0
  5. pybada-0.1.8/docs/source/API_reference/trajectorySegments.rst +7 -0
  6. pybada-0.1.8/docs/source/_templates/footer.html +10 -0
  7. {pybada-0.1.6 → pybada-0.1.8}/docs/source/conf.py +1 -1
  8. {pybada-0.1.6 → pybada-0.1.8}/docs/source/pyBADA.rst +4 -1
  9. {pybada-0.1.6 → pybada-0.1.8}/examples/combinedSlopeAndDestination.py +12 -15
  10. pybada-0.1.8/examples/fuelFlow.py +215 -0
  11. {pybada-0.1.6 → pybada-0.1.8}/examples/initialMass.py +14 -14
  12. {pybada-0.1.6 → pybada-0.1.8}/examples/optimumSpeedAndAltitude.py +15 -15
  13. {pybada-0.1.6 → pybada-0.1.8}/examples/trajectoryAC.py +101 -101
  14. {pybada-0.1.6 → pybada-0.1.8}/examples/trajectoryAC_GPS.py +100 -100
  15. {pybada-0.1.6 → pybada-0.1.8}/examples/trajectoryHELI.py +30 -30
  16. {pybada-0.1.6 → pybada-0.1.8}/pyproject.toml +16 -16
  17. pybada-0.1.8/src/pyBADA/TCL.py +3341 -0
  18. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/aircraft.py +13 -13
  19. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/atmosphere.py +91 -60
  20. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/bada3.py +189 -190
  21. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/bada4.py +272 -252
  22. pybada-0.1.8/src/pyBADA/badaAircraft.py +35 -0
  23. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/badaH.py +201 -201
  24. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/configuration.py +50 -0
  25. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/conversions.py +22 -18
  26. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/geodesic.py +19 -19
  27. pybada-0.1.8/src/pyBADA/myTypes.py +204 -0
  28. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/trajectoryPrediction.py +11 -11
  29. pybada-0.1.6/src/pyBADA/TCL.py → pybada-0.1.8/src/pyBADA/trajectorySegments.py +182 -187
  30. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/utils.py +43 -38
  31. pybada-0.1.8/tests/atmosphereTest.py +1261 -0
  32. pybada-0.1.6/docs/source/_templates/footer.html +0 -10
  33. pybada-0.1.6/tests/atmosphereTest.py +0 -768
  34. {pybada-0.1.6 → pybada-0.1.8}/.github/workflows/lint.yml +0 -0
  35. {pybada-0.1.6 → pybada-0.1.8}/.github/workflows/pytest.yml +0 -0
  36. {pybada-0.1.6 → pybada-0.1.8}/.github/workflows/release.yml +0 -0
  37. {pybada-0.1.6 → pybada-0.1.8}/.github/workflows/sphinx.yml +0 -0
  38. {pybada-0.1.6 → pybada-0.1.8}/.gitignore +0 -0
  39. {pybada-0.1.6 → pybada-0.1.8}/.pre-commit-config.yaml +0 -0
  40. {pybada-0.1.6 → pybada-0.1.8}/AMENDMENT_TO_EUPL_license.md +0 -0
  41. {pybada-0.1.6 → pybada-0.1.8}/AUTHORS +0 -0
  42. {pybada-0.1.6 → pybada-0.1.8}/LICENCE.txt +0 -0
  43. {pybada-0.1.6 → pybada-0.1.8}/docs/Makefile +0 -0
  44. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/TCL.rst +0 -0
  45. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/aircraft.rst +0 -0
  46. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/atmosphere.rst +0 -0
  47. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/bada3.rst +0 -0
  48. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/bada4.rst +0 -0
  49. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/badaH.rst +0 -0
  50. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/configuration.rst +0 -0
  51. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/constants.rst +0 -0
  52. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/conversions.rst +0 -0
  53. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/flightTrajectory.rst +0 -0
  54. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/geodesic.rst +0 -0
  55. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/magnetic.rst +0 -0
  56. {pybada-0.1.6 → pybada-0.1.8}/docs/source/API_reference/trajectoryPrediction.rst +0 -0
  57. {pybada-0.1.6 → pybada-0.1.8}/docs/source/_static/css/custom.css +0 -0
  58. {pybada-0.1.6 → pybada-0.1.8}/docs/source/_static/default_thumbnail.png +0 -0
  59. {pybada-0.1.6 → pybada-0.1.8}/docs/source/_static/pyBADA_architecture.png +0 -0
  60. {pybada-0.1.6 → pybada-0.1.8}/docs/source/architecture.rst +0 -0
  61. {pybada-0.1.6 → pybada-0.1.8}/docs/source/getting-started.rst +0 -0
  62. {pybada-0.1.6 → pybada-0.1.8}/docs/source/history.rst +0 -0
  63. {pybada-0.1.6 → pybada-0.1.8}/docs/source/index.rst +0 -0
  64. {pybada-0.1.6 → pybada-0.1.8}/docs/source/userManual.rst +0 -0
  65. {pybada-0.1.6 → pybada-0.1.8}/docs/source/user_manual/examples.rst +0 -0
  66. {pybada-0.1.6 → pybada-0.1.8}/docs/source/user_manual/introduction.rst +0 -0
  67. {pybada-0.1.6 → pybada-0.1.8}/examples/BADAData.py +0 -0
  68. {pybada-0.1.6 → pybada-0.1.8}/examples/GALLERY_HEADER.rst +0 -0
  69. {pybada-0.1.6 → pybada-0.1.8}/examples/fileParser.py +0 -0
  70. {pybada-0.1.6 → pybada-0.1.8}/examples/geodesicCalculations.py +0 -0
  71. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/BADA.GPF +0 -0
  72. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/BZJT__.APF +0 -0
  73. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/BZJT__.OPF +0 -0
  74. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/BZJT__.PTD +0 -0
  75. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/BZJT__.PTF +0 -0
  76. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/GA____.APF +0 -0
  77. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/GA____.OPF +0 -0
  78. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/GA____.PTD +0 -0
  79. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/GA____.PTF +0 -0
  80. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2H___.APF +0 -0
  81. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2H___.OPF +0 -0
  82. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2H___.PTD +0 -0
  83. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2H___.PTF +0 -0
  84. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2M___.APF +0 -0
  85. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2M___.OPF +0 -0
  86. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2M___.PTD +0 -0
  87. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J2M___.PTF +0 -0
  88. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J4H___.APF +0 -0
  89. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J4H___.OPF +0 -0
  90. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J4H___.PTD +0 -0
  91. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/J4H___.PTF +0 -0
  92. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/ReleaseSummary +0 -0
  93. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/SYNONYM.NEW +0 -0
  94. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/TP2M__.APF +0 -0
  95. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/TP2M__.OPF +0 -0
  96. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/TP2M__.PTD +0 -0
  97. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA3/DUMMY/TP2M__.PTF +0 -0
  98. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/ACM_BADA4.xsd +0 -0
  99. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST.ATF +0 -0
  100. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST.xml +0 -0
  101. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA+20.PTD +0 -0
  102. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA+20.PTF +0 -0
  103. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA.PTD +0 -0
  104. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA.PTF +0 -0
  105. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP.ATF +0 -0
  106. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP.xml +0 -0
  107. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA+20.PTD +0 -0
  108. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA+20.PTF +0 -0
  109. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA.PTD +0 -0
  110. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA.PTF +0 -0
  111. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/LRC.OPT +0 -0
  112. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/MEC.OPT +0 -0
  113. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/MRC.OPT +0 -0
  114. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TBP/OPTALT.OPT +0 -0
  115. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN.ATF +0 -0
  116. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN.xml +0 -0
  117. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA+20.PTD +0 -0
  118. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA+20.PTF +0 -0
  119. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA.PTD +0 -0
  120. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA.PTF +0 -0
  121. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/ECON.OPT +0 -0
  122. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/LRC.OPT +0 -0
  123. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/MEC.OPT +0 -0
  124. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/MRC.OPT +0 -0
  125. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/OPTALT.OPT +0 -0
  126. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus.ATF +0 -0
  127. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus.xml +0 -0
  128. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA+20.PTD +0 -0
  129. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA+20.PTF +0 -0
  130. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA.PTD +0 -0
  131. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA.PTF +0 -0
  132. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/ECON.OPT +0 -0
  133. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/LRC.OPT +0 -0
  134. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/MEC.OPT +0 -0
  135. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/MRC.OPT +0 -0
  136. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/OPTALT.OPT +0 -0
  137. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/GPF.xml +0 -0
  138. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADA4/DUMMY/GPF_BADA4.xsd +0 -0
  139. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/DUMH.ATF +0 -0
  140. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/DUMH.xml +0 -0
  141. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA+20.PTD +0 -0
  142. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA+20.PTF +0 -0
  143. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA.PTD +0 -0
  144. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA.PTF +0 -0
  145. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/LRC.OPT +0 -0
  146. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/MEC.OPT +0 -0
  147. {pybada-0.1.6 → pybada-0.1.8}/src/aircraft/BADAH/DUMMY/DUMH/MRC.OPT +0 -0
  148. {pybada-0.1.6 → pybada-0.1.8}/src/data/magneticDeclinationGridData.json +0 -0
  149. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/__init__.py +0 -0
  150. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/constants.py +0 -0
  151. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/flightTrajectory.py +0 -0
  152. {pybada-0.1.6 → pybada-0.1.8}/src/pyBADA/magnetic.py +0 -0
  153. {pybada-0.1.6 → pybada-0.1.8}/tests/load_test.py +0 -0
  154. {pybada-0.1.6 → pybada-0.1.8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyBADA
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Summary: Aircraft performance modelling, trajectory prediction and optimisation, and visualisation with EUROCONTROL's BADA.
5
5
  Project-URL: Homepage, https://github.com/eurocontrol-bada/pybada
6
6
  Author-email: Henrich Glaser-Opitz <henrich.glaser-opitz@eurocontrol.int>, Antonio Vivace <antonio.vivace@eurocontrol.int>
@@ -9,25 +9,25 @@ License-File: AUTHORS
9
9
  License-File: LICENCE.txt
10
10
  Classifier: License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)
11
11
  Classifier: Programming Language :: Python :: 3
12
- Requires-Python: >=3.12
13
- Requires-Dist: numpy>=2.3.2
14
- Requires-Dist: pandas>=2.3.1
15
- Requires-Dist: scipy>=1.16.1
12
+ Requires-Python: >=3.12.3
13
+ Requires-Dist: numpy>=2.4.2
14
+ Requires-Dist: pandas>=3.0.0
15
+ Requires-Dist: scipy>=1.17.0
16
16
  Requires-Dist: simplekml>=1.3.6
17
- Requires-Dist: xarray>=2025.7.1
18
- Requires-Dist: xlsxwriter>=3.2.5
17
+ Requires-Dist: xarray>=2026.1.0
18
+ Requires-Dist: xlsxwriter>=3.2.9
19
19
  Provides-Extra: dev
20
- Requires-Dist: build; extra == 'dev'
20
+ Requires-Dist: build==1.4.0; extra == 'dev'
21
21
  Requires-Dist: folium==0.20.0; extra == 'dev'
22
- Requires-Dist: matplotlib==3.10.5; extra == 'dev'
23
- Requires-Dist: pre-commit==4.2.0; extra == 'dev'
24
- Requires-Dist: pytest==8.4.1; extra == 'dev'
22
+ Requires-Dist: matplotlib==3.10.8; extra == 'dev'
23
+ Requires-Dist: pre-commit==4.5.1; extra == 'dev'
24
+ Requires-Dist: pytest==9.0.2; extra == 'dev'
25
25
  Requires-Dist: readthedocs-sphinx-search>=0.3.2; extra == 'dev'
26
- Requires-Dist: ruff==0.11.5; extra == 'dev'
27
- Requires-Dist: sphinx-gallery==0.19.0; extra == 'dev'
28
- Requires-Dist: sphinx-rtd-theme==3.0.2; extra == 'dev'
29
- Requires-Dist: sphinx==8.2.3; extra == 'dev'
30
- Requires-Dist: twine; extra == 'dev'
26
+ Requires-Dist: ruff==0.15.0; extra == 'dev'
27
+ Requires-Dist: sphinx-gallery==0.20.0; extra == 'dev'
28
+ Requires-Dist: sphinx-rtd-theme==3.1.0; extra == 'dev'
29
+ Requires-Dist: sphinx==9.1.0; extra == 'dev'
30
+ Requires-Dist: twine==6.2.0; extra == 'dev'
31
31
  Description-Content-Type: text/markdown
32
32
 
33
33
  # pyBADA
@@ -37,7 +37,7 @@ Description-Content-Type: text/markdown
37
37
  <a href="https://pypi.org/project/pyBADA"><img alt="Released on PyPi" src="https://img.shields.io/pypi/v/pyBADA.svg"></a> <img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dw/pybada"> ![Python 3.12](https://img.shields.io/badge/Python-3.12-3776AB.svg?logo=python&logoColor=white)
38
38
  <a href="https://github.com/eurocontrol-bada/pybada"><img alt="Code style: black" src="https://img.shields.io/badge/code%20style-black-000000.svg"></a>
39
39
  [![Run unit tests](https://github.com/eurocontrol-bada/pybada/actions/workflows/pytest.yml/badge.svg)](https://github.com/eurocontrol-bada/pybada/actions/workflows/pytest.yml)
40
- ![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/pyBADA_dev?style=social&label=Follow%20%40pyBADA_dev)
40
+ [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/pyBADA_dev?style=social&label=Follow%20%40pyBADA_dev)](https://x.com/intent/follow?screen_name=pyBADA_dev)
41
41
 
42
42
  This package provides aircraft performance modelling, trajectory prediction and optimisation, and visualisation with [BADA](https://www.eurocontrol.int/model/bada) in Python.
43
43
 
@@ -5,7 +5,7 @@
5
5
  <a href="https://pypi.org/project/pyBADA"><img alt="Released on PyPi" src="https://img.shields.io/pypi/v/pyBADA.svg"></a> <img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dw/pybada"> ![Python 3.12](https://img.shields.io/badge/Python-3.12-3776AB.svg?logo=python&logoColor=white)
6
6
  <a href="https://github.com/eurocontrol-bada/pybada"><img alt="Code style: black" src="https://img.shields.io/badge/code%20style-black-000000.svg"></a>
7
7
  [![Run unit tests](https://github.com/eurocontrol-bada/pybada/actions/workflows/pytest.yml/badge.svg)](https://github.com/eurocontrol-bada/pybada/actions/workflows/pytest.yml)
8
- ![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/pyBADA_dev?style=social&label=Follow%20%40pyBADA_dev)
8
+ [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/pyBADA_dev?style=social&label=Follow%20%40pyBADA_dev)](https://x.com/intent/follow?screen_name=pyBADA_dev)
9
9
 
10
10
  This package provides aircraft performance modelling, trajectory prediction and optimisation, and visualisation with [BADA](https://www.eurocontrol.int/model/bada) in Python.
11
11
 
@@ -0,0 +1,7 @@
1
+ BadaAircraft
2
+ ============
3
+
4
+ .. automodule:: pyBADA.badaAircraft
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -0,0 +1,7 @@
1
+ myTypes
2
+ =======
3
+
4
+ .. automodule:: pyBADA.myTypes
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -0,0 +1,7 @@
1
+ TrajectorySegments
2
+ ==================
3
+
4
+ .. automodule:: pyBADA.TrajectorySegments
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -0,0 +1,10 @@
1
+ {% extends "!footer.html" %}
2
+ {%- block contentinfo %}
3
+ {{ super }}
4
+
5
+
6
+
7
+ &copy; Copyright 2024 - 2026 <img src="https://ansperformance.eu/nvctr/reference/figures/euctrl-logo-wide.svg" width="112" alt="EUROCONTROL"></a> <br>
8
+
9
+
10
+ {% endblock %}
@@ -52,4 +52,4 @@ modindex_common_prefix = ["pyBADA."]
52
52
  html_theme = "sphinx_rtd_theme"
53
53
  html_static_path = ["_static"]
54
54
 
55
- copyright = "2024, EUROCONTROL"
55
+ copyright = "2024 - 2026, EUROCONTROL"
@@ -9,11 +9,14 @@ API reference
9
9
  API_reference/bada3
10
10
  API_reference/bada4
11
11
  API_reference/badaH
12
+ API_reference/badaAircraft
12
13
  API_reference/configuration
13
14
  API_reference/constants
14
15
  API_reference/conversions
15
16
  API_reference/flightTrajectory
16
17
  API_reference/geodesic
17
18
  API_reference/magnetic
19
+ API_reference/myTypes
18
20
  API_reference/TCL
19
- API_reference/trajectoryPrediction
21
+ API_reference/trajectoryPrediction
22
+ API_reference/trajectorySegments
@@ -12,25 +12,25 @@ from pyBADA import geodesic as geo
12
12
 
13
13
  # ——— Inputs for required–slope example ———
14
14
  waypoint1 = {
15
- 'latitude': 52.2367946579192,
16
- 'longitude': 20.7129809016565,
17
- 'altitude': 3500.0 # ft
15
+ "latitude": 52.2367946579192,
16
+ "longitude": 20.7129809016565,
17
+ "altitude": 3500.0, # ft
18
18
  }
19
19
  waypoint2 = {
20
- 'latitude': 52.1697191213371,
21
- 'longitude': 20.9519554471793,
22
- 'altitude': 412.0 # ft
20
+ "latitude": 52.1697191213371,
21
+ "longitude": 20.9519554471793,
22
+ "altitude": 412.0, # ft
23
23
  }
24
24
 
25
25
  # ——— Inputs for destination–point example ———
26
26
  initial_waypoint = waypoint1.copy()
27
- slope_deg = 3.5 # degrees (positive = climb)
28
- distance_nm = 12.0 # nautical miles
29
- bearing_deg = 75.0 # degrees from true north
27
+ slope_deg = 3.5 # degrees (positive = climb)
28
+ distance_nm = 12.0 # nautical miles
29
+ bearing_deg = 75.0 # degrees from true north
30
30
 
31
31
  # ——— Run both examples for each algorithm ———
32
32
  for algo_name, Algo in [
33
- ("Vincenty", geo.Vincenty),
33
+ ("Vincenty", geo.Vincenty),
34
34
  ("Haversine", geo.Haversine),
35
35
  ("RhumbLine", geo.RhumbLine),
36
36
  ]:
@@ -45,12 +45,9 @@ for algo_name, Algo in [
45
45
 
46
46
  # 2) Destination point given a slope, distance & bearing
47
47
  dest_wp = Algo.destinationPointApplyingSlopeForDistance(
48
- initial_waypoint,
49
- slope_deg,
50
- distance_nm,
51
- bearing_deg
48
+ initial_waypoint, slope_deg, distance_nm, bearing_deg
52
49
  )
53
50
  print("Destination waypoint applying slope & distance:")
54
51
  print(f" Latitude = {dest_wp['latitude']:.6f}°")
55
52
  print(f" Longitude = {dest_wp['longitude']:.6f}°")
56
- print(f" Altitude = {dest_wp['altitude']:.2f} ft")
53
+ print(f" Altitude = {dest_wp['altitude']:.2f} ft")
@@ -0,0 +1,215 @@
1
+ """
2
+ Fuel Flow Calculation
3
+ ========================
4
+
5
+ Example calculation of aircraft fuel flow in descent
6
+
7
+ """
8
+
9
+ from math import sin
10
+
11
+ import matplotlib.pyplot as plt
12
+ import numpy as np
13
+
14
+ from pyBADA import atmosphere as atm
15
+ from pyBADA import constants as const
16
+ from pyBADA import conversions as conv
17
+ from pyBADA import utils
18
+ from pyBADA.bada3 import Bada3Aircraft
19
+ from pyBADA.bada4 import Bada4Aircraft
20
+
21
+ # create an aircraft
22
+ ACList = [
23
+ Bada4Aircraft(badaVersion="DUMMY", acName="Dummy-TWIN"),
24
+ Bada3Aircraft(badaVersion="DUMMY", acName="J2M"),
25
+ ]
26
+
27
+ # deviation from ISA temperature
28
+ deltaTemp = 0
29
+
30
+ # definition of altitude range
31
+ fl_array = np.arange(0, 401, 10)
32
+ altitude_array = conv.ft2m(fl_array * 100)
33
+
34
+ # --- collect per-aircraft series here ---
35
+ series = [] # list of dicts: {"label": str, "alt_ft": list[float], "ff": list[float]}
36
+
37
+ for AC in ACList:
38
+ # define aircraft mass - here as reference mass
39
+ mass = AC.MREF
40
+
41
+ # get the original speed schedule for descent for this aircraft
42
+ [Vdes1, Vdes2, Mdes] = AC.flightEnvelope.getSpeedSchedule(phase="Descent")
43
+
44
+ # crossover altitude
45
+ crossAlt = atm.crossOver(cas=Vdes2, Mach=Mdes)
46
+
47
+ label = f"({AC.BADAFamilyName}) {AC.acName.strip('_')} (BADA {getattr(AC, 'BADAVersion')}) {mass} kg"
48
+
49
+ alt_ft_vals = []
50
+ ff_vals = []
51
+
52
+ print(
53
+ f"\n=== {AC.__class__.__name__} | BADA {AC.BADAVersion} | Mass: {mass:.0f} kg ==="
54
+ )
55
+ print(
56
+ f"{'FL':>4} {'Alt(ft)':>8} {'Cfg':>3} {'M':>6} {'FF (kg/s)':>10}"
57
+ )
58
+ print("-" * 39)
59
+
60
+ for alt in altitude_array:
61
+ # atmosphere properties
62
+ theta, delta, sigma = atm.atmosphereProperties(
63
+ h=alt, deltaTemp=deltaTemp
64
+ )
65
+
66
+ # determine the speed acording to BADA ARPM
67
+ [cas, speedUpdated] = AC.ARPM.descentSpeed(
68
+ h=alt, mass=mass, theta=theta, delta=delta, deltaTemp=deltaTemp
69
+ )
70
+ # general speed conversion
71
+ [M, CAS, TAS] = atm.convertSpeed(
72
+ v=conv.ms2kt(cas),
73
+ speedType="CAS",
74
+ theta=theta,
75
+ delta=delta,
76
+ sigma=sigma,
77
+ )
78
+
79
+ # determine the aerodynamic configuration if necesary
80
+ config = AC.flightEnvelope.getConfig(
81
+ h=alt, phase="Descent", v=CAS, mass=mass, deltaTemp=deltaTemp
82
+ )
83
+
84
+ # calculate Energy Share Factor depending if aircraft is flying constant M or CAS (based on crossover altitude)
85
+ if alt < crossAlt:
86
+ ESF = AC.esf(
87
+ h=alt, flightEvolution="constCAS", M=M, deltaTemp=deltaTemp
88
+ )
89
+ else:
90
+ ESF = AC.esf(
91
+ h=alt, flightEvolution="constM", M=M, deltaTemp=deltaTemp
92
+ )
93
+
94
+ # =====
95
+ # BADA4
96
+ # =====
97
+ if AC.BADAFamily.BADA4:
98
+ # =================================================================================
99
+ # for altitudes where aircraft descends on 3degree slope in AP and LD configuration
100
+ # =================================================================================
101
+ if config == "AP" or config == "LD":
102
+ gamma = -3.0
103
+ temp_const = (theta * const.temp_0) / (
104
+ theta * const.temp_0 - deltaTemp
105
+ )
106
+ ROCD_gamma = sin(conv.deg2rad(gamma)) * TAS * (1 / temp_const)
107
+
108
+ n = 1.0
109
+ [HLid, LG] = AC.flightEnvelope.getAeroConfig(config=config)
110
+ CL = AC.CL(M=M, delta=delta, mass=mass, nz=n)
111
+ CD = AC.CD(M=M, CL=CL, HLid=HLid, LG=LG)
112
+ Drag = AC.D(M=M, delta=delta, CD=CD)
113
+ Thrust = (ROCD_gamma * mass * const.g) * temp_const / (
114
+ ESF * TAS
115
+ ) + Drag
116
+ CT = AC.CT(Thrust=Thrust, delta=delta)
117
+ ff = AC.ff(
118
+ CT=CT, delta=delta, theta=theta, M=M, deltaTemp=deltaTemp
119
+ )
120
+
121
+ # =============================================================
122
+ # for altitudes where aircraft descends in IDLE engine settings
123
+ # =============================================================
124
+ else:
125
+ ff = AC.ff(
126
+ rating="LIDL",
127
+ delta=delta,
128
+ theta=theta,
129
+ M=M,
130
+ deltaTemp=deltaTemp,
131
+ ) # [kg/s]
132
+
133
+ # =====
134
+ # BADA3
135
+ # =====
136
+ elif AC.BADAFamily.BADA3:
137
+ adaptedThrust = False
138
+ if AC.engineType in ("PISTON", "ELECTRIC"):
139
+ # PISTON and ELECTRIC uses LIDL throughout the whole descent phase
140
+ config = "CR"
141
+ adaptedThrust = True
142
+
143
+ # =================================================================================
144
+ # for altitudes where aircraft descends on 3degree slope in AP and LD configuration
145
+ # =================================================================================
146
+ if config in ("AP", "LD"):
147
+ gamma = -3.0
148
+ temp_const = (theta * const.temp_0) / (
149
+ theta * const.temp_0 - deltaTemp
150
+ )
151
+ ROCD_gamma = sin(conv.deg2rad(gamma)) * TAS * (1 / temp_const)
152
+
153
+ n = 1.0
154
+ CL = AC.CL(sigma=sigma, mass=mass, tas=TAS, nz=n)
155
+ CD = AC.CD(CL=CL, config=config)
156
+ Drag = AC.D(sigma=sigma, tas=TAS, CD=CD)
157
+ Thrust = AC.Thrust(
158
+ rating="ADAPTED",
159
+ v=TAS,
160
+ config=config,
161
+ h=alt,
162
+ ROCD=ROCD_gamma,
163
+ mass=mass,
164
+ acc=0,
165
+ deltaTemp=deltaTemp,
166
+ Drag=Drag,
167
+ )
168
+ ff = AC.ff(
169
+ flightPhase="Descent",
170
+ v=TAS,
171
+ h=alt,
172
+ T=Thrust,
173
+ config=config,
174
+ adapted=adaptedThrust,
175
+ )
176
+
177
+ # =============================================================
178
+ # for altitudes where aircraft descends in IDLE engine settings
179
+ # =============================================================
180
+ else:
181
+ ff = AC.ff(
182
+ v=TAS,
183
+ h=alt,
184
+ T=Thrust,
185
+ flightPhase="Descent",
186
+ config=config,
187
+ )
188
+
189
+ fl = int(utils.proper_round(conv.m2ft(alt) / 100))
190
+ alt_ft = conv.m2ft(alt)
191
+ print(f"{fl:>4d} {alt_ft:>8.0f} {config:>3} {M:>6.3f} {ff:>10.6f}")
192
+
193
+ alt_ft_vals.append(alt_ft)
194
+ ff_vals.append(float(ff))
195
+
196
+ series.append(
197
+ {
198
+ "label": label,
199
+ "alt_ft": np.array(alt_ft_vals),
200
+ "ff": np.array(ff_vals),
201
+ }
202
+ )
203
+
204
+ # --- PLOT: Fuel flow vs Altitude for all aircraft ---
205
+ plt.figure(figsize=(8, 5))
206
+ for s in series:
207
+ plt.plot(s["alt_ft"], s["ff"], label=s["label"])
208
+
209
+ plt.xlabel("Altitude (ft)")
210
+ plt.ylabel("Fuel Flow (kg/s)")
211
+ plt.title("Descent Fuel Flow vs Altitude")
212
+ plt.grid(True, which="both", linestyle="--", linewidth=0.5)
213
+ plt.legend()
214
+ plt.tight_layout()
215
+ plt.show()
@@ -17,22 +17,22 @@ from pyBADA.badaH import BadaHAircraft
17
17
  AC = Bada3Aircraft(badaVersion="DUMMY", acName="J2M")
18
18
 
19
19
  # Common inputs
20
- DeltaTemp = 0 # deviation from ISA temperature [K]
21
- M = 0.7 # Mach number [-]
22
- altitude = conv.ft2m(30000) # cruise altitude [m]
23
- distance = conv.nm2m(100) # flown distance [m]
24
- payload = 80 # payload mass [% of max payload]
25
- fuelReserve = 3600 # fuel reserve [s]
26
- flightPlanInitMass = None # planned takeoff mass [kg]
20
+ deltaTemp = 0 # deviation from ISA temperature [K]
21
+ M = 0.7 # Mach number [-]
22
+ altitude = conv.ft2m(30000) # cruise altitude [m]
23
+ distance = conv.nm2m(100) # flown distance [m]
24
+ payload = 80 # payload mass [% of max payload]
25
+ fuelReserve = 3600 # fuel reserve [s]
26
+ flightPlanInitMass = None # planned takeoff mass [kg]
27
27
 
28
28
  # Precompute atmosphere & speed inputs
29
- theta, delta, sigma = atm.atmosphereProperties(h=altitude, DeltaTemp=DeltaTemp)
30
- TAS = atm.mach2Tas(Mach=M, theta=theta)
31
- GS = TAS # assume no wind
29
+ theta, delta, sigma = atm.atmosphereProperties(h=altitude, deltaTemp=deltaTemp)
30
+ TAS = atm.mach2Tas(Mach=M, theta=theta)
31
+ GS = TAS # assume no wind
32
32
 
33
33
  # Specify acName per model
34
34
  for model_name, ACClass, acName in [
35
- ("BADA3", Bada3Aircraft, "J2M"),
35
+ ("BADA3", Bada3Aircraft, "J2M"),
36
36
  ("BADA4", Bada4Aircraft, "Dummy-TWIN-plus"),
37
37
  ("BADAH", BadaHAircraft, "DUMH"),
38
38
  ]:
@@ -41,7 +41,7 @@ for model_name, ACClass, acName in [
41
41
 
42
42
  # 1) Cruise fuel flow [kg/s]
43
43
  cruiseFuelFlow = TP.cruiseFuelConsumption(
44
- AC=AC, altitude=altitude, M=M, DeltaTemp=DeltaTemp
44
+ AC=AC, altitude=altitude, M=M, deltaTemp=deltaTemp
45
45
  )
46
46
  print(f"cruiseFuelFlow: {cruiseFuelFlow:.6f} kg/s")
47
47
 
@@ -65,6 +65,6 @@ for model_name, ACClass, acName in [
65
65
  payload=payload,
66
66
  fuelReserve=fuelReserve,
67
67
  flightPlanInitialMass=flightPlanInitMass,
68
- DeltaTemp=DeltaTemp,
68
+ deltaTemp=deltaTemp,
69
69
  )
70
- print(f"initMass(limited): {initMass:.2f} kg")
70
+ print(f"initMass(limited): {initMass:.2f} kg")
@@ -20,17 +20,17 @@ print("BADA4 Optimum Speed and Altitude:")
20
20
  if AC.BADAFamily.BADA4:
21
21
  mass = AC.MTOW # [kg] AC weight
22
22
  h = conv.ft2m(33000) # [m] AC flight altitdue
23
- DeltaTemp = 0 # [K] temperature deviation from ISA
23
+ deltaTemp = 0 # [K] temperature deviation from ISA
24
24
  cI = 50 # [kg min^-1] cost index
25
25
  wS = 0 # [m s^-1] longitudinal wind speed
26
26
 
27
27
  [theta, delta, sigma] = atm.atmosphereProperties(
28
- h=h, DeltaTemp=DeltaTemp
28
+ h=h, deltaTemp=deltaTemp
29
29
  ) # atmosphere properties
30
30
 
31
31
  # Economic Mach Cruise Speed
32
32
  econMach = AC.OPT.econMach(
33
- theta=theta, delta=delta, mass=mass, DeltaTemp=DeltaTemp, cI=cI, wS=wS
33
+ theta=theta, delta=delta, mass=mass, deltaTemp=deltaTemp, cI=cI, wS=wS
34
34
  )
35
35
  print("EconMach = ", econMach)
36
36
 
@@ -41,7 +41,7 @@ if AC.BADAFamily.BADA4:
41
41
 
42
42
  # Maximum Range Cruise (MRC) Mach speed
43
43
  MRC = AC.OPT.MRC(
44
- theta=theta, delta=delta, mass=mass, DeltaTemp=DeltaTemp, wS=wS
44
+ theta=theta, delta=delta, mass=mass, deltaTemp=deltaTemp, wS=wS
45
45
  )
46
46
  print("MRC = ", MRC)
47
47
 
@@ -50,7 +50,7 @@ if AC.BADAFamily.BADA4:
50
50
 
51
51
  # Long Range Cruise (LRC) Mach speed
52
52
  LRC = AC.OPT.LRC(
53
- theta=theta, delta=delta, mass=mass, DeltaTemp=DeltaTemp, wS=wS
53
+ theta=theta, delta=delta, mass=mass, deltaTemp=deltaTemp, wS=wS
54
54
  )
55
55
  print("LRC = ", LRC)
56
56
 
@@ -59,7 +59,7 @@ if AC.BADAFamily.BADA4:
59
59
 
60
60
  # Maximum Endurance Cruise (MEC) Mach speed
61
61
  MEC = AC.OPT.MEC(
62
- theta=theta, delta=delta, mass=mass, DeltaTemp=DeltaTemp, wS=wS
62
+ theta=theta, delta=delta, mass=mass, deltaTemp=deltaTemp, wS=wS
63
63
  )
64
64
  print("MEC = ", MEC)
65
65
 
@@ -68,7 +68,7 @@ if AC.BADAFamily.BADA4:
68
68
 
69
69
  # optimum flight altitude at given M speed
70
70
  M = MRC
71
- optAlt = AC.OPT.optAltitude(M=M, mass=mass, DeltaTemp=DeltaTemp)
71
+ optAlt = AC.OPT.optAltitude(M=M, mass=mass, deltaTemp=deltaTemp)
72
72
  print("optAlt =", optAlt)
73
73
 
74
74
  optAlt_precomputed = AC.OPT.getOPTParam("OPTALT", M, mass)
@@ -83,31 +83,31 @@ if AC.BADAFamily.BADAH:
83
83
  mass = 1600 # [kg] AC weight
84
84
  Hp = 14000 # [ft] AC flight altitude
85
85
  h = conv.ft2m(Hp) # [m] AC flight altitude
86
- DeltaTemp = 20 # [K] temperature deviation from ISA
86
+ deltaTemp = 20 # [K] temperature deviation from ISA
87
87
  wS = 0 # [m s^-1] longitudinal wind speed
88
88
 
89
89
  [theta, delta, sigma] = atm.atmosphereProperties(
90
- h=h, DeltaTemp=DeltaTemp
90
+ h=h, deltaTemp=deltaTemp
91
91
  ) # atmoshpere properties
92
92
 
93
93
  # Maximum Range Cruise (MRC) Mach speed
94
- MRC = AC.OPT.MRC(h=h, mass=mass, DeltaTemp=DeltaTemp, wS=wS)
94
+ MRC = AC.OPT.MRC(h=h, mass=mass, deltaTemp=deltaTemp, wS=wS)
95
95
  # print("MRC = ", conv.ms2kt(MRC))
96
96
  print("MRC = ", (MRC))
97
97
 
98
- MRC_precomputed = AC.OPT.getOPTParam("MRC", Hp, mass, DeltaTemp)
98
+ MRC_precomputed = AC.OPT.getOPTParam("MRC", Hp, mass, deltaTemp)
99
99
  print("MRC_precomputed = ", conv.kt2ms(MRC_precomputed))
100
100
 
101
101
  # Long Range Cruise (LRC) Mach speed
102
- LRC = AC.OPT.LRC(h=h, mass=mass, DeltaTemp=DeltaTemp, wS=wS)
102
+ LRC = AC.OPT.LRC(h=h, mass=mass, deltaTemp=deltaTemp, wS=wS)
103
103
  print("LRC = ", (LRC))
104
104
 
105
- LRC_precomputed = AC.OPT.getOPTParam("LRC", Hp, mass, DeltaTemp)
105
+ LRC_precomputed = AC.OPT.getOPTParam("LRC", Hp, mass, deltaTemp)
106
106
  print("LRC_precomputed = ", conv.kt2ms(LRC_precomputed))
107
107
 
108
108
  # Maximum Endurance Cruise (MEC) Mach speed
109
- MEC = AC.OPT.MEC(h=h, mass=mass, DeltaTemp=DeltaTemp, wS=wS)
109
+ MEC = AC.OPT.MEC(h=h, mass=mass, deltaTemp=deltaTemp, wS=wS)
110
110
  print("MEC = ", (MEC))
111
111
 
112
- MEC_precomputed = AC.OPT.getOPTParam("MEC", Hp, mass, DeltaTemp)
112
+ MEC_precomputed = AC.OPT.getOPTParam("MEC", Hp, mass, deltaTemp)
113
113
  print("MEC_precomputed = ", conv.kt2ms(MEC_precomputed))