metrust 0.2.9__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. {metrust-0.2.9 → metrust-0.3.0}/Cargo.lock +6 -6
  2. {metrust-0.2.9 → metrust-0.3.0}/Cargo.toml +1 -1
  3. {metrust-0.2.9 → metrust-0.3.0}/PKG-INFO +1 -1
  4. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/Cargo.toml +1 -1
  5. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/Cargo.toml +1 -1
  6. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/Cargo.toml +1 -1
  7. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-math/Cargo.toml +1 -1
  8. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/Cargo.toml +1 -1
  9. {metrust-0.2.9 → metrust-0.3.0}/docs/index.md +1 -1
  10. {metrust-0.2.9 → metrust-0.3.0}/pyproject.toml +1 -1
  11. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/calc/__init__.py +35 -19
  12. {metrust-0.2.9 → metrust-0.3.0}/.github/workflows/ci.yml +0 -0
  13. {metrust-0.2.9 → metrust-0.3.0}/.github/workflows/docs.yml +0 -0
  14. {metrust-0.2.9 → metrust-0.3.0}/.github/workflows/release.yml +0 -0
  15. {metrust-0.2.9 → metrust-0.3.0}/.gitignore +0 -0
  16. {metrust-0.2.9 → metrust-0.3.0}/README.md +0 -0
  17. {metrust-0.2.9 → metrust-0.3.0}/VERIFICATION.md +0 -0
  18. {metrust-0.2.9 → metrust-0.3.0}/benches/bench_hrrr.py +0 -0
  19. {metrust-0.2.9 → metrust-0.3.0}/benches/bench_hrrr_vs_metpy.py +0 -0
  20. {metrust-0.2.9 → metrust-0.3.0}/benches/bench_python.py +0 -0
  21. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/benches/calc_bench.rs +0 -0
  22. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/atmo.rs +0 -0
  23. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/kinematics.rs +0 -0
  24. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/mod.rs +0 -0
  25. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/severe.rs +0 -0
  26. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/smooth.rs +0 -0
  27. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/thermo.rs +0 -0
  28. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/utils.rs +0 -0
  29. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/calc/wind.rs +0 -0
  30. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/constants.rs +0 -0
  31. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/interpolate/mod.rs +0 -0
  32. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/gempak.rs +0 -0
  33. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/gempak_dm.rs +0 -0
  34. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/gempak_sounding.rs +0 -0
  35. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/gempak_surface.rs +0 -0
  36. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/gini.rs +0 -0
  37. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/level3.rs +0 -0
  38. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/metar.rs +0 -0
  39. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/mod.rs +0 -0
  40. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/station.rs +0 -0
  41. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/io/wpc.rs +0 -0
  42. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/lib.rs +0 -0
  43. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/plots/mod.rs +0 -0
  44. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/projections.rs +0 -0
  45. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/src/units.rs +0 -0
  46. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/tests/test_gempak.rs +0 -0
  47. {metrust-0.2.9 → metrust-0.3.0}/crates/metrust/tests/test_new_functions.rs +0 -0
  48. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/composite.rs +0 -0
  49. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/cache.rs +0 -0
  50. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/catalog.rs +0 -0
  51. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/client.rs +0 -0
  52. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/fallback.rs +0 -0
  53. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/idx.rs +0 -0
  54. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/mod.rs +0 -0
  55. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/sources.rs +0 -0
  56. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/download/streaming.rs +0 -0
  57. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/dynamics.rs +0 -0
  58. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/error.rs +0 -0
  59. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/grid.rs +0 -0
  60. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/mod.rs +0 -0
  61. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/ops.rs +0 -0
  62. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/parser.rs +0 -0
  63. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/search.rs +0 -0
  64. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/streaming.rs +0 -0
  65. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/tables.rs +0 -0
  66. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/tests.rs +0 -0
  67. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/unpack.rs +0 -0
  68. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/grib2/writer.rs +0 -0
  69. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/gridmath.rs +0 -0
  70. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/lib.rs +0 -0
  71. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/metfuncs.rs +0 -0
  72. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/cfs.rs +0 -0
  73. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/ecmwf.rs +0 -0
  74. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/era5.rs +0 -0
  75. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/gefs.rs +0 -0
  76. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/gfs.rs +0 -0
  77. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/href.rs +0 -0
  78. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/hrrr.rs +0 -0
  79. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/hrrr_ak.rs +0 -0
  80. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/latest.rs +0 -0
  81. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/mod.rs +0 -0
  82. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/mrms.rs +0 -0
  83. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/nam.rs +0 -0
  84. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/nbm.rs +0 -0
  85. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/rap.rs +0 -0
  86. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/rrfs.rs +0 -0
  87. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/rtma.rs +0 -0
  88. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/sref.rs +0 -0
  89. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/urma.rs +0 -0
  90. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/models/wpc.rs +0 -0
  91. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/products.rs +0 -0
  92. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/projection.rs +0 -0
  93. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/regrid.rs +0 -0
  94. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/ansi.rs +0 -0
  95. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/colormap.rs +0 -0
  96. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/contour.rs +0 -0
  97. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/cross_section.rs +0 -0
  98. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/encode.rs +0 -0
  99. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/filled_contour.rs +0 -0
  100. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/hodograph.rs +0 -0
  101. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/mod.rs +0 -0
  102. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/overlay.rs +0 -0
  103. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/raster.rs +0 -0
  104. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/skewt.rs +0 -0
  105. {metrust-0.2.9 → metrust-0.3.0}/crates/rustmet-core/src/render/station.rs +0 -0
  106. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/error.rs +0 -0
  107. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/field.rs +0 -0
  108. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/lib.rs +0 -0
  109. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/meta.rs +0 -0
  110. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/projection.rs +0 -0
  111. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/radial.rs +0 -0
  112. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/site.rs +0 -0
  113. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/sounding.rs +0 -0
  114. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-field/src/time.rs +0 -0
  115. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-math/src/composite.rs +0 -0
  116. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-math/src/dynamics.rs +0 -0
  117. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-math/src/gridmath.rs +0 -0
  118. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-math/src/lib.rs +0 -0
  119. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-math/src/regrid.rs +0 -0
  120. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-math/src/thermo.rs +0 -0
  121. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/cells.rs +0 -0
  122. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/color_table.rs +0 -0
  123. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/derived.rs +0 -0
  124. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/detection.rs +0 -0
  125. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/level2.rs +0 -0
  126. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/lib.rs +0 -0
  127. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/products.rs +0 -0
  128. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/render.rs +0 -0
  129. {metrust-0.2.9 → metrust-0.3.0}/crates/wx-radar/src/sites.rs +0 -0
  130. {metrust-0.2.9 → metrust-0.3.0}/docs/api/atmospheric.md +0 -0
  131. {metrust-0.2.9 → metrust-0.3.0}/docs/api/grid-composites.md +0 -0
  132. {metrust-0.2.9 → metrust-0.3.0}/docs/api/io.md +0 -0
  133. {metrust-0.2.9 → metrust-0.3.0}/docs/api/kinematics.md +0 -0
  134. {metrust-0.2.9 → metrust-0.3.0}/docs/api/moisture.md +0 -0
  135. {metrust-0.2.9 → metrust-0.3.0}/docs/api/severe.md +0 -0
  136. {metrust-0.2.9 → metrust-0.3.0}/docs/api/smoothing.md +0 -0
  137. {metrust-0.2.9 → metrust-0.3.0}/docs/api/thermodynamics.md +0 -0
  138. {metrust-0.2.9 → metrust-0.3.0}/docs/api/units.md +0 -0
  139. {metrust-0.2.9 → metrust-0.3.0}/docs/api/wind.md +0 -0
  140. {metrust-0.2.9 → metrust-0.3.0}/docs/compatibility.md +0 -0
  141. {metrust-0.2.9 → metrust-0.3.0}/docs/guides/arrays.md +0 -0
  142. {metrust-0.2.9 → metrust-0.3.0}/docs/guides/installation.md +0 -0
  143. {metrust-0.2.9 → metrust-0.3.0}/docs/guides/migration.md +0 -0
  144. {metrust-0.2.9 → metrust-0.3.0}/docs/performance.md +0 -0
  145. {metrust-0.2.9 → metrust-0.3.0}/docs/tutorials/first-grid.md +0 -0
  146. {metrust-0.2.9 → metrust-0.3.0}/docs/tutorials/first-sounding.md +0 -0
  147. {metrust-0.2.9 → metrust-0.3.0}/docs/tutorials/reading-the-numbers.md +0 -0
  148. {metrust-0.2.9 → metrust-0.3.0}/docs/tutorials/recipes.md +0 -0
  149. {metrust-0.2.9 → metrust-0.3.0}/docs/tutorials/weather-101.md +0 -0
  150. {metrust-0.2.9 → metrust-0.3.0}/examples/cookbook_500hpa_grid.py +0 -0
  151. {metrust-0.2.9 → metrust-0.3.0}/examples/cookbook_sounding.py +0 -0
  152. {metrust-0.2.9 → metrust-0.3.0}/examples/sounderpy_dropin.py +0 -0
  153. {metrust-0.2.9 → metrust-0.3.0}/mkdocs.yml +0 -0
  154. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/__init__.py +0 -0
  155. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/constants/__init__.py +0 -0
  156. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/interpolate/__init__.py +0 -0
  157. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/io/__init__.py +0 -0
  158. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/plots/__init__.py +0 -0
  159. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/units.py +0 -0
  160. {metrust-0.2.9 → metrust-0.3.0}/python/metrust/xarray.py +0 -0
  161. {metrust-0.2.9 → metrust-0.3.0}/src/lib.rs +0 -0
  162. {metrust-0.2.9 → metrust-0.3.0}/src/py_atmo.rs +0 -0
  163. {metrust-0.2.9 → metrust-0.3.0}/src/py_constants.rs +0 -0
  164. {metrust-0.2.9 → metrust-0.3.0}/src/py_interpolate.rs +0 -0
  165. {metrust-0.2.9 → metrust-0.3.0}/src/py_io.rs +0 -0
  166. {metrust-0.2.9 → metrust-0.3.0}/src/py_kinematics.rs +0 -0
  167. {metrust-0.2.9 → metrust-0.3.0}/src/py_severe.rs +0 -0
  168. {metrust-0.2.9 → metrust-0.3.0}/src/py_smooth.rs +0 -0
  169. {metrust-0.2.9 → metrust-0.3.0}/src/py_thermo.rs +0 -0
  170. {metrust-0.2.9 → metrust-0.3.0}/src/py_utils.rs +0 -0
  171. {metrust-0.2.9 → metrust-0.3.0}/src/py_wind.rs +0 -0
  172. {metrust-0.2.9 → metrust-0.3.0}/tests/api_audit_calc.md +0 -0
  173. {metrust-0.2.9 → metrust-0.3.0}/tests/api_audit_other.md +0 -0
  174. {metrust-0.2.9 → metrust-0.3.0}/tests/benchmark.py +0 -0
  175. {metrust-0.2.9 → metrust-0.3.0}/tests/test_metpy_dropin_compat.py +0 -0
  176. {metrust-0.2.9 → metrust-0.3.0}/tests/test_python_compat.py +0 -0
  177. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_constants.py +0 -0
  178. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_edge_cases.py +0 -0
  179. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_kinematics.py +0 -0
  180. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_severe_atmo.py +0 -0
  181. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_smooth_interp.py +0 -0
  182. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_thermo.py +0 -0
  183. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_units.py +0 -0
  184. {metrust-0.2.9 → metrust-0.3.0}/tests/verify_wind.py +0 -0
