pycontrails 0.40.0__tar.gz → 0.40.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 (200) hide show
  1. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/workflows/release.yaml +2 -2
  2. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/workflows/test.yaml +1 -1
  3. {pycontrails-0.40.0 → pycontrails-0.40.1}/CHANGELOG.md +7 -0
  4. {pycontrails-0.40.0/pycontrails.egg-info → pycontrails-0.40.1}/PKG-INFO +1 -1
  5. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/_static/pycontrails.bib +63 -0
  6. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/ECMWF.ipynb +33 -8
  7. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/Flight.ipynb +1 -1
  8. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/_version.py +2 -2
  9. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/met.py +14 -6
  10. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/models.py +5 -4
  11. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/rgi_cython.c +140 -140
  12. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/ecmwf/era5.py +24 -5
  13. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/ecmwf/hres.py +29 -5
  14. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/cocip.py +68 -6
  15. {pycontrails-0.40.0 → pycontrails-0.40.1/pycontrails.egg-info}/PKG-INFO +1 -1
  16. {pycontrails-0.40.0 → pycontrails-0.40.1}/pyproject.toml +1 -1
  17. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_dtypes.py +6 -1
  18. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  20. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/pull_request_template.md +0 -0
  21. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/workflows/benchmark.yaml +0 -0
  22. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/workflows/docs.yaml +0 -0
  23. {pycontrails-0.40.0 → pycontrails-0.40.1}/.github/workflows/doctest.yaml +0 -0
  24. {pycontrails-0.40.0 → pycontrails-0.40.1}/.gitignore +0 -0
  25. {pycontrails-0.40.0 → pycontrails-0.40.1}/.pre-commit-config.yaml +0 -0
  26. {pycontrails-0.40.0 → pycontrails-0.40.1}/.zenodo.json +0 -0
  27. {pycontrails-0.40.0 → pycontrails-0.40.1}/CONTRIBUTING.md +0 -0
  28. {pycontrails-0.40.0 → pycontrails-0.40.1}/LICENSE +0 -0
  29. {pycontrails-0.40.0 → pycontrails-0.40.1}/Makefile +0 -0
  30. {pycontrails-0.40.0 → pycontrails-0.40.1}/NOTICE +0 -0
  31. {pycontrails-0.40.0 → pycontrails-0.40.1}/README.md +0 -0
  32. {pycontrails-0.40.0 → pycontrails-0.40.1}/RELEASE.md +0 -0
  33. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/_static/css/style.css +0 -0
  34. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/_static/img/favicon.png +0 -0
  35. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/api.rst +0 -0
  36. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/changelog.rst +0 -0
  37. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/conf.py +0 -0
  38. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/contributing.rst +0 -0
  39. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/develop.rst +0 -0
  40. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/ACCF.ipynb +0 -0
  41. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/Cache.ipynb +0 -0
  42. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/CoCiP.ipynb +0 -0
  43. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/ISSR.ipynb +0 -0
  44. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/Meteorology.ipynb +0 -0
  45. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/SAC.ipynb +0 -0
  46. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples/flight.csv +0 -0
  47. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/examples.rst +0 -0
  48. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/index.rst +0 -0
  49. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/install.rst +0 -0
  50. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/literature.rst +0 -0
  51. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/tutorials/CoCiP.ipynb +0 -0
  52. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/tutorials/flight.csv +0 -0
  53. {pycontrails-0.40.0 → pycontrails-0.40.1}/docs/tutorials.rst +0 -0
  54. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/__init__.py +0 -0
  55. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/__init__.py +0 -0
  56. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/cache.py +0 -0
  57. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/coordinates.py +0 -0
  58. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/datalib.py +0 -0
  59. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/fleet.py +0 -0
  60. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/flight.py +0 -0
  61. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/fuel.py +0 -0
  62. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/interpolation.py +0 -0
  63. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/met_var.py +0 -0
  64. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/polygon.py +0 -0
  65. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/rgi_cython.pyx +0 -0
  66. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/core/vector.py +0 -0
  67. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/__init__.py +0 -0
  68. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/ecmwf/__init__.py +0 -0
  69. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/ecmwf/common.py +0 -0
  70. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/ecmwf/ifs.py +0 -0
  71. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/ecmwf/variables.py +0 -0
  72. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/gfs/__init__.py +0 -0
  73. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/gfs/gfs.py +0 -0
  74. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/datalib/gfs/variables.py +0 -0
  75. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/ext/bada/__init__.py +0 -0
  76. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/ext/cirium/__init__.py +0 -0
  77. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/__init__.py +0 -0
  78. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/accf.py +0 -0
  79. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/aircraft_performance.py +0 -0
  80. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/__init__.py +0 -0
  81. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/cocip_params.py +0 -0
  82. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/cocip_uncertainty.py +0 -0
  83. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/contrail_properties.py +0 -0
  84. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/output/__init__.py +0 -0
  85. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/output/flight_summary.py +0 -0
  86. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/output/grid_cirrus.py +0 -0
  87. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/radiative_forcing.py +0 -0
  88. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/radiative_heating.py +0 -0
  89. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/wake_vortex.py +0 -0
  90. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocip/wind_shear.py +0 -0
  91. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocipgrid/__init__.py +0 -0
  92. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocipgrid/cocip_grid.py +0 -0
  93. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocipgrid/cocip_grid_params.py +0 -0
  94. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/cocipgrid/cocip_time_handling.py +0 -0
  95. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/emissions/__init__.py +0 -0
  96. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/emissions/black_carbon.py +0 -0
  97. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/emissions/emissions.py +0 -0
  98. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/emissions/ffm2.py +0 -0
  99. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/emissions/static/edb-gaseous-v28c-engines.csv +0 -0
  100. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/emissions/static/edb-nvpm-v28c-engines.csv +0 -0
  101. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/humidity_scaling.py +0 -0
  102. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/issr.py +0 -0
  103. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/pcc.py +0 -0
  104. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/pcr.py +0 -0
  105. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/sac.py +0 -0
  106. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/models/tau_cirrus.py +0 -0
  107. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/physics/__init__.py +0 -0
  108. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/physics/constants.py +0 -0
  109. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/physics/geo.py +0 -0
  110. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/physics/jet.py +0 -0
  111. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/physics/thermo.py +0 -0
  112. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/physics/units.py +0 -0
  113. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/py.typed +0 -0
  114. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/utils/__init__.py +0 -0
  115. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/utils/iteration.py +0 -0
  116. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/utils/json.py +0 -0
  117. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/utils/synthetic_flight.py +0 -0
  118. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/utils/temp.py +0 -0
  119. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails/utils/types.py +0 -0
  120. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails.egg-info/SOURCES.txt +0 -0
  121. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails.egg-info/dependency_links.txt +0 -0
  122. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails.egg-info/requires.txt +0 -0
  123. {pycontrails-0.40.0 → pycontrails-0.40.1}/pycontrails.egg-info/top_level.txt +0 -0
  124. {pycontrails-0.40.0 → pycontrails-0.40.1}/setup.cfg +0 -0
  125. {pycontrails-0.40.0 → pycontrails-0.40.1}/setup.py +0 -0
  126. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/__init__.py +0 -0
  127. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/_deprecated.py +0 -0
  128. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip/Makefile +0 -0
  129. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip/README.md +0 -0
  130. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip/benchmark.py +0 -0
  131. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip/compare.py +0 -0
  132. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip/data.md +0 -0
  133. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip/output.py +0 -0
  134. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip/review.ipynb +0 -0
  135. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/cocip-fortran/README.md +0 -0
  136. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/north-atlantic-study/.gcloudignore +0 -0
  137. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/north-atlantic-study/README.md +0 -0
  138. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/north-atlantic-study/support.py +0 -0
  139. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/benchmark/north-atlantic-study/validate.py +0 -0
  140. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/fixtures/cocip-met.py +0 -0
  141. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/fixtures/cocip-met2.py +0 -0
  142. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/fixtures/ecmwf-met.py +0 -0
  143. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/fixtures/gfs-met.py +0 -0
  144. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/__init__.py +0 -0
  145. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/conftest.py +0 -0
  146. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/NOAA_Solar_Calculations_day.csv +0 -0
  147. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/cocip-contrail-output.json +0 -0
  148. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/cocip-contrail-output2.json +0 -0
  149. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/cocip-flight-output.json +0 -0
  150. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/cocip-flight-output2.json +0 -0
  151. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/cocip-flight-statistics.json +0 -0
  152. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/cocip-output-contrail-edges.json +0 -0
  153. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/cocip-output-grid-cirrus-summary.json +0 -0
  154. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/flight-cocip2.csv +0 -0
  155. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/flight-meridian.csv +0 -0
  156. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/flight-metadata.json +0 -0
  157. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/flight.csv +0 -0
  158. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/met-accf-pl.nc +0 -0
  159. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/met-accf-sl.nc +0 -0
  160. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/met-ecmwf-pl.nc +0 -0
  161. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/met-ecmwf-sl.nc +0 -0
  162. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/met-era5-cocip1.nc +0 -0
  163. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/met-era5-cocip2.nc +0 -0
  164. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/met-gfs.nc +0 -0
  165. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/polygon-bug.nc +0 -0
  166. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/rad-era5-cocip1.nc +0 -0
  167. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/rad-era5-cocip2.nc +0 -0
  168. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/static/rad-gfs.nc +0 -0
  169. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_accf.py +0 -0
  170. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_cache.py +0 -0
  171. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_cocip.py +0 -0
  172. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_cocip_grid.py +0 -0
  173. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_cocip_grid_parity.py +0 -0
  174. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_cocip_radiative_forcing.py +0 -0
  175. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_cocip_uncertainty.py +0 -0
  176. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_coordinates.py +0 -0
  177. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_datalib.py +0 -0
  178. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_ecmwf.py +0 -0
  179. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_emissions.py +0 -0
  180. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_fleet.py +0 -0
  181. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_flight.py +0 -0
  182. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_fuel.py +0 -0
  183. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_geo.py +0 -0
  184. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_gfs.py +0 -0
  185. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_grid_to_netcdf.py +0 -0
  186. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_humidity_scaling.py +0 -0
  187. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_init.py +0 -0
  188. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_interpolation.py +0 -0
  189. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_met.py +0 -0
  190. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_met_cache.py +0 -0
  191. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_models.py +0 -0
  192. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_pcc.py +0 -0
  193. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_polygons.py +0 -0
  194. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_sac_issr.py +0 -0
  195. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_tau_cirrus.py +0 -0
  196. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_thermo_sac.py +0 -0
  197. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_units.py +0 -0
  198. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_utils.py +0 -0
  199. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_vector.py +0 -0
  200. {pycontrails-0.40.0 → pycontrails-0.40.1}/tests/unit/test_zarr.py +0 -0
