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.
- {metrust-0.2.4 → metrust-0.2.6}/Cargo.lock +6 -6
- {metrust-0.2.4 → metrust-0.2.6}/Cargo.toml +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/PKG-INFO +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/Cargo.toml +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/Cargo.toml +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/Cargo.toml +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/Cargo.toml +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/Cargo.toml +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/docs/index.md +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/pyproject.toml +1 -1
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/calc/__init__.py +100 -17
- {metrust-0.2.4 → metrust-0.2.6}/tests/test_metpy_dropin_compat.py +5 -2
- {metrust-0.2.4 → metrust-0.2.6}/.github/workflows/ci.yml +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/.github/workflows/docs.yml +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/.github/workflows/release.yml +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/.gitignore +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/README.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/VERIFICATION.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/benches/bench_hrrr.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/benches/bench_hrrr_vs_metpy.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/benches/bench_python.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/benches/calc_bench.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/atmo.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/kinematics.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/severe.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/smooth.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/thermo.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/utils.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/calc/wind.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/constants.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/interpolate/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak_dm.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak_sounding.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gempak_surface.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/gini.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/level3.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/metar.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/station.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/io/wpc.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/lib.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/plots/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/projections.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/src/units.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/tests/test_gempak.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/metrust/tests/test_new_functions.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/composite.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/cache.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/catalog.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/client.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/fallback.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/idx.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/sources.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/download/streaming.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/dynamics.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/error.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/grid.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/ops.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/parser.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/search.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/streaming.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/tables.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/tests.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/unpack.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/grib2/writer.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/gridmath.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/lib.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/metfuncs.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/cfs.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/ecmwf.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/era5.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/gefs.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/gfs.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/href.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/hrrr.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/hrrr_ak.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/latest.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/mrms.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/nam.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/nbm.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/rap.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/rrfs.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/rtma.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/sref.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/urma.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/models/wpc.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/products.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/projection.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/regrid.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/ansi.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/colormap.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/contour.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/cross_section.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/encode.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/filled_contour.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/hodograph.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/mod.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/overlay.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/raster.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/skewt.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/rustmet-core/src/render/station.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/error.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/field.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/lib.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/meta.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/projection.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/radial.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/site.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/sounding.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-field/src/time.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/composite.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/dynamics.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/gridmath.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/lib.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/regrid.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-math/src/thermo.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/cells.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/color_table.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/derived.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/detection.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/level2.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/lib.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/products.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/render.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/crates/wx-radar/src/sites.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/atmospheric.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/grid-composites.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/io.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/kinematics.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/moisture.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/severe.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/smoothing.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/thermodynamics.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/units.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/api/wind.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/compatibility.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/guides/arrays.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/guides/installation.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/guides/migration.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/performance.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/first-grid.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/first-sounding.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/reading-the-numbers.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/recipes.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/docs/tutorials/weather-101.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/examples/cookbook_500hpa_grid.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/examples/cookbook_sounding.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/examples/sounderpy_dropin.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/mkdocs.yml +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/__init__.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/constants/__init__.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/interpolate/__init__.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/io/__init__.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/plots/__init__.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/units.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/python/metrust/xarray.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/lib.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_atmo.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_constants.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_interpolate.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_io.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_kinematics.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_severe.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_smooth.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_thermo.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_utils.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/src/py_wind.rs +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/api_audit_calc.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/api_audit_other.md +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/benchmark.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/test_python_compat.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/verify_constants.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/verify_edge_cases.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/verify_kinematics.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/verify_severe_atmo.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/verify_smooth_interp.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/verify_thermo.py +0 -0
- {metrust-0.2.4 → metrust-0.2.6}/tests/verify_units.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1952
|
+
version = "0.2.6"
|
|
1953
1953
|
dependencies = [
|
|
1954
1954
|
"byteorder",
|
|
1955
1955
|
"bzip2",
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "metrust"
|
|
7
|
-
version = "0.2.
|
|
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(
|
|
1743
|
-
|
|
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
|
-
|
|
1757
|
-
|
|
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
|
|
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
|
-
|
|
2678
|
-
|
|
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
|
-
|
|
4635
|
-
|
|
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
|
-
|
|
4640
|
-
|
|
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
|
-
|
|
161
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|