@@ -788,7 +788,7 @@ dependencies = [
788
788
 
789
789
  [[package]]
790
790
  name = "metrust"
791
- version = "0.2.9"
791
+ version = "0.3.0"
792
792
  dependencies = [
793
793
  "chrono",
794
794
  "criterion",
@@ -802,7 +802,7 @@ dependencies = [
802
802
 
803
803
  [[package]]
804
804
  name = "metrust-py"
805
- version = "0.2.9"
805
+ version = "0.3.0"
806
806
  dependencies = [
807
807
  "metrust",
808
808
  "numpy",
@@ -1419,7 +1419,7 @@ dependencies = [
1419
1419
 
1420
1420
  [[package]]
1421
1421
  name = "rustmet-core"
1422
- version = "0.2.9"
1422
+ version = "0.3.0"
1423
1423
  dependencies = [
1424
1424
  "chrono",
1425
1425
  "flate2",
@@ -1934,14 +1934,14 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1934
1934
 
1935
1935
  [[package]]
1936
1936
  name = "wx-field"
1937
- version = "0.2.9"
1937
+ version = "0.3.0"
1938
1938
  dependencies = [
1939
1939
  "chrono",
1940
1940
  ]
1941
1941
 
1942
1942
  [[package]]
1943
1943
  name = "wx-math"
1944
- version = "0.2.9"
1944
+ version = "0.3.0"
1945
1945
  dependencies = [
1946
1946
  "rayon",
1947
1947
  "wx-field",
@@ -1949,7 +1949,7 @@ dependencies = [
1949
1949
 
1950
1950
  [[package]]
1951
1951
  name = "wx-radar"
1952
- version = "0.2.9"
1952
+ version = "0.3.0"
1953
1953
  dependencies = [
1954
1954
  "byteorder",
1955
1955
  "bzip2",
@@ -8,7 +8,7 @@ license = "MIT"
8
8
 
9
9
  [package]
10
10
  name = "metrust-py"
11
- version = "0.2.9"
11
+ version = "0.3.0"
12
12
  edition.workspace = true
13
13
  description = "Python bindings for metrust — a drop-in replacement for MetPy"
14
14
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metrust
3
- Version: 0.2.9
3
+ Version: 0.3.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "metrust"
3
- version = "0.2.9"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  description = "A pure-Rust drop-in replacement for MetPy — meteorological calculations, data I/O, and visualization"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rustmet-core"
3
- version = "0.2.9"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  description = "Pure Rust GRIB2 processor and weather model data library — HRRR, GFS, NAM, RAP"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "wx-field"
3
- version = "0.2.9"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  description = "Shared type foundation for the unified atmospheric engine — fields, projections, metadata"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "wx-math"
3
- version = "0.2.9"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  description = "Meteorological computations and grid math"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "wx-radar"
3
- version = "0.2.9"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  description = "Radar data processing — NEXRAD Level-II parser, PPI renderer, color tables"
6
6
  license = "MIT"
@@ -233,4 +233,4 @@ cape, cin = cape_cin(p, T, Td, prof)
233
233
 
234
234
  ---
235
235
 
236
- *metrust v0.2.9 -- MIT License -- [GitHub](https://github.com/FahrenheitResearch/metrust-py)*
236
+ *metrust v0.3.0 -- MIT License -- [GitHub](https://github.com/FahrenheitResearch/metrust-py)*
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "metrust"
7
- version = "0.2.9"
7
+ version = "0.3.0"
8
8
  description = "Rust-powered drop-in replacement for MetPy -- 150/150 calc functions plus 36 extras, 10-93000x faster"
9
9
  requires-python = ">=3.9"
10
10
  license = {text = "MIT"}
@@ -1814,7 +1814,12 @@ def most_unstable_cape_cin(pressure, temperature, dewpoint, depth=300, **kwargs)
1814
1814
  p = _as_1d(_strip(pressure, "hPa"))
1815
1815
  t = _as_1d(_strip(temperature, "degC"))
1816
1816
  td = _as_1d(_strip(dewpoint, "degC"))
1817
- cape_val, cin_val = _calc.most_unstable_cape_cin(p, t, td)
1817
+ d = _scalar_strip(depth, "hPa") if hasattr(depth, "magnitude") else float(depth)
1818
+ # Find MU parcel within the specified depth, then compute CAPE from it
1819
+ mu_p, mu_t, mu_td = _calc.get_most_unstable_parcel(p, t, td, d)
1820
+ # Find index of MU parcel and compute CAPE from that level up
1821
+ mu_idx = int(np.argmin(np.abs(p - mu_p)))
1822
+ cape_val, cin_val = _calc.surface_based_cape_cin(p[mu_idx:], t[mu_idx:], td[mu_idx:])
1818
1823
  return cape_val * units("J/kg"), cin_val * units("J/kg")
1819
1824
 
1820
1825
 
@@ -2324,8 +2329,8 @@ def bulk_shear(pressure_or_u, u_or_v, v_or_height=None, height=None,
2324
2329
  v_arr = _as_1d(_strip(u_or_v, "m/s"))
2325
2330
  h_arr = _as_1d(_strip(v_or_height, "m"))
2326
2331
 
2327
- # Resolve bottom/top from depth
2328
- bot_val = _scalar_strip(bottom, "m") if bottom is not None else 0.0
2332
+ # Resolve bottom/top from depth (default bottom = first height, matching MetPy)
2333
+ bot_val = _scalar_strip(bottom, "m") if bottom is not None else float(h_arr[0])
2329
2334
  if top is not None:
2330
2335
  top_val = _scalar_strip(top, "m")
2331
2336
  elif depth is not None:
@@ -3614,10 +3619,9 @@ def critical_angle(*args):
3614
3619
  """Critical angle between storm-relative inflow and 0-500m shear.
3615
3620
 
3616
3621
  MetPy form: ``critical_angle(pressure, u, v, height, u_storm, v_storm)``
3617
- Direct form: ``critical_angle(storm_u, storm_v, u_sfc, v_sfc, u_500m, v_500m)``
3618
3622
 
3619
- When called with profile data (MetPy form), surface and 500m values are
3620
- interpolated from the profiles automatically.
3623
+ Computes the angle between the 10m storm-relative inflow vector and
3624
+ the 0-500m shear vector (MetPy-exact algorithm).
3621
3625
 
3622
3626
  Returns
3623
3627
  -------
@@ -3626,25 +3630,37 @@ def critical_angle(*args):
3626
3630
  if len(args) != 6:
3627
3631
  raise TypeError(
3628
3632
  "critical_angle expects 6 positional args: "
3629
- "(pressure, u, v, height, u_storm, v_storm) or "
3630
- "(storm_u, storm_v, u_sfc, v_sfc, u_500m, v_500m)"
3633
+ "(pressure, u, v, height, u_storm, v_storm)"
3631
3634
  )
3632
- # Detect profile form: if 1st arg is array-like with >1 element, it's the profile form
3635
+ # Detect profile form: if 1st arg is array-like with >1 element
3633
3636
  first = np.asarray(args[0].magnitude if hasattr(args[0], "magnitude") else args[0])
3634
3637
  if first.ndim >= 1 and first.size > 1:
3635
3638
  # MetPy profile form: (pressure, u, v, height, u_storm, v_storm)
3636
- _p, u_prof, v_prof, h_prof, storm_u, storm_v = args
3637
- u_arr = _as_1d(_strip(u_prof, "m/s"))
3638
- v_arr = _as_1d(_strip(v_prof, "m/s"))
3639
- h_arr = _as_1d(_strip(h_prof, "m"))
3640
- # Surface values (index 0)
3641
- u_sfc = u_arr[0]
3642
- v_sfc = v_arr[0]
3643
- # Interpolate to 500m AGL
3644
- u_500 = float(np.interp(500.0, h_arr, u_arr))
3645
- v_500 = float(np.interp(500.0, h_arr, v_arr))
3639
+ p_prof, u_prof, v_prof, h_prof, storm_u, storm_v = args
3646
3640
  su = _scalar_strip(storm_u, "m/s")
3647
3641
  sv = _scalar_strip(storm_v, "m/s")
3642
+
3643
+ # 0-500m bulk shear (MetPy uses bulk_shear for this)
3644
+ shr_u, shr_v = bulk_shear(p_prof, u_prof, v_prof, height=h_prof,
3645
+ depth=500.0 * units.m)
3646
+ shr_u_val = float(shr_u.magnitude if hasattr(shr_u, "magnitude") else shr_u)
3647
+ shr_v_val = float(shr_v.magnitude if hasattr(shr_v, "magnitude") else shr_v)
3648
+
3649
+ # Storm motion relative to surface wind (MetPy convention: u_storm - u[0])
3650
+ u_sfc = float(_as_1d(_strip(u_prof, "m/s"))[0])
3651
+ v_sfc = float(_as_1d(_strip(v_prof, "m/s"))[0])
3652
+ inflow_u = su - u_sfc
3653
+ inflow_v = sv - v_sfc
3654
+
3655
+ # Angle between shear vector and inflow vector
3656
+ vshr = np.array([shr_u_val, shr_v_val])
3657
+ vsm = np.array([inflow_u, inflow_v])
3658
+ mag_product = np.linalg.norm(vshr) * np.linalg.norm(vsm)
3659
+ if mag_product < 1e-10:
3660
+ return 0.0 * units.degree
3661
+ cos_angle = np.clip(np.dot(vshr, vsm) / mag_product, -1.0, 1.0)
3662
+ angle_deg = float(np.degrees(np.arccos(cos_angle)))
3663
+ return angle_deg * units.degree
3648
3664
  else:
3649
3665
  # Direct scalar form: (storm_u, storm_v, u_sfc, v_sfc, u_500m, v_500m)
3650
3666
  storm_u, storm_v, u_sfc_q, v_sfc_q, u_500_q, v_500_q = args
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes