pycontrails 0.51.2__tar.gz → 0.52.1__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.

Potentially problematic release.


This version of pycontrails might be problematic. Click here for more details.

Files changed (272) hide show
  1. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/workflows/release.yaml +5 -1
  2. {pycontrails-0.51.2 → pycontrails-0.52.1}/.pre-commit-config.yaml +1 -1
  3. {pycontrails-0.51.2 → pycontrails-0.52.1}/CHANGELOG.md +63 -5
  4. {pycontrails-0.51.2 → pycontrails-0.52.1}/Makefile +9 -1
  5. {pycontrails-0.51.2/pycontrails.egg-info → pycontrails-0.52.1}/PKG-INFO +31 -12
  6. {pycontrails-0.51.2 → pycontrails-0.52.1}/README.md +15 -3
  7. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/_static/pycontrails.bib +74 -67
  8. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/api.rst +22 -1
  9. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/index.rst +10 -2
  10. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/install.rst +16 -9
  11. pycontrails-0.52.1/docs/integrations/APCEMM.ipynb +480 -0
  12. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/models.rst +1 -0
  13. pycontrails-0.52.1/docs/notebooks/Landsat.ipynb +865 -0
  14. pycontrails-0.52.1/docs/notebooks/Sentinel.ipynb +853 -0
  15. pycontrails-0.52.1/docs/notebooks/data/iagos-flight-landsat.csv +2411 -0
  16. pycontrails-0.52.1/docs/notebooks/data/iagos-flight-sentinel.csv +7274 -0
  17. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/observations.rst +2 -0
  18. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/__init__.py +1 -1
  19. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/_version.py +2 -2
  20. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/__init__.py +1 -1
  21. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/cache.py +1 -1
  22. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/coordinates.py +5 -5
  23. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/flight.py +36 -32
  24. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/interpolation.py +2 -2
  25. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/met.py +23 -14
  26. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/polygon.py +1 -1
  27. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/rgi_cython.c +1224 -283
  28. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/vector.py +1 -1
  29. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/__init__.py +4 -1
  30. pycontrails-0.52.1/pycontrails/datalib/_leo_utils/search.py +250 -0
  31. pycontrails-0.52.1/pycontrails/datalib/_leo_utils/static/bq_roi_query.sql +6 -0
  32. pycontrails-0.52.1/pycontrails/datalib/_leo_utils/vis.py +60 -0
  33. pycontrails-0.51.2/pycontrails/core/datalib.py → pycontrails-0.52.1/pycontrails/datalib/_met_utils/metsource.py +1 -5
  34. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/arco_era5.py +8 -7
  35. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/common.py +3 -2
  36. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/era5.py +12 -11
  37. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/era5_model_level.py +12 -11
  38. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/hres.py +14 -13
  39. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/hres_model_level.py +15 -14
  40. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/ifs.py +14 -13
  41. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/gfs/gfs.py +15 -14
  42. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/goes.py +12 -5
  43. pycontrails-0.52.1/pycontrails/datalib/landsat.py +567 -0
  44. pycontrails-0.52.1/pycontrails/datalib/sentinel.py +512 -0
  45. pycontrails-0.52.1/pycontrails/models/apcemm/__init__.py +8 -0
  46. pycontrails-0.52.1/pycontrails/models/apcemm/apcemm.py +983 -0
  47. pycontrails-0.52.1/pycontrails/models/apcemm/inputs.py +226 -0
  48. pycontrails-0.52.1/pycontrails/models/apcemm/static/apcemm_yaml_template.yaml +183 -0
  49. pycontrails-0.52.1/pycontrails/models/apcemm/utils.py +437 -0
  50. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/cocip_uncertainty.py +9 -9
  51. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/output_formats.py +3 -2
  52. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocipgrid/cocip_grid.py +7 -6
  53. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/dry_advection.py +14 -5
  54. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/physics/geo.py +1 -1
  55. {pycontrails-0.51.2 → pycontrails-0.52.1/pycontrails.egg-info}/PKG-INFO +31 -12
  56. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails.egg-info/SOURCES.txt +20 -4
  57. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails.egg-info/requires.txt +16 -9
  58. {pycontrails-0.51.2 → pycontrails-0.52.1}/pyproject.toml +25 -14
  59. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/__init__.py +9 -0
  60. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/conftest.py +13 -0
  61. pycontrails-0.52.1/tests/unit/test_apcemm.py +370 -0
  62. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_cocip.py +5 -0
  63. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_cocip_grid.py +2 -2
  64. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_cocip_uncertainty.py +6 -5
  65. pycontrails-0.51.2/tests/unit/test_datalib.py → pycontrails-0.52.1/tests/unit/test_datalib_metsource.py +49 -49
  66. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_ecmwf.py +8 -2
  67. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_flight.py +18 -6
  68. pycontrails-0.52.1/tests/unit/test_leo.py +624 -0
  69. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_met.py +24 -0
  70. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_sac_issr.py +10 -1
  71. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_spire.py +1 -1
  72. pycontrails-0.51.2/pycontrails/datalib/spire/__init__.py +0 -19
  73. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  74. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  75. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/dependabot.yaml +0 -0
  76. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/pull_request_template.md +0 -0
  77. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/workflows/docs.yaml +0 -0
  78. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/workflows/doctest.yaml +0 -0
  79. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/workflows/scorecard.yaml +0 -0
  80. {pycontrails-0.51.2 → pycontrails-0.52.1}/.github/workflows/test.yaml +0 -0
  81. {pycontrails-0.51.2 → pycontrails-0.52.1}/.gitignore +0 -0
  82. {pycontrails-0.51.2 → pycontrails-0.52.1}/.zenodo.json +0 -0
  83. {pycontrails-0.51.2 → pycontrails-0.52.1}/CONTRIBUTING.md +0 -0
  84. {pycontrails-0.51.2 → pycontrails-0.52.1}/LICENSE +0 -0
  85. {pycontrails-0.51.2 → pycontrails-0.52.1}/NOTICE +0 -0
  86. {pycontrails-0.51.2 → pycontrails-0.52.1}/RELEASE.md +0 -0
  87. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/_static/css/style.css +0 -0
  88. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/_static/img/colab.png +0 -0
  89. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/_static/img/favicon.png +0 -0
  90. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/_static/img/logo-dark.png +0 -0
  91. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/_static/img/logo.png +0 -0
  92. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/changelog.rst +0 -0
  93. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/conf.py +0 -0
  94. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/contributing.rst +0 -0
  95. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/develop.rst +0 -0
  96. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/flight.rst +0 -0
  97. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/integrations/ACCF.ipynb +0 -0
  98. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/literature.rst +0 -0
  99. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/meteorology.rst +0 -0
  100. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/ARCO-ERA5.ipynb +0 -0
  101. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/AircraftPerformance.ipynb +0 -0
  102. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/Cache.ipynb +0 -0
  103. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/CoCiP.ipynb +0 -0
  104. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/ECMWF.ipynb +0 -0
  105. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/Flight.ipynb +0 -0
  106. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/GFS.ipynb +0 -0
  107. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/GOES.ipynb +0 -0
  108. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/ISSR.ipynb +0 -0
  109. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/Meteorology.ipynb +0 -0
  110. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/SAC.ipynb +0 -0
  111. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/advection.ipynb +0 -0
  112. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/airports.ipynb +0 -0
  113. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/data/.gitignore +0 -0
  114. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/data/flight-ap.csv +0 -0
  115. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/data/flight-cocip.csv +0 -0
  116. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/data/flight-fdr.csv +0 -0
  117. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/data/flight-noisy.csv +0 -0
  118. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/data/flight.csv +0 -0
  119. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/flightplan.ipynb +0 -0
  120. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/model-levels.ipynb +0 -0
  121. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/run-cocip-on-flight.ipynb +0 -0
  122. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/run-cocip-with-fdr.ipynb +0 -0
  123. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks/specific-humidity-interpolation.ipynb +0 -0
  124. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/notebooks.rst +0 -0
  125. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/tutorials.rst +0 -0
  126. {pycontrails-0.51.2 → pycontrails-0.52.1}/docs/utilities.rst +0 -0
  127. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/aircraft_performance.py +0 -0
  128. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/airports.py +0 -0
  129. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/fleet.py +0 -0
  130. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/flightplan.py +0 -0
  131. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/fuel.py +0 -0
  132. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/met_var.py +0 -0
  133. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/models.py +0 -0
  134. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/core/rgi_cython.pyx +0 -0
  135. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/__init__.py +0 -0
  136. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/model_levels.py +0 -0
  137. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/static/model_level_dataframe_v20240418.csv +0 -0
  138. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/ecmwf/variables.py +0 -0
  139. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/gfs/__init__.py +0 -0
  140. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/datalib/gfs/variables.py +0 -0
  141. {pycontrails-0.51.2/pycontrails/datalib/spire → pycontrails-0.52.1/pycontrails/datalib}/spire.py +0 -0
  142. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/ext/bada.py +0 -0
  143. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/ext/cirium.py +0 -0
  144. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/ext/empirical_grid.py +0 -0
  145. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/ext/synthetic_flight.py +0 -0
  146. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/__init__.py +0 -0
  147. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/accf.py +0 -0
  148. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/__init__.py +0 -0
  149. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/cocip.py +0 -0
  150. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/cocip_params.py +0 -0
  151. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/contrail_properties.py +0 -0
  152. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/radiative_forcing.py +0 -0
  153. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/radiative_heating.py +0 -0
  154. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/unterstrasser_wake_vortex.py +0 -0
  155. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/wake_vortex.py +0 -0
  156. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocip/wind_shear.py +0 -0
  157. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocipgrid/__init__.py +0 -0
  158. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/cocipgrid/cocip_grid_params.py +0 -0
  159. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/emissions/__init__.py +0 -0
  160. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/emissions/black_carbon.py +0 -0
  161. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/emissions/emissions.py +0 -0
  162. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/emissions/ffm2.py +0 -0
  163. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/emissions/static/default-engine-uids.csv +0 -0
  164. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/emissions/static/edb-gaseous-v29b-engines.csv +0 -0
  165. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/emissions/static/edb-nvpm-v29b-engines.csv +0 -0
  166. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/humidity_scaling/__init__.py +0 -0
  167. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/humidity_scaling/humidity_scaling.py +0 -0
  168. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/humidity_scaling/quantiles/era5-model-level-quantiles.pq +0 -0
  169. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/humidity_scaling/quantiles/era5-pressure-level-quantiles.pq +0 -0
  170. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/issr.py +0 -0
  171. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/pcc.py +0 -0
  172. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/pcr.py +0 -0
  173. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/ps_model/__init__.py +0 -0
  174. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/ps_model/ps_aircraft_params.py +0 -0
  175. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/ps_model/ps_grid.py +0 -0
  176. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/ps_model/ps_model.py +0 -0
  177. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/ps_model/ps_operational_limits.py +0 -0
  178. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/ps_model/static/ps-aircraft-params-20240524.csv +0 -0
  179. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/ps_model/static/ps-synonym-list-20240524.csv +0 -0
  180. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/sac.py +0 -0
  181. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/models/tau_cirrus.py +0 -0
  182. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/physics/__init__.py +0 -0
  183. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/physics/constants.py +0 -0
  184. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/physics/jet.py +0 -0
  185. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/physics/thermo.py +0 -0
  186. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/physics/units.py +0 -0
  187. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/py.typed +0 -0
  188. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/utils/__init__.py +0 -0
  189. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/utils/dependencies.py +0 -0
  190. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/utils/iteration.py +0 -0
  191. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/utils/json.py +0 -0
  192. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/utils/temp.py +0 -0
  193. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails/utils/types.py +0 -0
  194. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails.egg-info/dependency_links.txt +0 -0
  195. {pycontrails-0.51.2 → pycontrails-0.52.1}/pycontrails.egg-info/top_level.txt +0 -0
  196. {pycontrails-0.51.2 → pycontrails-0.52.1}/setup.cfg +0 -0
  197. {pycontrails-0.51.2 → pycontrails-0.52.1}/setup.py +0 -0
  198. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/_deprecated.py +0 -0
  199. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip/Makefile +0 -0
  200. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip/README.md +0 -0
  201. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip/benchmark.py +0 -0
  202. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip/compare.py +0 -0
  203. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip/data.md +0 -0
  204. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip/output.py +0 -0
  205. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip/review.ipynb +0 -0
  206. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/cocip-fortran/README.md +0 -0
  207. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/north-atlantic-study/.gcloudignore +0 -0
  208. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/north-atlantic-study/README.md +0 -0
  209. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/north-atlantic-study/support.py +0 -0
  210. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/benchmark/north-atlantic-study/validate.py +0 -0
  211. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/fixtures/cocip-met.py +0 -0
  212. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/fixtures/cocip-met2.py +0 -0
  213. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/fixtures/ecmwf-met.py +0 -0
  214. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/fixtures/gfs-met.py +0 -0
  215. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/__init__.py +0 -0
  216. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/NOAA_Solar_Calculations_day.csv +0 -0
  217. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/cocip-contrail-output.json +0 -0
  218. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/cocip-contrail-output2.json +0 -0
  219. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/cocip-flight-output.json +0 -0
  220. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/cocip-flight-output2.json +0 -0
  221. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/cocip-output-contrail-edges.json +0 -0
  222. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/cocip-output-flts-20190101-eu.pq +0 -0
  223. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/flight-cocip2.csv +0 -0
  224. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/flight-meridian.csv +0 -0
  225. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/flight-metadata.json +0 -0
  226. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/flight-spire-data-cleaning.pq +0 -0
  227. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/flight.csv +0 -0
  228. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/flt-wypts-20190101-eu.pq +0 -0
  229. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-20190101-eu.nc +0 -0
  230. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-accf-pl.nc +0 -0
  231. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-accf-sl.nc +0 -0
  232. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-ecmwf-pl.nc +0 -0
  233. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-ecmwf-sl.nc +0 -0
  234. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-era5-cocip1.nc +0 -0
  235. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-era5-cocip2.nc +0 -0
  236. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/met-gfs.nc +0 -0
  237. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/polygon-bug.nc +0 -0
  238. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/rad-20190101-eu.nc +0 -0
  239. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/rad-era5-cocip1.nc +0 -0
  240. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/rad-era5-cocip2.nc +0 -0
  241. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/static/rad-gfs.nc +0 -0
  242. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_accf.py +0 -0
  243. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_airports.py +0 -0
  244. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_cache.py +0 -0
  245. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_cocip_grid_parity.py +0 -0
  246. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_cocip_radiative_forcing.py +0 -0
  247. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_coordinates.py +0 -0
  248. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_dry_advection.py +0 -0
  249. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_dtypes.py +0 -0
  250. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_emissions.py +0 -0
  251. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_fleet.py +0 -0
  252. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_flightplan.py +0 -0
  253. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_fuel.py +0 -0
  254. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_geo.py +0 -0
  255. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_gfs.py +0 -0
  256. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_goes.py +0 -0
  257. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_grid_to_netcdf.py +0 -0
  258. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_humidity_scaling.py +0 -0
  259. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_init.py +0 -0
  260. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_interpolation.py +0 -0
  261. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_met_cache.py +0 -0
  262. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_models.py +0 -0
  263. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_pcc.py +0 -0
  264. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_polygons.py +0 -0
  265. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_ps_model.py +0 -0
  266. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_tau_cirrus.py +0 -0
  267. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_thermo_sac.py +0 -0
  268. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_units.py +0 -0
  269. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_unterstrasser_wake_vortex.py +0 -0
  270. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_utils.py +0 -0
  271. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_vector.py +0 -0
  272. {pycontrails-0.51.2 → pycontrails-0.52.1}/tests/unit/test_zarr.py +0 -0
