写在前面

简单记录一下计算散度的方法,方便以后查找复制

包括三种计算方式,numpy、metpy、windspharm

其中,numpy和metpy的方法进行了比较,结果比较一致。

windspharm的方法里面包含了两种方法, 一致是直接调用divergence()函数实现,另一个是先计算梯度再相加。

使用windspharm最简单,缺点就是需要使用全球的数据作为输入,而且在Linux上安装,我这里用的是模式数据就没去和metpy和numpy进行验证,只是记录作为一种方法。

  • 比较意外的是,同样的数据,numpy竟然比metpy还快一点。

metpy

def _cal_divergence_metpy(u,v):
    import metpy.calc as mpcalc
    lon = u.lon.data
    lat = u.lat.data
    dx, dy = mpcalc.lat_lon_grid_deltas(lon, lat)
    divergence = np.zeros((u.shape[0],lat.shape[0],lon.shape[0]))
    for i in range(u.shape[0]): 
        print(i)
        divergence[i] = mpcalc.divergence(u = u[i],v = v[i],dx = dx ,dy = dy)
    return xr.DataArray(divergence,dims=u.dims,coords=u.coords)

numpy


def _divergence_with_numpy(u,v):
    import numpy as np
    lon = u.lon.data
    lat = u.lat.data
    xlon,ylat=np.meshgrid(lon,lat)
    dlony,dlonx=np.gradient(xlon)
    dlaty,dlatx=np.gradient(ylat)
    pi=np.pi
    re=6.37e6
    dx=re*np.cos(ylat*pi/180)*dlonx*pi/180
    dy=re*dlaty*pi/180
    u_dx = np.gradient(u,axis=-1)
    v_dy = np.gradient(v,axis=-2)
    div_numpy = np.zeros((u.shape))
    
    div_numpy = u_dx/dx + v_dy[i]/dy
    return   xr.DataArray(div_numpy,dims=u.dims,coords=u.coords) 

windspharm

def _cal_divergence_windspharm(u,v):
    w       = VectorWind(u,v)
    div     = w.divergence()
    dudx, _ = w.gradient(u)
    _, dvdy = w.gradient(v)
    div1 = dudx + dvdy
    return xr.DataArray(div1,dims=u.dims,coords=u.coords),xr.DataArray(div,dims=u.dims,coords=u.coords)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