@@ -50,7 +50,7 @@ jobs:
50
50
  CIBW_TEST_EXTRAS: "complete,dev"
51
51
  CIBW_TEST_COMMAND: >
52
52
  mv {project}/pycontrails {project}/pycontrails-bak &&
53
- python -m pytest {project}/tests &&
53
+ python -m pytest {project}/tests -vv &&
54
54
  mv {project}/pycontrails-bak {project}/pycontrails
55
55
 
56
56
  - uses: actions/upload-artifact@v3
@@ -91,6 +91,7 @@ jobs:
91
91
  verify-metadata: true
92
92
 
93
93
  upload_pypi:
94
+ if: ${{ github.event_name == 'release' }}
94
95
  needs: [build_wheels, build_sdist, check-main-test-status]
95
96
  runs-on: ubuntu-latest
96
97
  steps:
@@ -101,7 +102,6 @@ jobs:
101
102
 
102
103
  - name: Publish distribution 📦 to PyPI
103
104
  uses: pypa/gh-action-pypi-publish@release/v1
104
- if: ${{ github.ref == 'refs/heads/main' && github.event_name == 'release' }}
105
105
  with:
106
106
  user: __token__
107
107
  password: ${{ secrets.PYPI_API_TOKEN }}
@@ -126,4 +126,4 @@ jobs:
126
126
  ruff pycontrails tests