@@ -40,7 +40,7 @@ jobs:
40
40
 
41
41
  # https://cibuildwheel.readthedocs.io/en/stable/options/#testing
42
42
  - name: Build wheels
43
- uses: pypa/cibuildwheel@v2.18
43
+ uses: pypa/cibuildwheel@v2.19
44
44
  env:
45
45
  CIBW_BUILD: cp39-* cp310-* cp311-* cp312-*
46
46
  CIBW_SKIP: '*-win32 *-manylinux_i686 *-musllinux*'
@@ -50,6 +50,10 @@ jobs:
50
50
  # Completely isolate tests to prevent cibuildwheel from importing the
51
51
  # source instead of the wheel. This happens when tests/__init__.py is read.
52
52
  CIBW_TEST_EXTRAS: "complete,dev"
53
+ # Make sure GITHUB_ACTIONS
54
+ # (used to selectively skip expensive unit test)
55
+ # is passed through when testing linux wheels
56
+ CIBW_ENVIRONMENT_PASS_LINUX: GITHUB_ACTIONS
53
57
  CIBW_TEST_COMMAND: >
54
58
  mv {project}/pycontrails {project}/pycontrails-bak &&
55
59
  python -m pytest {project}/tests -vv &&
@@ -5,7 +5,7 @@ repos:
5
5
  name: ruff
