examples
For use in a script:
from pathlib import Path
from metpy.units import units
import numpy as np
from ecape.calc import calc_ecape
sounding_loc = Path("./sounding.txt")
data = np.genfromtxt(sounding_loc, delimiter=",")
height = data[:, 0] * units("m")
pressure = data[:, 1] * units("Pa")
temperature = data[:, 2] * units("K")
specific_humidity = data[:, 3] * units("kg/kg")
u_wind = data[:, 4] * units("m/s")
v_wind = data[:, 5] * units("m/s")
cape_type = 'most_unstable'
ecape = calc_ecape(height, pressure, temperature, specific_humidity, u_wind, v_wind, cape_type)
print(f"{cape_type} ECAPE: {ecape}")
University of Wyoming soundings (trim below ground rows):
from pathlib import Path
import metpy.calc as mpcalc
import pandas as pd
from metpy.units import pandas_dataframe_to_unit_arrays, units
from ecape.calc import calc_ecape
unit_dictionary = {
"pressure": units("hPa"),
"height": units("m"),
"temperature": None, # degC throws an error
"dew_point": None, # degC throws an error
"relative_humidity": units("dimensionless"),
"mixing_ratio": units("g/kg"),
"direction": units("degree"),
"speed": units("knot"),
"theta": units("K"),
"theta_e": units("K"),
"theta_v": units("K"),
}
sounding_loc = Path("/path/to/UWyo_Sounding.csv")
df = pd.read_csv(
sounding_loc,
header=None,
names=[unit_dictionary.keys()],
)
# MetPy provides a useful solution to incorporating pint units and pd.DataFrames
unit_array = pandas_dataframe_to_unit_arrays(df.dropna(), unit_dictionary)
# fix a degC issue
unit_array["temperature"] *= units("degC")
unit_array["dew_point"] *= units("degC")
# perform conversions.. fix provided in a future release
unit_array["u"], unit_array["v"] = mpcalc.wind_components(unit_array["speed"], unit_array["direction"])
unit_array["specific_humidity"] = mpcalc.specific_humidity_from_dewpoint(
unit_array["pressure"], unit_array["dew_point"]
)
# let's say, in this case, the SPC MUCAPE calculation is 10% higher than MetPy's..
# and we happen to be hopeful chasers
metpy_mucape = mpcalc.most_unstable_cape_cin(
unit_array["pressure"],
unit_array["temperature"],
unit_array["dew_point"]
)[0]
spc_cape = metpy_mucape * 1.10
ecape = calc_ecape(
unit_array["height"],
unit_array["pressure"],
unit_array["temperature"],
unit_array["specific_humidity"],
unit_array["u"],
unit_array["v"],
cape_type="most_unstable",
undiluted_cape=spc_cape,
)
print(f"mucape: {spc_cape} \necape: {ecape}")