pyBADA 0.1.6__tar.gz → 0.1.7__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.
- {pybada-0.1.6 → pybada-0.1.7}/PKG-INFO +7 -7
- {pybada-0.1.6 → pybada-0.1.7}/README.md +1 -1
- {pybada-0.1.6 → pybada-0.1.7}/examples/combinedSlopeAndDestination.py +12 -15
- pybada-0.1.7/examples/fuelFlow.py +215 -0
- {pybada-0.1.6 → pybada-0.1.7}/examples/initialMass.py +14 -14
- {pybada-0.1.6 → pybada-0.1.7}/examples/optimumSpeedAndAltitude.py +15 -15
- {pybada-0.1.6 → pybada-0.1.7}/examples/trajectoryAC.py +61 -61
- {pybada-0.1.6 → pybada-0.1.7}/examples/trajectoryAC_GPS.py +61 -61
- {pybada-0.1.6 → pybada-0.1.7}/examples/trajectoryHELI.py +15 -15
- {pybada-0.1.6 → pybada-0.1.7}/pyproject.toml +6 -6
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/TCL.py +176 -176
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/aircraft.py +13 -13
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/atmosphere.py +91 -60
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/bada3.py +189 -190
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/bada4.py +271 -251
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/badaH.py +201 -201
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/conversions.py +22 -18
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/geodesic.py +19 -19
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/trajectoryPrediction.py +11 -11
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/utils.py +43 -38
- pybada-0.1.7/tests/atmosphereTest.py +1261 -0
- pybada-0.1.6/tests/atmosphereTest.py +0 -768
- {pybada-0.1.6 → pybada-0.1.7}/.github/workflows/lint.yml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/.github/workflows/pytest.yml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/.github/workflows/release.yml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/.github/workflows/sphinx.yml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/.gitignore +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/.pre-commit-config.yaml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/AMENDMENT_TO_EUPL_license.md +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/AUTHORS +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/LICENCE.txt +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/Makefile +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/TCL.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/aircraft.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/atmosphere.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/bada3.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/bada4.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/badaH.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/configuration.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/constants.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/conversions.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/flightTrajectory.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/geodesic.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/magnetic.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/API_reference/trajectoryPrediction.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/_static/css/custom.css +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/_static/default_thumbnail.png +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/_static/pyBADA_architecture.png +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/_templates/footer.html +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/architecture.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/conf.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/getting-started.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/history.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/index.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/pyBADA.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/userManual.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/user_manual/examples.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/docs/source/user_manual/introduction.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/examples/BADAData.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/examples/GALLERY_HEADER.rst +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/examples/fileParser.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/examples/geodesicCalculations.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/BADA.GPF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/BZJT__.APF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/BZJT__.OPF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/BZJT__.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/BZJT__.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/GA____.APF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/GA____.OPF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/GA____.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/GA____.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2H___.APF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2H___.OPF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2H___.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2H___.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2M___.APF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2M___.OPF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2M___.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J2M___.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J4H___.APF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J4H___.OPF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J4H___.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/J4H___.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/ReleaseSummary +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/SYNONYM.NEW +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/TP2M__.APF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/TP2M__.OPF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/TP2M__.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA3/DUMMY/TP2M__.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/ACM_BADA4.xsd +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST.ATF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST.xml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA+20.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA+20.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-PST/Dummy-PST_ISA.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP.ATF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP.xml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA+20.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA+20.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/Dummy-TBP_ISA.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/LRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/MEC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/MRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TBP/OPTALT.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN.ATF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN.xml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA+20.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA+20.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/Dummy-TWIN_ISA.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/ECON.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/LRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/MEC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/MRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN/OPTALT.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus.ATF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus.xml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA+20.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA+20.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/Dummy-TWIN-plus_ISA.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/ECON.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/LRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/MEC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/MRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/Dummy-TWIN-plus/OPTALT.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/GPF.xml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADA4/DUMMY/GPF_BADA4.xsd +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/DUMH.ATF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/DUMH.xml +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA+20.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA+20.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA.PTD +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/DUMH_ISA.PTF +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/LRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/MEC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/aircraft/BADAH/DUMMY/DUMH/MRC.OPT +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/data/magneticDeclinationGridData.json +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/__init__.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/configuration.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/constants.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/flightTrajectory.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/src/pyBADA/magnetic.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/tests/load_test.py +0 -0
- {pybada-0.1.6 → pybada-0.1.7}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyBADA
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.7
|
|
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>
|
|
@@ -11,19 +11,19 @@ Classifier: License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
|
12
12
|
Requires-Python: >=3.12
|
|
13
13
|
Requires-Dist: numpy>=2.3.2
|
|
14
|
-
Requires-Dist: pandas>=2.3.
|
|
14
|
+
Requires-Dist: pandas>=2.3.2
|
|
15
15
|
Requires-Dist: scipy>=1.16.1
|
|
16
16
|
Requires-Dist: simplekml>=1.3.6
|
|
17
|
-
Requires-Dist: xarray>=2025.
|
|
17
|
+
Requires-Dist: xarray>=2025.9.0
|
|
18
18
|
Requires-Dist: xlsxwriter>=3.2.5
|
|
19
19
|
Provides-Extra: dev
|
|
20
20
|
Requires-Dist: build; extra == 'dev'
|
|
21
21
|
Requires-Dist: folium==0.20.0; extra == 'dev'
|
|
22
|
-
Requires-Dist: matplotlib==3.10.
|
|
22
|
+
Requires-Dist: matplotlib==3.10.6; extra == 'dev'
|
|
23
23
|
Requires-Dist: pre-commit==4.2.0; extra == 'dev'
|
|
24
|
-
Requires-Dist: pytest==8.4.
|
|
24
|
+
Requires-Dist: pytest==8.4.2; extra == 'dev'
|
|
25
25
|
Requires-Dist: readthedocs-sphinx-search>=0.3.2; extra == 'dev'
|
|
26
|
-
Requires-Dist: ruff==0.
|
|
26
|
+
Requires-Dist: ruff==0.12.12; extra == 'dev'
|
|
27
27
|
Requires-Dist: sphinx-gallery==0.19.0; extra == 'dev'
|
|
28
28
|
Requires-Dist: sphinx-rtd-theme==3.0.2; extra == 'dev'
|
|
29
29
|
Requires-Dist: sphinx==8.2.3; extra == 'dev'
|
|
@@ -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"> 
|
|
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
|
[](https://github.com/eurocontrol-bada/pybada/actions/workflows/pytest.yml)
|
|
40
|
-

|
|
40
|
+
[](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"> 
|
|
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
|
[](https://github.com/eurocontrol-bada/pybada/actions/workflows/pytest.yml)
|
|
8
|
-

|
|
8
|
+
[](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
|
|
|
@@ -12,25 +12,25 @@ from pyBADA import geodesic as geo
|
|
|
12
12
|
|
|
13
13
|
# ——— Inputs for required–slope example ———
|
|
14
14
|
waypoint1 = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
"latitude": 52.2367946579192,
|
|
16
|
+
"longitude": 20.7129809016565,
|
|
17
|
+
"altitude": 3500.0, # ft
|
|
18
18
|
}
|
|
19
19
|
waypoint2 = {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
28
|
-
distance_nm
|
|
29
|
-
bearing_deg
|
|
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",
|
|
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
|
-
|
|
21
|
-
M
|
|
22
|
-
altitude
|
|
23
|
-
distance
|
|
24
|
-
payload
|
|
25
|
-
fuelReserve
|
|
26
|
-
flightPlanInitMass
|
|
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,
|
|
30
|
-
TAS
|
|
31
|
-
GS
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
112
|
+
MEC_precomputed = AC.OPT.getOPTParam("MEC", Hp, mass, deltaTemp)
|
|
113
113
|
print("MEC_precomputed = ", conv.kt2ms(MEC_precomputed))
|