I'm currently having a trouble on calculating CAPE in the first 3 km AGL extracted from a model. For some digging, attached here is the sample data I'm using.
Initially, I used Metpy's get layers function to subset an upper-air profile up to 3 km in depth. However, when calculating for the 3 km CAPE, it raises the following (lengthy) error message;
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_21224\4178737599.py in <module>
1 cape_layer = int(3)
2 p_c3, T_c3, Td_c3 = mpcalc.get_layer(p, T, Td, depth=cape_layer*units.km)
----> 3 cape0_3, cin0_3 = mpcalc.surface_based_cape_cin(p_c3, T_c3, Td_c3)
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\xarray.py in wrapper(*args, **kwargs)
1326
1327 # Evaluate inner calculation
-> 1328 result = func(*bound_args.args, **bound_args.kwargs)
1329
1330 # Wrap output based on match and match_unit
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\units.py in wrapper(*args, **kwargs)
323 def wrapper(*args, **kwargs):
324 _check_units_inner_helper(func, sig, defaults, dims, *args, **kwargs)
--> 325 return func(*args, **kwargs)
326
327 return wrapper
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\calc\thermo.py in surface_based_cape_cin(pressure, temperature, dewpoint)
2891 pressure, temperature, dewpoint = _remove_nans(pressure, temperature, dewpoint)
2892 p, t, td, profile = parcel_profile_with_lcl(pressure, temperature, dewpoint)
-> 2893 return cape_cin(p, t, td, profile)
2894
2895
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\xarray.py in wrapper(*args, **kwargs)
1326
1327 # Evaluate inner calculation
-> 1328 result = func(*bound_args.args, **bound_args.kwargs)
1329
1330 # Wrap output based on match and match_unit
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\units.py in wrapper(*args, **kwargs)
323 def wrapper(*args, **kwargs):
324 _check_units_inner_helper(func, sig, defaults, dims, *args, **kwargs)
--> 325 return func(*args, **kwargs)
326
327 return wrapper
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\calc\thermo.py in cape_cin(pressure, temperature, dewpoint, parcel_profile, which_lfc, which_el)
2389
2390 # Calculate LFC limit of integration
-> 2391 lfc_pressure, _ = lfc(pressure, temperature, dewpoint,
2392 parcel_temperature_profile=parcel_profile, which=which_lfc)
2393
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\xarray.py in wrapper(*args, **kwargs)
1326
1327 # Evaluate inner calculation
-> 1328 result = func(*bound_args.args, **bound_args.kwargs)
1329
1330 # Wrap output based on match and match_unit
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\units.py in wrapper(*args, **kwargs)
323 def wrapper(*args, **kwargs):
324 _check_units_inner_helper(func, sig, defaults, dims, *args, **kwargs)
--> 325 return func(*args, **kwargs)
326
327 return wrapper
~\anaconda3\envs\WFA_py\lib\site-packages\metpy\calc\thermo.py in lfc(pressure, temperature, dewpoint, parcel_temperature_profile, dewpoint_start, which)
720 temperature[1:], direction='decreasing',
721 log_x=True)
--> 722 if np.min(el_pressure) > this_lcl[0]:
723 x = units.Quantity(np.nan, pressure.units)
724 y = units.Quantity(np.nan, temperature.units)
~\anaconda3\envs\WFA_py\lib\site-packages\numpy\core\overrides.py in amin(*args, **kwargs)
~\anaconda3\envs\WFA_py\lib\site-packages\pint\facets\numpy\quantity.py in __array_function__(self, func, types, args, kwargs)
62
63 def __array_function__(self, func, types, args, kwargs):
---> 64 return numpy_wrap("function", func, args, kwargs, types)
65
66 _wrapped_numpy_methods = ["flatten", "astype", "item"]
~\anaconda3\envs\WFA_py\lib\site-packages\pint\facets\numpy\numpy_func.py in numpy_wrap(func_type, func, args, kwargs, types)
951 if name not in handled or any(is_upcast_type(t) for t in types):
952 return NotImplemented
--> 953 return handled[name](*args, **kwargs)
~\anaconda3\envs\WFA_py\lib\site-packages\pint\facets\numpy\numpy_func.py in implementation(*args, **kwargs)
776 for i, unwrapped_unit_arg in enumerate(unwrapped_unit_args):
777 bound_args.arguments[valid_unit_arguments[i]] = unwrapped_unit_arg
--> 778 ret = func(*bound_args.args, **bound_args.kwargs)
779
780 # Conditionally wrap output
~\anaconda3\envs\WFA_py\lib\site-packages\numpy\core\overrides.py in amin(*args, **kwargs)
~\anaconda3\envs\WFA_py\lib\site-packages\numpy\core\fromnumeric.py in amin(a, axis, out, keepdims, initial, where)
2914 6
2915 """
-> 2916 return _wrapreduction(a, np.minimum, 'min', axis, None, out,
2917 keepdims=keepdims, initial=initial, where=where)
2918
~\anaconda3\envs\WFA_py\lib\site-packages\numpy\core\fromnumeric.py in _wrapreduction(obj, ufunc, method, axis, dtype, out, **kwargs)
84 return reduction(axis=axis, out=out, **passkwargs)
85
---> 86 return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
87
88
ValueError: zero-size array to reduction operation minimum which has no identity
Is there a way to solve this? Perhaps I missed out something?
The minimum reproducible code is
import metpy.calc as mpcalc
from metpy.units import units
import xarray as xr
import pandas as pd
df = pd.read_csv('test.csv')
df = df.dropna()
data = xr.Dataset.from_dataframe(df)
#data
# Get the data variable; pressure, temperature, and RH percent.
# Calculate for dewpoint
p = data['p'].values * units('hPa')
T = data['T'].values * units('K')
T = T.to('degC')
Rh = data['Rh'].values * units('%')
Td = mpcalc.dewpoint_from_relative_humidity(T, Rh)
# Calculate 3 km AGL CAPE
cape_layer = int(3)
p_c3, T_c3, Td_c3 = mpcalc.get_layer(p, T, Td, depth=cape_layer*units.km)
cape0_3, cin0_3 = mpcalc.surface_based_cape_cin(p_c3, T_c3, Td_c3)