metrust 0.2.4__tar.gz → 0.2.6__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.4 → metrust-0.2.6}/Cargo.lock +6 -6
  2. {metrust-0.2.4 → metrust-0.2.6}/Cargo.toml +1 -1
  3. {metrust-0.2.4 → metrust-0.2.6}/PKG-INFO +1 -1
  4. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/Cargo.toml +1 -1
  5. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/Cargo.toml +1 -1
  6. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/Cargo.toml +1 -1
  7. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/Cargo.toml +1 -1
  8. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/Cargo.toml +1 -1
  9. {metrust-0.2.4 → metrust-0.2.6}/docs/index.md +1 -1
  10. {metrust-0.2.4 → metrust-0.2.6}/pyproject.toml +1 -1
  11. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/calc/__init__.py +100 -17
  12. {metrust-0.2.4 → metrust-0.2.6}/tests/test_metpy_dropin_compat.py +5 -2
  13. {metrust-0.2.4 → metrust-0.2.6}/.github/workflows/ci.yml +0 -0
  14. {metrust-0.2.4 → metrust-0.2.6}/.github/workflows/docs.yml +0 -0
  15. {metrust-0.2.4 → metrust-0.2.6}/.github/workflows/release.yml +0 -0
  16. {metrust-0.2.4 → metrust-0.2.6}/.gitignore +0 -0
  17. {metrust-0.2.4 → metrust-0.2.6}/README.md +0 -0
  18. {metrust-0.2.4 → metrust-0.2.6}/VERIFICATION.md +0 -0
  19. {metrust-0.2.4 → metrust-0.2.6}/benches/bench_hrrr.py +0 -0
  20. {metrust-0.2.4 → metrust-0.2.6}/benches/bench_hrrr_vs_metpy.py +0 -0
  21. {metrust-0.2.4 → metrust-0.2.6}/benches/bench_python.py +0 -0
  22. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/benches/calc_bench.rs +0 -0
  23. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/atmo.rs +0 -0
  24. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/kinematics.rs +0 -0
  25. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/mod.rs +0 -0
  26. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/severe.rs +0 -0
  27. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/smooth.rs +0 -0
  28. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/thermo.rs +0 -0
  29. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/utils.rs +0 -0
  30. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/wind.rs +0 -0
  31. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/constants.rs +0 -0
  32. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/interpolate/mod.rs +0 -0
  33. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak.rs +0 -0
  34. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak_dm.rs +0 -0
  35. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak_sounding.rs +0 -0
  36. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak_surface.rs +0 -0
  37. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gini.rs +0 -0
  38. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/level3.rs +0 -0
  39. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/metar.rs +0 -0
  40. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/mod.rs +0 -0
  41. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/station.rs +0 -0
  42. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/wpc.rs +0 -0
  43. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/lib.rs +0 -0
  44. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/plots/mod.rs +0 -0
  45. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/projections.rs +0 -0
  46. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/units.rs +0 -0
  47. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/tests/test_gempak.rs +0 -0
  48. {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/tests/test_new_functions.rs +0 -0
  49. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/composite.rs +0 -0
  50. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/cache.rs +0 -0
  51. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/catalog.rs +0 -0
  52. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/client.rs +0 -0
  53. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/fallback.rs +0 -0
  54. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/idx.rs +0 -0
  55. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/mod.rs +0 -0
  56. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/sources.rs +0 -0
  57. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/streaming.rs +0 -0
  58. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/dynamics.rs +0 -0
  59. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/error.rs +0 -0
  60. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/grid.rs +0 -0
  61. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/mod.rs +0 -0
  62. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/ops.rs +0 -0
  63. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/parser.rs +0 -0
  64. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/search.rs +0 -0
  65. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/streaming.rs +0 -0
  66. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/tables.rs +0 -0
  67. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/tests.rs +0 -0
  68. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/unpack.rs +0 -0
  69. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/writer.rs +0 -0
  70. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/gridmath.rs +0 -0
  71. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/lib.rs +0 -0
  72. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/metfuncs.rs +0 -0
  73. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/cfs.rs +0 -0
  74. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/ecmwf.rs +0 -0
  75. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/era5.rs +0 -0
  76. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/gefs.rs +0 -0
  77. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/gfs.rs +0 -0
  78. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/href.rs +0 -0
  79. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/hrrr.rs +0 -0
  80. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/hrrr_ak.rs +0 -0
  81. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/latest.rs +0 -0
  82. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/mod.rs +0 -0
  83. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/mrms.rs +0 -0
  84. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/nam.rs +0 -0
  85. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/nbm.rs +0 -0
  86. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/rap.rs +0 -0
  87. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/rrfs.rs +0 -0
  88. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/rtma.rs +0 -0
  89. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/sref.rs +0 -0
  90. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/urma.rs +0 -0
  91. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/wpc.rs +0 -0
  92. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/products.rs +0 -0
  93. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/projection.rs +0 -0
  94. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/regrid.rs +0 -0
  95. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/ansi.rs +0 -0
  96. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/colormap.rs +0 -0
  97. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/contour.rs +0 -0
  98. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/cross_section.rs +0 -0
  99. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/encode.rs +0 -0
  100. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/filled_contour.rs +0 -0
  101. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/hodograph.rs +0 -0
  102. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/mod.rs +0 -0
  103. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/overlay.rs +0 -0
  104. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/raster.rs +0 -0
  105. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/skewt.rs +0 -0
  106. {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/station.rs +0 -0
  107. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/error.rs +0 -0
  108. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/field.rs +0 -0
  109. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/lib.rs +0 -0
  110. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/meta.rs +0 -0
  111. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/projection.rs +0 -0
  112. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/radial.rs +0 -0
  113. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/site.rs +0 -0
  114. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/sounding.rs +0 -0
  115. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/time.rs +0 -0
  116. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/composite.rs +0 -0
  117. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/dynamics.rs +0 -0
  118. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/gridmath.rs +0 -0
  119. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/lib.rs +0 -0
  120. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/regrid.rs +0 -0
  121. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/thermo.rs +0 -0
  122. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/cells.rs +0 -0
  123. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/color_table.rs +0 -0
  124. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/derived.rs +0 -0
  125. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/detection.rs +0 -0
  126. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/level2.rs +0 -0
  127. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/lib.rs +0 -0
  128. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/products.rs +0 -0
  129. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/render.rs +0 -0
  130. {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/sites.rs +0 -0
  131. {metrust-0.2.4 → metrust-0.2.6}/docs/api/atmospheric.md +0 -0
  132. {metrust-0.2.4 → metrust-0.2.6}/docs/api/grid-composites.md +0 -0
  133. {metrust-0.2.4 → metrust-0.2.6}/docs/api/io.md +0 -0
  134. {metrust-0.2.4 → metrust-0.2.6}/docs/api/kinematics.md +0 -0
  135. {metrust-0.2.4 → metrust-0.2.6}/docs/api/moisture.md +0 -0
  136. {metrust-0.2.4 → metrust-0.2.6}/docs/api/severe.md +0 -0
  137. {metrust-0.2.4 → metrust-0.2.6}/docs/api/smoothing.md +0 -0
  138. {metrust-0.2.4 → metrust-0.2.6}/docs/api/thermodynamics.md +0 -0
  139. {metrust-0.2.4 → metrust-0.2.6}/docs/api/units.md +0 -0
  140. {metrust-0.2.4 → metrust-0.2.6}/docs/api/wind.md +0 -0
  141. {metrust-0.2.4 → metrust-0.2.6}/docs/compatibility.md +0 -0
  142. {metrust-0.2.4 → metrust-0.2.6}/docs/guides/arrays.md +0 -0
  143. {metrust-0.2.4 → metrust-0.2.6}/docs/guides/installation.md +0 -0
  144. {metrust-0.2.4 → metrust-0.2.6}/docs/guides/migration.md +0 -0
  145. {metrust-0.2.4 → metrust-0.2.6}/docs/performance.md +0 -0
  146. {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/first-grid.md +0 -0
  147. {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/first-sounding.md +0 -0
  148. {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/reading-the-numbers.md +0 -0
  149. {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/recipes.md +0 -0
  150. {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/weather-101.md +0 -0
  151. {metrust-0.2.4 → metrust-0.2.6}/examples/cookbook_500hpa_grid.py +0 -0
  152. {metrust-0.2.4 → metrust-0.2.6}/examples/cookbook_sounding.py +0 -0
  153. {metrust-0.2.4 → metrust-0.2.6}/examples/sounderpy_dropin.py +0 -0
  154. {metrust-0.2.4 → metrust-0.2.6}/mkdocs.yml +0 -0
  155. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/__init__.py +0 -0
  156. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/constants/__init__.py +0 -0
  157. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/interpolate/__init__.py +0 -0
  158. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/io/__init__.py +0 -0
  159. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/plots/__init__.py +0 -0
  160. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/units.py +0 -0
  161. {metrust-0.2.4 → metrust-0.2.6}/python/metrust/xarray.py +0 -0
  162. {metrust-0.2.4 → metrust-0.2.6}/src/lib.rs +0 -0
  163. {metrust-0.2.4 → metrust-0.2.6}/src/py_atmo.rs +0 -0
  164. {metrust-0.2.4 → metrust-0.2.6}/src/py_constants.rs +0 -0
  165. {metrust-0.2.4 → metrust-0.2.6}/src/py_interpolate.rs +0 -0
  166. {metrust-0.2.4 → metrust-0.2.6}/src/py_io.rs +0 -0
  167. {metrust-0.2.4 → metrust-0.2.6}/src/py_kinematics.rs +0 -0
  168. {metrust-0.2.4 → metrust-0.2.6}/src/py_severe.rs +0 -0
  169. {metrust-0.2.4 → metrust-0.2.6}/src/py_smooth.rs +0 -0
  170. {metrust-0.2.4 → metrust-0.2.6}/src/py_thermo.rs +0 -0
  171. {metrust-0.2.4 → metrust-0.2.6}/src/py_utils.rs +0 -0
  172. {metrust-0.2.4 → metrust-0.2.6}/src/py_wind.rs +0 -0
  173. {metrust-0.2.4 → metrust-0.2.6}/tests/api_audit_calc.md +0 -0
  174. {metrust-0.2.4 → metrust-0.2.6}/tests/api_audit_other.md +0 -0
  175. {metrust-0.2.4 → metrust-0.2.6}/tests/benchmark.py +0 -0
  176. {metrust-0.2.4 → metrust-0.2.6}/tests/test_python_compat.py +0 -0
  177. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_constants.py +0 -0
  178. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_edge_cases.py +0 -0
  179. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_kinematics.py +0 -0
  180. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_severe_atmo.py +0 -0
  181. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_smooth_interp.py +0 -0
  182. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_thermo.py +0 -0
  183. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_units.py +0 -0
  184. {metrust-0.2.4 → metrust-0.2.6}/tests/verify_wind.py +0 -0
@@ -788,7 +788,7 @@ dependencies = [
788
788
 
789
789
  [[package]]
790
790
  name = "metrust"
791
- version = "0.2.4"
791
+ version = "0.2.6"
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.4"
805
+ version = "0.2.6"
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.4"
1422
+ version = "0.2.6"
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.4"
1937
+ version = "0.2.6"
1938
1938
  dependencies = [
1939
1939
  "chrono",
1940
1940
  ]
1941
1941
 
1942
1942
  [[package]]
1943
1943
  name = "wx-math"
1944
- version = "0.2.4"
1944
+ version = "0.2.6"
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.4"
1952
+ version = "0.2.6"
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.4"
11
+ version = "0.2.6"
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.4
3
+ Version: 0.2.6
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.4"
3
+ version = "0.2.6"
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.4"
3
+ version = "0.2.6"
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.4"
3
+ version = "0.2.6"
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.4"
3
+ version = "0.2.6"
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.4"
3
+ version = "0.2.6"
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.4 -- MIT License -- [GitHub](https://github.com/FahrenheitResearch/metrust-py)*
236
+ *metrust v0.2.6 -- 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.4"
7
+ version = "0.2.6"
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"}
@@ -1739,25 +1739,64 @@ def moist_static_energy(height, temperature, specific_humidity):
1739
1739
  return result * units("J/kg")
1740
1740
 
1741
1741
 
1742
- def montgomery_streamfunction(theta, pressure, temperature, height):
1743
- """Montgomery streamfunction.
1742
+ def montgomery_streamfunction(height_or_theta, temperature_or_pressure=None,
1743
+ temperature=None, height=None):
1744
+ """Montgomery streamfunction on isentropic surfaces.
1745
+
1746
+ MetPy form: ``montgomery_streamfunction(height, temperature)``
1747
+ Legacy form: ``montgomery_streamfunction(theta, pressure, temperature, height)``
1744
1748
 
1745
1749
  Parameters
1746
1750
  ----------
1747
- theta : Quantity (K)
1748
- pressure : Quantity (pressure)
1749
- temperature : Quantity (K)
1750
1751
  height : Quantity (m)
1752
+ Geopotential height on isentropic surface.
1753
+ temperature : Quantity (K)
1754
+ Temperature on isentropic surface.
1751
1755
 
1752
1756
  Returns
1753
1757
  -------
1754
1758
  Quantity (J/kg)
1755
- """
1756
- result = _vec_call(_calc.montgomery_streamfunction, _strip(theta, "K"), _strip(pressure, "hPa"), _strip(temperature, "K"), _strip(height, "m"))
1757
- return result * units("J/kg")
1759
+ Montgomery streamfunction: M = c_p * T + g * z
1760
+ """
1761
+ if temperature is not None and height is not None:
1762
+ # Explicit keyword form
1763
+ h = temperature_or_pressure # actually height passed as 1st positional
1764
+ t = temperature
1765
+ # Hmm, ambiguous. Let's handle all cases below.
1766
+ pass
1767
+
1768
+ if temperature_or_pressure is not None and temperature is None and height is None:
1769
+ # 2-arg MetPy form: (height, temperature)
1770
+ h_val = _strip(height_or_theta, "m")
1771
+ t_val = _strip(temperature_or_pressure, "K")
1772
+ # M = c_p * T + g * z (MetPy-exact constants)
1773
+ cp = 1004.6662184201462 # J/(kg*K), matches MetPy Cp_d
1774
+ g = 9.80665 # m/s^2
1775
+ h_arr = np.asarray(h_val, dtype=np.float64)
1776
+ t_arr = np.asarray(t_val, dtype=np.float64)
1777
+ result = cp * t_arr + g * h_arr
1778
+ if hasattr(height_or_theta, "coords") and hasattr(height_or_theta, "dims"):
1779
+ import xarray as xr
1780
+ return xr.DataArray(result, coords=height_or_theta.coords,
1781
+ dims=height_or_theta.dims,
1782
+ attrs={"units": "J/kg"})
1783
+ return result * units("J/kg")
1784
+ elif temperature is not None and height is not None:
1785
+ # 4-arg legacy form: (theta, pressure, temperature, height)
1786
+ result = _vec_call(_calc.montgomery_streamfunction,
1787
+ _strip(height_or_theta, "K"),
1788
+ _strip(temperature_or_pressure, "hPa"),
1789
+ _strip(temperature, "K"),
1790
+ _strip(height, "m"))
1791
+ return result * units("J/kg")
1792
+ else:
1793
+ raise TypeError(
1794
+ "montgomery_streamfunction expects (height, temperature) or "
1795
+ "(theta, pressure, temperature, height)"
1796
+ )
1758
1797
 
1759
1798
 
1760
- def most_unstable_cape_cin(pressure, temperature, dewpoint):
1799
+ def most_unstable_cape_cin(pressure, temperature, dewpoint, depth=300, **kwargs):
1761
1800
  """Most-unstable CAPE and CIN.
1762
1801
 
1763
1802
  Parameters
@@ -1765,6 +1804,8 @@ def most_unstable_cape_cin(pressure, temperature, dewpoint):
1765
1804
  pressure : array Quantity (pressure)
1766
1805
  temperature : array Quantity (temperature)
1767
1806
  dewpoint : array Quantity (temperature)
1807
+ depth : Quantity or float, optional
1808
+ Search depth in hPa (default 300).
1768
1809
 
1769
1810
  Returns
1770
1811
  -------
@@ -2594,7 +2635,7 @@ def vorticity(u, v, dx=None, dy=None, x_dim=-1, y_dim=-2,
2594
2635
  dx_val = _mean_spacing(dx, "m")
2595
2636
  dy_val = _mean_spacing(dy, "m")
2596
2637
  result = np.asarray(_calc.vorticity(u_f, v_f, dx_val, dy_val))
2597
- return result * units("1/s")
2638
+ return _wrap_result_like(u, result, "1/s")
2598
2639
 
2599
2640
 
2600
2641
  def absolute_vorticity(u, v, lats=None, dx=None, dy=None, latitude=None,
@@ -2674,8 +2715,15 @@ def advection(scalar, *args, dx=None, dy=None, dz=None, x_dim=-1, y_dim=-2,
2674
2715
  dy_val = _mean_spacing(dy, "m")
2675
2716
  result = np.asarray(_calc.advection(s_f, u_f, v_f, dx_val, dy_val))
2676
2717
  if has_units:
2677
- return result * (scalar.units / units.s)
2678
- return result / units.s
2718
+ # Build output unit safely — scalar.units may be a string (xarray attr)
2719
+ # or a Pint Unit from either metrust or MetPy registry.
2720
+ try:
2721
+ s_u = units.Unit(str(scalar.units))
2722
+ except Exception:
2723
+ s_u = units.dimensionless
2724
+ out = _wrap_result_like(scalar, result, str(s_u / units.s))
2725
+ return out
2726
+ return _wrap_result_like(scalar, result, "1/s")
2679
2727
 
2680
2728
 
2681
2729
  def frontogenesis(theta, u, v, dx=None, dy=None, x_dim=-1, y_dim=-2,
@@ -4627,17 +4675,52 @@ def isentropic_interpolation_as_dataset(levels, temperature, *args,
4627
4675
  p_3d = p_vals
4628
4676
  extra = [np.asarray(a.values if hasattr(a, "values") else a, dtype=np.float64) for a in args]
4629
4677
  result = isentropic_interpolation(theta_levs, p_3d, t_vals, extra)
4630
- # Package as Dataset
4678
+ # Package as Dataset, preserving spatial dimensions for 3D output
4679
+ n_theta = len(theta_levs)
4631
4680
  theta_coord = xr.Variable("isentropic_level", theta_levs, attrs={"units": "K", "positive": "up"})
4681
+
4682
+ # Determine output spatial dims from the input temperature array
4683
+ has_spatial = hasattr(temperature, "dims") and len(temperature.dims) >= 2
4684
+ if has_spatial:
4685
+ # Input is (vertical, ..spatial_dims..). Output is (isentropic_level, ..spatial_dims..)
4686
+ spatial_dims = temperature.dims[1:] # e.g., ("y", "x")
4687
+ spatial_coords = {k: temperature.coords[k] for k in temperature.coords
4688
+ if k not in (temperature.dims[0],) and k != "isentropic_level"}
4689
+ out_dims = ("isentropic_level",) + spatial_dims
4690
+ spatial_shape = tuple(temperature.sizes[d] for d in spatial_dims)
4691
+ else:
4692
+ spatial_dims = ()
4693
+ spatial_coords = {}
4694
+ out_dims = ("isentropic_level",)
4695
+ spatial_shape = ()
4696
+
4632
4697
  ds_vars = {}
4698
+ all_coords = {"isentropic_level": theta_coord}
4699
+ all_coords.update(spatial_coords)
4700
+
4633
4701
  if isinstance(result, (list, tuple)) and len(result) >= 2:
4634
- ds_vars["pressure"] = xr.Variable("isentropic_level", np.asarray(result[0]), attrs={"units": "hPa"})
4635
- ds_vars["temperature"] = xr.Variable("isentropic_level", np.asarray(result[1]), attrs={"units": "K"})
4702
+ target_shape = (n_theta,) + spatial_shape
4703
+ p_arr = np.asarray(result[0])
4704
+ t_arr = np.asarray(result[1])
4705
+ if p_arr.shape != target_shape and spatial_shape:
4706
+ try:
4707
+ p_arr = p_arr.reshape(target_shape)
4708
+ t_arr = t_arr.reshape(target_shape)
4709
+ except ValueError:
4710
+ pass
4711
+ ds_vars["pressure"] = xr.Variable(out_dims, p_arr, attrs={"units": "hPa"})
4712
+ ds_vars["temperature"] = xr.Variable(out_dims, t_arr, attrs={"units": "K"})
4636
4713
  for i, a in enumerate(args):
4637
4714
  name = getattr(a, "name", None) or f"field_{i}"
4638
4715
  if 2 + i < len(result):
4639
- ds_vars[name] = xr.Variable("isentropic_level", np.asarray(result[2 + i]))
4640
- return xr.Dataset(ds_vars, coords={"isentropic_level": theta_coord})
4716
+ f_arr = np.asarray(result[2 + i])
4717
+ if f_arr.shape != target_shape and spatial_shape:
4718
+ try:
4719
+ f_arr = f_arr.reshape(target_shape)
4720
+ except ValueError:
4721
+ pass
4722
+ ds_vars[name] = xr.Variable(out_dims, f_arr)
4723
+ return xr.Dataset(ds_vars, coords=all_coords)
4641
4724
 
4642
4725
 
4643
4726
  def zoom_xarray(input_field, zoom, output=None, order=3, mode="constant",
@@ -157,8 +157,11 @@ def test_grid_deltas_can_be_inferred_from_coords():
157
157
 
158
158
  assert vort.shape == (3, 4)
159
159
  assert adv.shape == (3, 4)
160
- assert vort.units == mp_units("1/s")
161
- assert adv.units == mp_units("1/s")
160
+ # xarray-wrapped results store units in .attrs, not as Pint .units
161
+ vort_unit = getattr(vort, "units", None) or vort.attrs.get("units", "")
162
+ adv_unit = getattr(adv, "units", None) or adv.attrs.get("units", "")
163
+ assert "1/s" in str(vort_unit) or "second" in str(vort_unit)
164
+ assert "1/s" in str(adv_unit) or "second" in str(adv_unit)
162
165
 
163
166
 
164
167
  def test_qvector_and_frontogenesis_infer_dxdy_from_coords():
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