127
127
  mypy pycontrails
128
128
  pydocstyle pycontrails --verbose
129
- pytest tests/unit
129
+ pytest tests/unit -vv
@@ -1,6 +1,13 @@
1
1
 
2
2
  # Changelog
3
3
 
4
+ ## v0.40.1
5
+
6
+ #### Fixes
7
+
8
+ - Use [oldest-supported-numpy](https://pypi.org/project/oldest-supported-numpy/) for building pycontrails wheels. This allows pycontrails to be compatible with environments that use old versions of numpy. The [pycontrails v0.40.0 wheels](https://pypi.org/project/pycontrails/0.40.0/#files) are not compatible with numpy 1.22.
9
+ - Fix a unit test (`test_dtypes.py::test_issr_sac_grid_output`) that occasionally hangs.
10
+
4
11
  ## v0.40.0
5
12
 
6
13
  Support scipy 1.10, improve interpolation performance, and fix many windows issues.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycontrails
3
- Version: 0.40.0
3
+ Version: 0.40.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
@@ -382,6 +382,22 @@
382
382
  langid = {english}
383
383
  }
384
384
 
385
+ @inproceedings{schumannContrailCirrusPrediction2010,
386
+ title = {A Contrail Cirrus Prediction Tool},
387
+ booktitle = {Proceedings of the 2nd {{International Conference}} on {{Transport}}, {{Atmosphere}} and {{Climate}} ({{TAC-2}})},
388
+ author = {Schumann, Ulrich},
389
+ editor = {Sausen, Robert and van Velthoven, Peter F. J. and Br{\"u}ning, Claus and Blum, Anja},
390
+ year = {2010},
391
+ volume = {2010--10},
392
+ pages = {69--74},
393
+ publisher = {{DLR}},
394
+ address = {{Aachen, Germany and Maastricht, The Netherlands}},
395
+ issn = {1434-8454},
396
+ urldate = {2023-04-16},
397
+ abstract = {An new ``Contrail Cirrus Prediction Tool'' (CoCiP) has been developed to simulate contrail cirrus resulting from a single flight as well as from a fleet of cruising aircraft, flight by flight, regionally or globally. The method predicts contrail cirrus for given air traffic and weather prediction data. The method describes the life cycle of each contrail individually using a Lagrangian Gaussian plume model with simple bulk contrail ice properties, without feedback to meteorology. Contrails are initiated when the Schmidt-Appleman criterion is satisfied and when the ambient atmosphere is humid enough to allow for contrail persistence. The initial plume properties reflect properties of the originating aircraft. The evolution of individual contrails of cruising aircraft is computed using wind, temperature, humidity, and ice water content from numerical weather prediction (NWP) output. The plume trajectory follows horizontal and vertical wind. The model simulates shear and turbulence driven spreading, ice water content as a function of ice supersaturation, and some ice particle loss processes (turbulent mixing, aggregation and sedimentation). Radiative cloud forcing is estimated for the sum of all contrails using radiative fluxes without contrails from NWP output. The tool is kept simple to allow for efficient contrail simulations. The method has been tested for case studies with some comparisons to observations. The most critical input parameter is the NWP humidity field. The results compare favourably with observations and support interpretations of insitu, satellite and lidar observed aviation impact on cirrus clouds. CoCiP can be used to predict and minimize the climate impact of contrails.},
398
+ langid = {english}
399
+ }
400
+
385
401
  @article{schumannContrailCirrusPrediction2012,
386
402
  title = {A Contrail Cirrus Prediction Model},
387
403
  author = {Schumann, U.},
@@ -431,6 +447,23 @@
431
447
  langid = {english}
432
448
  }
433
449
 
450
+ @inproceedings{schumannDeterminationContrailsSatellite1990,
451
+ title = {Determination of {{Contrails}} from {{Satellite Data}} and {{Observational Results}}},
452
+ booktitle = {Air {{Traffic}} and the {{Environment}} \textemdash{} {{Background}}, {{Tendencies}} and {{Potential Global Atmospheric Effects}}},
453
+ author = {Schumann, U. and Wendling, P.},
454
+ editor = {Schumann, U.},
455
+ year = {1990},
456
+ series = {Lecture {{Notes}} in {{Engineering}}},
457
+ pages = {138--153},
458
+ publisher = {{Springer}},
459
+ address = {{Berlin, Heidelberg}},
460
+ doi = {10.1007/978-3-642-51686-3_9},
461
+ abstract = {Condensation trails (contrails) from air traffic in the upper troposphere may have an effect on the earth's climate. We first discuss the state of knowledge. Then some results of radiation transfer calculations are reported which help to estimate the order of magnitude of the effects of cirrus clouds and water vapour in comparison to doubling of the concentration of CO2. The main part of the paper describes the analysis of contrails from satellite data. Based on NOAA-AVHRR data we present results for a specific case where contrails covered a few percent of a region including southern Germany and the Alps. Preliminary results are reported for 99 further cases. A pattern recognition method is described to identify contrails and the related cloud cover automatically. Laser observations reflect contrail cross-sections which are several km in width and about 700 m thick. The optical thickness reaches values up to 1.},
462
+ isbn = {978-3-642-51686-3},
463
+ langid = {english},
464
+ keywords = {Advanced Very High Resolution Radiometer,Cloud Cover,Optical Thickness,Sunshine Duration}
465
+ }
466
+
434
467
  @article{schumannEffectiveRadiusIce2011,
435
468
  title = {Effective {{Radius}} of {{Ice Particles}} in {{Cirrus}} and {{Contrails}}},
436
469
  author = {Schumann, U. and Mayer, B. and Gierens, K. and Unterstrasser, S. and Jessberger, P. and Petzold, A. and Voigt, C. and Gayet, J.-F.},
@@ -496,6 +529,19 @@
496
529
  langid = {english}
497
530
  }
498
531
 
532
+ @incollection{schumannPotentialReduceClimate2011a,
533
+ title = {Potential to Reduce the Climate Impact of Aviation by Flight Level Changes},
534
+ booktitle = {3rd {{AIAA Atmospheric Space Environments Conference}}},
535
+ author = {Schumann, Ulrich and Graf, Kaspar and Mannstein, Hermann},
536
+ year = {2011},
537
+ month = jun,
538
+ series = {Fluid {{Dynamics}} and {{Co-located Conferences}}},
539
+ publisher = {{American Institute of Aeronautics and Astronautics}},
540
+ doi = {10.2514/6.2011-3376},
541
+ urldate = {2023-04-16},
542
+ keywords = {Aviation,Base of Aircraft Data,Contrails,Cruise Altitude,Earth,Earth Atmosphere,Fuel Consumption,Greenhouse Effect,Numerical Weather Prediction,Optical Depth}
543
+ }
544
+
499
545
  @article{schumannPropertiesIndividualContrails2017,
500
546
  title = {Properties of Individual Contrails: A Compilation of Observations and Some Comparisons},
501
547
  shorttitle = {Properties of Individual Contrails},
@@ -678,6 +724,23 @@
678
724
  howpublished = {http://solardat.uoregon.edu/SolarRadiationBasics.html}
679
725
  }
680
726
 
727
+ @article{voigtInsituObservationsYoung2010,
728
+ title = {In-Situ Observations of Young Contrails \textendash{} Overview and Selected Results from the {{CONCERT}} Campaign},
729
+ author = {Voigt, C. and Schumann, U. and Jurkat, T. and Sch{\"a}uble, D. and Schlager, H. and Petzold, A. and Gayet, J.-F. and Kr{\"a}mer, M. and Schneider, J. and Borrmann, S. and Schmale, J. and Jessberger, P. and Hamburger, T. and Lichtenstern, M. and Scheibe, M. and Gourbeyre, C. and Meyer, J. and K{\"u}bbeler, M. and Frey, W. and Kalesse, H. and Butler, T. and Lawrence, M. G. and Holz{\"a}pfel, F. and Arnold, F. and Wendisch, M. and D{\"o}pelheuer, A. and Gottschaldt, K. and Baumann, R. and Z{\"o}ger, M. and S{\"o}lch, I. and Rautenhaus, M. and D{\"o}rnbrack, A.},
730
+ year = {2010},
731
+ month = sep,
732
+ journal = {Atmospheric Chemistry and Physics},
733
+ volume = {10},
734
+ number = {18},
735
+ pages = {9039--9056},
736
+ publisher = {{Copernicus GmbH}},
737
+ issn = {1680-7316},
738
+ doi = {10.5194/acp-10-9039-2010},
739
+ urldate = {2023-04-16},
740
+ abstract = {Lineshaped contrails were detected with the research aircraft Falcon during the CONCERT \textendash{} CONtrail and Cirrus ExpeRimenT \textendash{} campaign in October/November 2008. The Falcon was equipped with a set of instruments to measure the particle size distribution, shape, extinction and chemical composition as well as trace gas mixing ratios of sulfur dioxide (SO2), reactive nitrogen and halogen species (NO, NOy, HNO3, HONO, HCl), ozone (O3) and carbon monoxide (CO). During 12 mission flights over Europe, numerous contrails, cirrus clouds and a volcanic aerosol layer were probed at altitudes between 8.5 and 11.6 km and at temperatures above 213 K. 22 contrails from 11 different aircraft were observed near and below ice saturation. The observed NO mixing ratios, ice crystal and soot number densities are compared to a process based contrail model. On 19 November 2008 the contrail from a CRJ-2 aircraft was penetrated in 10.1 km altitude at a temperature of 221 K. The contrail had mean ice crystal number densities of 125 cm-3 with effective radii reff of 2.6 {$\mu$}m. The presence of particles with r{$>$}50 {$\mu$}m in the less than 2 min old contrail suggests that natural cirrus crystals were entrained in the contrail. Mean HONO/NO (HONO/NOy) ratios of 0.037 (0.024) and the fuel sulfur conversion efficiency to H2SO4 (\&epsilon;S{$\downarrow$}) of 2.9 \% observed in the CRJ-2 contrail are in the range of previous measurements in the gaseous aircraft exhaust. On 31 October 2010 aviation NO emissions could have contributed by more than 40\% to the regional scale NO levels in the mid-latitude lowest stratosphere. The CONCERT observations help to better quantify the climate impact from contrails and will be used to investigate the chemical processing of trace gases on contrails.},
741
+ langid = {english}
742
+ }
743
+
681
744
  @article{wasiukAircraftPerformanceModel2015,
682
745
  title = {An Aircraft Performance Model Implementation for the Estimation of Global and Regional Commercial Aviation Fuel Burn and Emissions},
683
746
  author = {Wasiuk, D. K. and Lowenberg, M. H. and Shallcross, D. E.},
@@ -14,9 +14,8 @@
14
14
  "\n",
15
15
  "Support provided for:\n",
16
16
  "\n",
17
- "- [ERA5](https://www.ecmwf.int/en/forecasts/dataset/ecmwf-reanalysis-v5) via the [Copernicus Data Store (CDS)](https://cds.climate.copernicus.eu/) and locally downloaded files\n",
18
- "- [HRES](https://confluence.ecmwf.int/display/FUG/HRES+-+High-Resolution+Forecast) and [ENS](https://confluence.ecmwf.int/display/FUG/ENS+-+Ensemble+Forecasts?src=contextnavpagetreemode) via [MARS](https://confluence.ecmwf.int/display/UDOC/MARS+user+documentation) and locally downloaded files\n",
19
- "- [IFS](https://www.ecmwf.int/en/publications/ifs-documentation) for locally downloaded files\n"
17
+ "- [ERA5](https://www.ecmwf.int/en/forecasts/dataset/ecmwf-reanalysis-v5) via the [Copernicus Data Store (CDS)](https://cds.climate.copernicus.eu/) using [cdsapi](https://github.com/ecmwf/cdsapi) or user provided files\n",
18
+ "- [HRES](https://confluence.ecmwf.int/display/FUG/HRES+-+High-Resolution+Forecast) and [ENS](https://confluence.ecmwf.int/display/FUG/ENS+-+Ensemble+Forecasts?src=contextnavpagetreemode) via [MARS](https://confluence.ecmwf.int/display/UDOC/MARS+user+documentation) using [ecmwf-api-client](https://github.com/ecmwf/ecmwf-api-client) or user provided files"
20
19
  ]
21
20
  },
22
21
  {
@@ -28,7 +27,7 @@
28
27
  "### Access\n",
29
28
  "\n",
30
29
  "- Requires account with [Copernicus Data Portal](https://cds.climate.copernicus.eu/cdsapp#!/home)\n",
31
- "- Refer to the [CDS API Documentation](https://github.com/ecmwf/cdsapi#configure) for how to create `~/.cdsapirc` file to configure access to CDS.\n",
30
+ "- Provide `url` and `key` credentials on input, or refer to the [CDS API Documentation](https://github.com/ecmwf/cdsapi#configure) for how to create `~/.cdsapirc` file to configure access.\n",
32
31
  "\n",
33
32
  "### Reference\n",
34
33
  "\n",
@@ -82,6 +81,8 @@
82
81
  " time=\"2022-03-01 00:00:00\",\n",
83
82
  " variables=[\"t\", \"q\", \"u\", \"v\", \"w\", \"ciwc\", \"z\", \"cc\"], # supports CF name or short names\n",
84
83
  " pressure_levels=[300, 250, 200],\n",
84
+ " # url=\"https://cds.climate.copernicus.eu/api/v2\",\n",
85
+ " # key=\"<key>\"\n",
85
86
  ")\n",
86
87
  "era5"
87
88
  ]
@@ -123,6 +124,8 @@
123
124
  " \"cc\",\n",
124
125
  " ], # supports CF name or short names\n",
125
126
  " pressure_levels=[300, 250, 200],\n",
127
+ " # url=\"https://cds.climate.copernicus.eu/api/v2\",\n",
128
+ " # key=\"<key>\"\n",
126
129
  ")\n",
127
130
  "era5"
128
131
  ]
@@ -1412,7 +1415,12 @@
1412
1415
  }
1413
1416
  ],
1414
1417
  "source": [
1415
- "era5 = ERA5(time=(\"2022-03-01 00:00:00\", \"2022-03-01 03:00:00\"), variables=[\"tsr\", \"ttr\"])\n",
1418
+ "era5 = ERA5(\n",
1419
+ " time=(\"2022-03-01 00:00:00\", \"2022-03-01 03:00:00\"),\n",
1420
+ " variables=[\"tsr\", \"ttr\"],\n",
1421
+ " # url=\"https://cds.climate.copernicus.eu/api/v2\",\n",
1422
+ " # key=\"<key>\"\n",
1423
+ ")\n",
1416
1424
  "era5"
1417
1425
  ]
1418
1426
  },
@@ -2061,7 +2069,7 @@
2061
2069
  "Users within ECMWF Member and Co-operating States may contact their Computing Representative to obtain access to MARS. \n",
2062
2070
  "All other users may [request a username and password](https://accounts.ecmwf.int/auth/realms/ecmwf/protocol/openid-connect/registrations?client_id=apps&response_type=code&scope=openid%20email&redirect_uri=https://www.ecmwf.int) and then [get an api key](https://api.ecmwf.int/v1/key/).\n",
2063
2071
  "\n",
2064
- "- See [ECMWF API Client documentatino](https://github.com/ecmwf/ecmwf-api-client#configure) to configure local `~/.ecmwfapirc` file:\n",
2072
+ "Provide `url`, `key`, and `email` credentials on input, or see [ECMWF API Client documentation](https://github.com/ecmwf/ecmwf-api-client#configure) to configure local `~/.ecmwfapirc` file:\n",
2065
2073
  "\n",
2066
2074
  "```json\n",
2067
2075
  "{\n",
@@ -2073,7 +2081,7 @@
2073
2081
  "\n",
2074
2082
  "### Reference\n",
2075
2083
  "\n",
2076
- "- [HRES](https://confluence.ecmwf.int/display/FUG/HRES+-+High-Resolution+Forecast) Hi-res forecast\n",
2084
+ "- [HRES](https://confluence.ecmwf.int/display/FUG/HRES+-+High-Resolution+Forecast) High resolution forecast\n",
2077
2085
  "- [ENS](https://confluence.ecmwf.int/display/FUG/ENS+-+Ensemble+Forecasts?src=contextnavpagetreemode) Ensemble forecast"
2078
2086
  ]
2079
2087
  },
@@ -2127,6 +2135,9 @@
2127
2135
  " variables=[\"t\", \"q\", \"u\", \"v\", \"w\", \"z\"],\n",
2128
2136
  " pressure_levels=[300, 250, 200],\n",
2129
2137
  " grid=1,\n",
2138
+ " # url=\"https://api.ecmwf.int/v1\",\n",
2139
+ " # key=\"<key>\"\n",
2140
+ " # email=\"<email>\"\n",
2130
2141
  ")\n",
2131
2142
  "hres"
2132
2143
  ]
@@ -3240,7 +3251,14 @@
3240
3251
  "metadata": {},
3241
3252
  "outputs": [],
3242
3253
  "source": [
3243
- "hres = HRES(time=time, variables=[\"tsr\", \"ttr\"], grid=1)"
3254
+ "hres = HRES(\n",
3255
+ " time=time,\n",
3256
+ " variables=[\"tsr\", \"ttr\"],\n",
3257
+ " grid=1,\n",
3258
+ " # url=\"https://api.ecmwf.int/v1\",\n",
3259
+ " # key=\"<key>\"\n",
3260
+ " # email=\"<email>\"\n",
3261
+ ")"
3244
3262
  ]
3245
3263
  },
3246
3264
  {
@@ -3934,6 +3952,9 @@
3934
3952
  " variables=[\"t\", \"q\"],\n",
3935
3953
  " pressure_levels=[300, 250, 200],\n",
3936
3954
  " forecast_time=\"2022-03-25 12:00:00\",\n",
3955
+ " # url=\"https://api.ecmwf.int/v1\",\n",
3956
+ " # key=\"<key>\"\n",
3957
+ " # email=\"<email>\"\n",
3937
3958
  ")\n",
3938
3959
  "hres"
3939
3960
  ]