6
6
  language_version: python3
7
7
  language: python
8
- entry: ruff
8
+ entry: ruff check
9
9
  args: [--fix, --exit-non-zero-on-fix]
10
10
  types: [python]
11
11
  - id: doc8
@@ -1,14 +1,72 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.52.1
4
+
5
+ ### Breaking changes
6
+
7
+ - Remove `lock=False` as a default keyword argument to `xr.open_mfdataset` in the `MetDataSource.open_dataset` method. This reverts a change from [v0.44.1](https://github.com/contrailcirrus/pycontrails/releases/tag/v0.44.1) and prevents segmentation faults when using recent versions of [netCDF4](https://pypi.org/project/netCDF4/) (1.7.0 and above).
8
+ - GOES imagery is now loaded from a temporary file on disk rather than directly from memory when using `GOES.get` without a cachestore.
9
+
10
+ ### Internals
11
+
12
+ - Remove upper limits on netCDF4 and numpy versions.
13
+ - Remove h5netcdf dependency.
14
+ - Update doctests with numpy 2 scalar representation (see [NEP 51](https://numpy.org/neps/nep-0051-scalar-representation.html)). Doctests will now fail when run with numpy 1.
15
+ - Run certain tests in `test_ecmwf.py` and `test_met.py` using the single-threaded dask scheduler to prevent tests from hanging while waiting for a lock that is never released. (This issue was [encountered previously](https://github.com/contrailcirrus/pycontrails/pull/68), and removing `lock=False` in `MetDataSource.open_dataset` reverts the fix.)
16
+ - Document pycontrails installation from conda-forge.
17
+
18
+ ### Fixes
19
+
20
+ - Ensure the `MetDataset` vertical coordinates `"air_pressure"` and `"altitude"` have the correct dtype.
21
+
22
+ ## v0.52.0
23
+
24
+ ### Breaking changes
25
+
26
+ - The `_antimeridian_index` helper method in the `flight` module now returns a list of integers rather than an integer. This allows `Flight.to_geojson_multilinestring` to support multiple antimeridian crossings (see below).
27
+
28
+ ### Features
29
+
30
+ - Add tools for running [APCEMM](https://github.com/MIT-LAE/APCEMM) from within pycontrails. This includes:
31
+ - utilities for generating APCEMM input files and running APCEMM (`pycontrails.models.apcemm.utils`)
32
+ - an interface (`pycontrails.models.apcemm.apcemm`) that allows users to run APCEMM as a pycontrails `Model`.
33
+ - Add [APCEMM tutorial notebook](https://py.contrails.org/integrations/APCEMM.html).
34
+ - Add prescribed sedimentation rate to `DryAdvection` model.
35
+ - Add `Landsat` and `Sentinel` datalibs for searching, retrieving, and visualizing Landsat 8-9 and Sentinel-2 imagery. The datalibs include:
36
+ - Tools for querying Landsat and Sentinel-2 imagery for intersections with user-defined regions (`landsat.query`, `sentinel.query`) or flights (`landsat.intersect`, `sentinel.intersect`). These tools use BigQuery tables and require a Google Cloud Platform account with access to the BigQuery API.
37
+ - Tools for downloading and visualizing imagery from Landsat (`Landsat`) and Sentinel-2 (`Sentinel`). These tools retrieve data anonymously from Google Cloud Platform storage buckets and can be used without a Google Cloud Platform account.
38
+ - Add tutorial notebooks demonstrating how to use `Landsat` and `Sentinel` datalibs to find flights in high-resolution satellite imagery.
39
+ - Modify `Flight.to_geojson_multilinestring` to make grouping key optional and to support multiple antimeridian crossings.
40
+ - Update the `pycontrails` build system to require `numpy 2.0` per the [official numpy guidelines](https://numpy.org/devdocs/dev/depending_on_numpy.html#numpy-2-0-specific-advice). Note that the runtime requirement for `pycontrails` remains `numpy>=1.22`.
41
+ - Update `pycontrails` for breaking changes introduced in `numpy 2.0` (e.g., [NEP 50](https://numpy.org/neps/nep-0050-scalar-promotion.html)). All changes are backward compatible with `numpy>=1.22`.
42
+
43
+ ### Fixes
44
+
45
+ - Ensure width and depth are never attached to `DryAdvection` source when running pointwise-only model.
46
+ - Ensure that azimuth is not dropped when present in `DryAdvection` input source.
47
+ - Exclude netCDF version 1.7.0, which causes non-deterministic failures in unit tests primarily due to segmentation faults.
48
+ - Pin numpy to 1.x in runtime dependencies until a working numpy 2.x-compatible netCDF4 release is available.
49
+
50
+ ### Internals
51
+
52
+ - Create unit tests for the `APCEMM` interface that run if an `APCEMM` executable is found on the `PATH` inside a clean APCEMM git repository with a pinned git hash. These tests will be skipped unless users carefully configure their local test environment and will not run in CI.
53
+ - Exclude APCEMM tutorial notebook from notebook tests.
54
+ - Add unit tests for Landsat and Sentinel search tools and datalibs, but disable any tests that retrieve imagery data when running tests in GitHub Actions to limit resource consumption in GitHub runners. Users can disable these units tests locally by setting the environment variable `GITHUB_ACTIONS=true`.
55
+ - Ensure `GITHUB_ACTIONS` environment variable is available when building and testing wheels on linux.
56
+ - Skip cells that retrieve imagery data when running tests on Landsat and Sentinel tutorial notebooks.
57
+ - Add tests for `Flight.to_geojson_multilinestring` with grouping key omitted and update tests with multiple antimeridian crossings.
58
+ - Minimum pandas version is bumped to 2.2 to ensure the the `include_groups` keyword argument used in `Flight.to_geojson_multilinestring` is available.
59
+ - Upgrade minimum `mypy` dependencies
60
+
3
61
  ## v0.51.2
4
62
 
5
63
  ### Features
6
64
 
7
- - Add functionality to automatically compare simulated contrails from `cocip.Cocip` with GOES satellite imagery (`compare_cocip_with_goes`)
65
+ - Add functionality to automatically compare simulated contrails from `cocip.Cocip` with GOES satellite imagery (`compare_cocip_with_goes`).
8
66
 
9
67
  ### Internals
10
68
 
11
- - Fix documentation build in CI
69
+ - Fix documentation build in CI.
12
70
 
13
71
  ## v0.51.1
14
72
 
@@ -18,9 +76,9 @@
18
76
 
19
77
  ### Features
20
78
 
21
- - PS model: Support four aircraft types, including `E75L`, `E75S`, `E290`, and `E295`
22
- - PS model: Integrate `ps_synonym_list` to increase PS model aircraft type coverage to 102
23
- - PS model: Account for increase in fuel consumption due to engine deterioration between maintenance cycle
79
+ - PS model: Support four aircraft types, including `E75L`, `E75S`, `E290`, and `E295`.
80
+ - PS model: Integrate `ps_synonym_list` to increase PS model aircraft type coverage to 102.
81
+ - PS model: Account for increase in fuel consumption due to engine deterioration between maintenance cycle.
24
82
 
25
83
  ### Internals
26
84
 
@@ -133,6 +133,13 @@ main-test-status:
133
133
  DOCS_DIR = docs
134
134
  DOCS_BUILD_DIR = docs/_build
135
135
 
136
+ # Check that numpy 2 is being used
137
+ ensure-numpy-2:
138
+ [[ $$(python -c 'import numpy as np; print(np.__version__)') == 2.* ]] \
139
+ || ( \
140
+ echo -e "$(COLOR_YELLOW)NumPy 2 required for doctests$(END_COLOR)"; \
141
+ exit 1)
142
+
136
143
  # Check for GCP credentials
137
144
  ensure-gcp-credentials:
138
145
  python -c 'from google.cloud import storage; storage.Client()' \
@@ -163,7 +170,7 @@ ensure-era5-cached:
163
170
  cache-era5-gcp: ensure-era5-cached
164
171
  gcloud storage cp -r -n .doc-test-cache/* gs://contrails-301217-unit-test/doc-test-cache/
165
172
 
166
- doctest: ensure-era5-cached ensure-gcp-credentials
173
+ doctest: ensure-numpy-2 ensure-era5-cached ensure-gcp-credentials
167
174
  pytest --doctest-modules \
168
175
  --ignore-glob=pycontrails/ext/* \
169
176
  pycontrails -vv
@@ -202,6 +209,7 @@ nb-clean-check:
202
209
  nb-test: ensure-era5-cached nb-clean-check nb-black-check nb-check-links
203
210
  python -m pytest --nbval-lax \
204
211
  --ignore=docs/integrations/ACCF.ipynb \
212
+ --ignore=docs/integrations/APCEMM.ipynb \
205
213
  --ignore=docs/notebooks/specific-humidity-interpolation.ipynb \
206
214
  --ignore=docs/notebooks/GFS.ipynb \
207
215
  --ignore=docs/notebooks/run-cocip-on-flight.ipynb \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycontrails
3
- Version: 0.51.2
3
+ Version: 0.52.1
4
4
  Summary: Python library for modeling aviation climate impacts
5
5
  Author-email: Breakthrough Energy <py@contrails.org>
6
6
  License: Apache-2.0
@@ -30,19 +30,19 @@ License-File: NOTICE
30
30
  Requires-Dist: dask>=2022.3
31
31
  Requires-Dist: numpy>=1.22
32
32
  Requires-Dist: overrides>=6.1
33
- Requires-Dist: pandas>=1.4
33
+ Requires-Dist: pandas>=2.2
34
34
  Requires-Dist: scipy>=1.10
35
35
  Requires-Dist: xarray>=2022.3
36
36
  Provides-Extra: complete
37
- Requires-Dist: pycontrails[ecmwf,gcp,gfs,goes,jupyter,pyproj,vis,zarr]; extra == "complete"
37
+ Requires-Dist: pycontrails[ecmwf,gcp,gfs,jupyter,pyproj,sat,vis,zarr]; extra == "complete"
38
38
  Provides-Extra: dev
39
39
  Requires-Dist: black[jupyter]==24.4.1; extra == "dev"
40
40
  Requires-Dist: dep_license; extra == "dev"
41
41
  Requires-Dist: fastparquet>=0.8; extra == "dev"
42
42
  Requires-Dist: ipdb>=0.13; extra == "dev"
43
43
  Requires-Dist: memory_profiler; extra == "dev"
44
- Requires-Dist: mypy>=0.99; extra == "dev"
45
- Requires-Dist: mypy-extensions>=0.4; extra == "dev"
44
+ Requires-Dist: mypy>=1.8; extra == "dev"
45
+ Requires-Dist: mypy-extensions>=1.0; extra == "dev"
46
46
  Requires-Dist: platformdirs>=3.0; extra == "dev"
47
47
  Requires-Dist: pre-commit>=2.10; extra == "dev"
48
48
  Requires-Dist: psutil; extra == "dev"
@@ -84,13 +84,20 @@ Requires-Dist: cfgrib>=0.9; extra == "gfs"
84
84
  Requires-Dist: eccodes>=1.4; extra == "gfs"
85
85
  Requires-Dist: platformdirs>=3.0; extra == "gfs"
86
86
  Requires-Dist: tqdm>=4.61; extra == "gfs"
87
- Provides-Extra: goes
88
- Requires-Dist: cartopy>=0.22; extra == "goes"
89
- Requires-Dist: gcsfs>=2022.3; extra == "goes"
90
- Requires-Dist: h5netcdf>=1.2; extra == "goes"
91
87
  Provides-Extra: jupyter
92
88
  Requires-Dist: ipywidgets>=7.6; extra == "jupyter"
93
89
  Requires-Dist: jupyterlab>=2.2; extra == "jupyter"
90
+ Provides-Extra: sat
91
+ Requires-Dist: cartopy>=0.22; extra == "sat"
92
+ Requires-Dist: db-dtypes>=1.2; extra == "sat"
93
+ Requires-Dist: gcsfs>=2022.3; extra == "sat"
94
+ Requires-Dist: geojson>=3.1; extra == "sat"
95
+ Requires-Dist: google-cloud-bigquery>=3.23; extra == "sat"
96
+ Requires-Dist: google-cloud-bigquery-storage>=2.25; extra == "sat"
97
+ Requires-Dist: pillow>=10.3; extra == "sat"
98
+ Requires-Dist: pyproj>=3.5; extra == "sat"
99
+ Requires-Dist: rasterio>=1.3; extra == "sat"
100
+ Requires-Dist: scikit-image>=0.18; extra == "sat"
94
101
  Provides-Extra: open3d
95
102
  Requires-Dist: open3d>=0.14; extra == "open3d"
96
103
  Provides-Extra: pyproj
@@ -113,7 +120,7 @@ Requires-Dist: zarr>=2.12; extra == "zarr"
113
120
 
114
121
  | | |
115
122
  |---------------|-------------------------------------------------------------------|
116
- | **Version** | [![PyPI version](https://img.shields.io/pypi/v/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) [![Supported python versions](https://img.shields.io/pypi/pyversions/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) |
123
+ | **Version** | [![PyPI version](https://img.shields.io/pypi/v/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) [![conda-forge version](https://anaconda.org/conda-forge/pycontrails/badges/version.svg)](https://anaconda.org/conda-forge/pycontrails) [![Supported python versions](https://img.shields.io/pypi/pyversions/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) |
117
124
  | **Citation** | [![DOI](https://zenodo.org/badge/617248930.svg)](https://zenodo.org/badge/latestdoi/617248930) |
118
125
  | **Tests** | [![Unit test](https://github.com/contrailcirrus/pycontrails/actions/workflows/test.yaml/badge.svg)](https://github.com/contrailcirrus/pycontrails/actions/workflows/test.yaml) [![Docs](https://github.com/contrailcirrus/pycontrails/actions/workflows/docs.yaml/badge.svg)](https://github.com/contrailcirrus/pycontrails/actions/workflows/docs.yaml) [![Release](https://github.com/contrailcirrus/pycontrails/actions/workflows/release.yaml/badge.svg)](https://github.com/contrailcirrus/pycontrails/actions/workflows/release.yaml) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/contrailcirrus/pycontrails/badge)](https://securityscorecards.dev/viewer?uri=github.com/contrailcirrus/pycontrails)|
119
126
  | **License** | [![Apache License 2.0](https://img.shields.io/pypi/l/pycontrails.svg)](https://github.com/contrailcirrus/pycontrails/blob/main/LICENSE) |
@@ -132,7 +139,9 @@ Documentation and examples available at [py.contrails.org](https://py.contrails.
132
139
 
133
140
  ## Install
134
141
 
135
- Requires Python (3.9 or later)
142
+ ### Install with pip
143
+
144
+ You can install pycontrails from PyPI with `pip` (Python 3.9 or later required):
136
145
 
137
146
  ```bash
138
147
  $ pip install pycontrails
@@ -147,7 +156,17 @@ Install the latest development version directly from GitHub:
147
156
  pip install git+https://github.com/contrailcirrus/pycontrails.git
148
157
  ```
149
158
 
150
- See more options in the [install documentation](https://py.contrails.org/install).
159
+ ### Install with conda
160
+
161
+ You can install pycontrails from the [conda-forge](https://conda-forge.org/) channel with `conda` (or other `conda`-like package managers such as `mamba`):
162
+
163
+ ```bash
164
+ conda install -c conda-forge pycontrails
165
+ ```
166
+
167
+ The conda-forge package includes all optional runtime dependencies.
168
+
169
+ See more installation options in the [install documentation](https://py.contrails.org/install).
151
170
 
152
171
  ## Get Involved
153
172
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  | | |
6
6
  |---------------|-------------------------------------------------------------------|
7
- | **Version** | [![PyPI version](https://img.shields.io/pypi/v/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) [![Supported python versions](https://img.shields.io/pypi/pyversions/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) |
7
+ | **Version** | [![PyPI version](https://img.shields.io/pypi/v/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) [![conda-forge version](https://anaconda.org/conda-forge/pycontrails/badges/version.svg)](https://anaconda.org/conda-forge/pycontrails) [![Supported python versions](https://img.shields.io/pypi/pyversions/pycontrails.svg)](https://pypi.python.org/pypi/pycontrails) |
8
8
  | **Citation** | [![DOI](https://zenodo.org/badge/617248930.svg)](https://zenodo.org/badge/latestdoi/617248930) |
9
9
  | **Tests** | [![Unit test](https://github.com/contrailcirrus/pycontrails/actions/workflows/test.yaml/badge.svg)](https://github.com/contrailcirrus/pycontrails/actions/workflows/test.yaml) [![Docs](https://github.com/contrailcirrus/pycontrails/actions/workflows/docs.yaml/badge.svg)](https://github.com/contrailcirrus/pycontrails/actions/workflows/docs.yaml) [![Release](https://github.com/contrailcirrus/pycontrails/actions/workflows/release.yaml/badge.svg)](https://github.com/contrailcirrus/pycontrails/actions/workflows/release.yaml) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/contrailcirrus/pycontrails/badge)](https://securityscorecards.dev/viewer?uri=github.com/contrailcirrus/pycontrails)|
10
10
  | **License** | [![Apache License 2.0](https://img.shields.io/pypi/l/pycontrails.svg)](https://github.com/contrailcirrus/pycontrails/blob/main/LICENSE) |
@@ -23,7 +23,9 @@ Documentation and examples available at [py.contrails.org](https://py.contrails.
23
23
 
24
24
  ## Install
25
25
 
26
- Requires Python (3.9 or later)
26
+ ### Install with pip
27
+
28
+ You can install pycontrails from PyPI with `pip` (Python 3.9 or later required):
27
29
 
28
30
  ```bash
29
31
  $ pip install pycontrails
@@ -38,7 +40,17 @@ Install the latest development version directly from GitHub:
38
40
  pip install git+https://github.com/contrailcirrus/pycontrails.git
39
41
  ```
40
42
 
41
- See more options in the [install documentation](https://py.contrails.org/install).
43
+ ### Install with conda
44
+
45
+ You can install pycontrails from the [conda-forge](https://conda-forge.org/) channel with `conda` (or other `conda`-like package managers such as `mamba`):
46
+
47
+ ```bash
48
+ conda install -c conda-forge pycontrails
49
+ ```
50
+
51
+ The conda-forge package includes all optional runtime dependencies.
52
+
53
+ See more installation options in the [install documentation](https://py.contrails.org/install).
42
54
 
43
55
  ## Get Involved
44
56