ValueError on calculating 0-3 km AGL CAPE in Metpy

61 Views Asked by At

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)
0

There are 0 best solutions below