[−][src]Crate sounding_analysis
Functions and data types for analyzing soundings from radiosondes or models.
Library to represent an atmospheric sounding with pressure as the vertical coordinate.
Examples
use optional::{Optioned, some}; use metfor::{HectoPascal, Celsius, Feet}; use sounding_analysis::{Sounding, StationInfo}; fn main() { // Create pressure profile let pressure_profile: Vec<Optioned<HectoPascal>> = vec![1000.0, 925.0, 850.0, 700.0, 500.0, 300.0, 250.0, 100.0] .into_iter() .map(HectoPascal) .map(some) .collect(); // Create a temperature profile let temperature_profile: Vec<Optioned<Celsius>> = vec![13.0, 7.0, 5.0, -4.5, -20.6, -44.0, -52.0, -56.5] .into_iter() .map(Celsius) .map(some) .collect(); // Create some station info let stn = StationInfo::new_with_values(None, (45.6789, -115.6789), Feet(992.0)); // Create a valid time. This uses a `chrono::NaiveDateTime`, and you should always assume // that valid times are in UTC. let vt = chrono::NaiveDate::from_ymd(2018,3,8).and_hms(12,0,0); // Use the builder pattern to construct a sounding. let snd = Sounding::new() .with_station_info(stn) .with_valid_time(vt) .with_lead_time(24) // Lead time in hours for forecast soundings. .with_pressure_profile(pressure_profile) .with_temperature_profile(temperature_profile) .with_station_pressure(some(HectoPascal(1013.25))) .with_sfc_temperature(some(Celsius(15.0))); // Top down and bottom up iterators are provided. If surface data is available, it is // inserted into the profile. let mut iter = snd.top_down(); let mut data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(100.0))); assert_eq!(data_row.temperature, some(Celsius(-56.5))); data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(250.0))); assert_eq!(data_row.temperature, some(Celsius(-52.0))); data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(300.0))); assert_eq!(data_row.temperature, some(Celsius(-44.0))); data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(500.0))); assert_eq!(data_row.temperature, some(Celsius(-20.6))); data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(700.0))); assert_eq!(data_row.temperature, some(Celsius(-4.5))); data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(850.0))); assert_eq!(data_row.temperature, some(Celsius(5.0))); data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(925.0))); assert_eq!(data_row.temperature, some(Celsius(7.0))); data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(1000.0))); assert_eq!(data_row.temperature, some(Celsius(13.0))); // THIS ONE IS THE SURFACE DATA! data_row = iter.next().unwrap(); assert_eq!(data_row.pressure, some(HectoPascal(1013.25))); assert_eq!(data_row.temperature, some(Celsius(15.0))); assert_eq!(iter.next(), None); // Profiles and surface values can also be accessed via getter methods. Read the docs! }
You probably noticed a lot of optional::Optioned
s in the example. Basically, anything can be
missing, and missing values are common in upper air soundings. For example, at high altitude the
dew point or humidity are often missing (if not totally inaccurate).
Modules
experimental | Functions for analysis functions that I'm experimenting with. |
Structs
DataRow | A copy of a row of the sounding data. |
Layer | A layer in the atmosphere described by the values at the top and bottom. |
Parcel | Variables defining a parcel as used in parcel analysis. |
ParcelAscentAnalysis | Parcel analysis, this is a way to package the analysis of a parcel. |
ParcelProfile | Hold profiles for a parcel and it's environment. |
Sounding | All the variables stored in the sounding. |
StationInfo | Station information including location data and identification number. |
Enums
AnalysisError | Error type for the crate. |
Functions
average_parcel | Get the parcel with mean values for the given layer. |
bunkers_storm_motion | Calculate the super cell storm motion using the "id" method. |
cold_surface_temperature_layer | Assuming a warm layer aloft given by |
convective_parcel | Get the convective parcel - this is the surface parcel that will rise without any lifting. |
dcape | Downdraft CAPE. |
dendritic_snow_zone | Find the dendtritic growth zones throughout the profile. It is unusual, but possible there is more than one. |
effective_inflow_layer | Get the effective inflow layer. |
effective_layer_parcel | Get the effective parcel which is the parcel with the mean values (pressure, temperature, etc) of the sounding from the effective layer. |
equivalent_potential_temperature | Given a sounding, calculate a profile of the equivalent potential temperature. |
freezing_levels | Find the freezing/melting levels below 500 hPa. |
hail_growth_zone | Find the hail growth zones throughout the profile. It is very unusual, but possible there is more than one. |
haines | The Haines index for fire weather. |
haines_high | The high level version of the Haines index for fire weather. |
haines_low | The low level version of the Haines index for fire weather. |
haines_mid | The mid level version of the Haines index for fire weather. |
hot_dry_windy | The Hot-Dry-Windy index |
hydrolapse | Get the hydrolapse in (kg/kg)/km |
inversions | Get all inversion layers up to a specified pressure. |
layer_agl | Get a layer that has a certain thickness, like 3km or 6km. |
lift_parcel | Lift a parcel for a convective parcel analysis. |
linear_interpolate | Interpolate values given two parallel vectors of data and a target value. |
linear_interpolate_sounding | Interpolate values from the vertical sounding using pressure as the primary coordinate. |
lowest_level_parcel | Get the lowest level parcel. This should be the surface parcel, but some files do not have complete information at the surface, so the first level above the ground is best you can do. |
max_temperature_in_layer | Maximum temperature in a layer. |
max_temperature_in_profile | Maximum temperature aloft. |
max_wet_bulb_in_layer | Maximum wet bulb temperature in a layer. |
max_wet_bulb_in_profile | Maximum wet bulb temperature aloft. |
mean_wind | Calculate the mean wind in a layer. |
mix_down | Descend a parcel dry adiabatically. |
mixed_layer_parcel | Create a mixed layer parcel. |
most_unstable_parcel | Get the most unstable parcel. |
potential_temperature | Given a sounding, calculate a profile of the potential temperature. |
precipitable_water | Precipitable water (mm) |
pressure_layer | Get a layer defined by two pressure levels. |
pressure_parcel | Get the parcel at a specific pressure. |
relative_humidity | Given a sounding, calculate a profile of relative humidity. |
relative_humidity_ice | Given a sounding, calculate a profile of relative humidity with respect to ice. |
robust_convective_parcel | A more robust convective parcel analysis. |
sfc_based_inversion | Get a surface based inversion. |
sfc_to_level_temperature_lapse_rate | Get a profile of the average lapse rate from the surface to *, or the level on the y axis. |
sr_helicity | Storm relative helicity. |
surface_parcel | Get a surface parcel. |
temperature_lapse_rate | Get a profile of the lapse rate between layers in °C / km. |
theta_e_lapse_rate | Get the lapse rate of equivalent potential temperature in °K / km. |
warm_temperature_layer_aloft | Assuming it is below freezing at the surface, this will find the warm layers aloft using the dry bulb temperature. Does not look above 500 hPa. |
warm_wet_bulb_layer_aloft | Assuming the wet bulb temperature is below freezing at the surface, this will find the warm layers aloft using the wet bulb temperature. Does not look above 500 hPa. |
wet_bulb | Given a sounding, calculate a profile of wet bulb temperature. |
wet_bulb_zero_levels | Find the wet bulb zero levels |
Type Definitions
Layers | A list of layers. |
Level | A level in the atmosphere is described by a |
Levels | A list of levels. |
Result | Shorthand for results. |