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