@@ -3944,6 +3965,8 @@
3944
3965
  "source": [
3945
3966
  "## IFS\n",
3946
3967
  "\n",
3968
+ "> In development\n",
3969
+ "\n",
3947
3970
  "Integrated Forecasting System from ECMWF\n",
3948
3971
  "\n",
3949
3972
  "- [IFS Documentation](https://www.ecmwf.int/en/publications/ifs-documentation)\n",
@@ -4118,6 +4141,8 @@
4118
4141
  " variables=variables,\n",
4119
4142
  " pressure_levels=[300, 250, 150],\n",
4120
4143
  " cachestore=gcp,\n",
4144
+ " # url=\"https://cds.climate.copernicus.eu/api/v2\",\n",
4145
+ " # key=\"<key>\"\n",
4121
4146
  ")"
4122
4147
  ]
4123
4148
  },
@@ -723,7 +723,7 @@
723
723
  }
724
724
  ],
725
725
  "source": [
726
- "# Air pressure at waypoint, in Pa\n",
726
+ "# Altitude, in ft\n",
727
727
  "fl.altitude_ft"
728
728
  ]
729
729
  },
@@ -1,4 +1,4 @@
1
1
  # file generated by setuptools_scm
2
2
  # don't change, don't track in version control
3
- __version__ = version = '0.40.0'
4
- __version_tuple__ = version_tuple = (0, 40, 0)
3
+ __version__ = version = '0.40.1'
4
+ __version_tuple__ = version_tuple = (0, 40, 1)
@@ -94,7 +94,14 @@ class MetBase(ABC, Generic[XArrayType]):
94
94
  """
95
95
  for dim in self.dim_order:
96
96
  if dim not in self.data.dims:
97
- raise ValueError(f"Meteorology data must contain dimension '{dim}'")
97
+ if dim == "level":
98
+ raise ValueError(
99
+ f"Meteorology data must contain dimension '{dim}'. "
100
+ "For single level data, set 'level' coordinate to constant -1 "
101
+ "using `ds = ds.expand_dims({'level': [-1]})`"
102
+ )
103
+ else:
104
+ raise ValueError(f"Meteorology data must contain dimension '{dim}'.")
98
105
 
99
106
  def _validate_longitude(self) -> None:
100
107
  """Check longitude bounds.
@@ -220,11 +227,12 @@ class MetBase(ABC, Generic[XArrayType]):
220
227
  def _preprocess_dims(self, wrap_longitude: bool) -> None:
221
228
  """Confirm DataArray or Dataset include required dimension in a consistent format.
222
229
 
223
- Expects DataArray or Dataset to contain dimensions "latitude", "longitude", "time",
224
- and "level" (in hPa/mbar). Adds additional coordinate variables ``air_pressure``
225
- and ``altitude`` coordinates mapped to "level" dimension if "level" > 0.
230
+ Expects DataArray or Dataset to contain dimensions ``latitude`, ``longitude``, ``time``,
231
+ and ``level`` (in hPa/mbar).
232
+ Adds additional coordinate variables ``air_pressure`` and ``altitude`` coordinates
233
+ mapped to "level" dimension if "level" > 0.
226
234
 
227
- Set "level" to -1 to signify surface level.
235
+ Set ``level`` to -1 to signify single level.
228
236
 
229
237
  .. versionchanged:: 0.40.0
230
238
 
@@ -280,7 +288,7 @@ class MetBase(ABC, Generic[XArrayType]):
280
288
  dim_order = self.dim_order + [d for d in self.data.dims if d not in self.dim_order]
281
289
  self.data = self.data.transpose(*dim_order)
282
290
 
283
- # surface level data
291
+ # single level data
284
292
  if self.is_single_level:
285
293
  # add level attributes to reflect surface level
286
294
  self.data["level"].attrs.update(units="", long_name="Single Level")
@@ -147,12 +147,13 @@ class Model(ABC):
147
147
  #: Require meteorology is not None on __init__()
148
148
  met_required: bool = False
149
149
 
150
- #: Required meteorology variables
151
- #: Each element in the list is a MetVariable or a list[MetVariable].
152
- #: If a list[MetVariable], only one variable in the list is required by input :attr:`met`.
150
+ #: Required meteorology pressure level variables.
151
+ #: Each element in the list is a :class:`MetVariable` or a ``tuple[MetVariable]``.
152
+ #: If element is a ``tuple[MetVariable]``, the variable depends on the data source.
153
+ #: Only one variable in the tuple is required.
153
154
  met_variables: tuple[MetVariable | tuple[MetVariable, ...], ...]
154
155
 
155
- #: Minimal set of required parameters if processing already complete on met input.
156
+ #: Set of required parameters if processing already complete on ``met`` input.
156
157
  processed_met_variables: tuple[MetVariable, ...]
157
158
 
158
159
  #: Optional meteorology variables