爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
12
返回列表 发新帖
楼主: slddbs

[求助] 请问python可以实现水汽通量散度计算吗

[复制链接]

新浪微博达人勋

发表于 2021-6-27 17:09:37 | 显示全部楼层
花开半夏 发表于 2021-4-19 11:45
用的ERA5资料,也出现TypeError: too many positional arguments这个问题,博主现在解决了吗

请问这个问题解决了吗
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-7-28 10:57:29 | 显示全部楼层
glue 发表于 2021-6-27 17:09
请问这个问题解决了吗

还没有,请问你算过散度吗,我也是遇到同样的问题
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-7-28 18:14:09 | 显示全部楼层
##引用部分
import numpy as np                           # ┐  数  基础
from datetime import datetime                # ┝  学  时间处理
import xarray as xr                          # |  工  数据结构
from scipy.ndimage import gaussian_filter    # ┘  具  平滑工具
import matplotlib.pyplot as plt            # ┐
import cartopy.crs as ccrs                 # ┝ 绘图工具
import cartopy.feature as cfeature         # ┘
import metpy.calc as mpcalc          # ┐  MetPy
from metpy.units import units        # ┘专业工具

##数据准备
ds=xr.open_dataset('data/Metpy/fnl_20160719_00_00.grib2',engine='cfgrib',backend_kwargs={'filter_by_keys':{'typeOfLevel': 'isobaricInhPa'}})

# 850hPa数据选择
r = ds['r']
t = ds['t']

# h850 = hght.sel(isobaricInhPa=850).data
u850 = uwnd.sel(isobaricInhPa=850).data * units('m/s')
v850 = vwnd.sel(isobaricInhPa=850).data * units('m/s')
r850 = r.sel(isobaricInhPa=850).data * units.percent
t850 = t.sel(isobaricInhPa=850).data * units.kelvin
dew  = mpcalc.dewpoint_from_relative_humidity(t850,r850)
q = mpcalc.specific_humidity_from_dewpoint(850*units.mbar, dew)

lats = ds.latitude.data
lons = ds.longitude.data
dx, dy = mpcalc.lat_lon_grid_deltas(lons, lats)  

g = 9.8* units.meter / (units.second * units.second)
qdiv = mpcalc.divergence(q*u850/g ,q*v850/g ,dx=dx,dy=dy, x_dim=-1, y_dim=-2)

就是他了。提示:metpy版本1.0.1
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 1

使用道具 举报

新浪微博达人勋

发表于 2021-7-28 18:20:05 | 显示全部楼层
slddbs 发表于 2021-1-14 15:43
divergence
metpy.calc.divergence(u, v, *, dx=None, dy=None, x_dim=- 1, y_dim=- 2)[source]
Calcul ...

pint不算是数据格式,pint本身就是单位(千克、米、秒……)管理包。
metpy的优势在于在以前的单纯数据计算时,加入了单位,不再需要人为地解决开尔文vs摄氏度、克vs千克、米vs千米。你只要告诉函数你的数据是什么单位的就行了,函数内部会归一化。


mpcalc.divergence( u , v , dx=ddx , dy=ddy ,xdim=-1 ,ydim=-2)
其中u和v就不说了。dx是位置参数关键字,ddx是你算出来的差分距离(我数学不好,你应该能懂我的意思,比如1°分辨率的是110km),纬向同。
ats = ds.latitude.data
lons = ds.longitude.data
dx, dy = mpcalc.lat_lon_grid_deltas(lons, lats)  
得到的就是这里的ddx,ddy。参照楼上“完整”代码。
PS. 我现在越来越觉得xarray比netCDF4好用了,当然也有些特例。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-11-1 20:01:30 | 显示全部楼层
edwardli 发表于 2021-7-28 18:20
pint不算是数据格式,pint本身就是单位(千克、米、秒……)管理包。
metpy的优势在于在以前的单纯数据 ...

我能不能问一下你这个的结果是整层水汽通量还是水汽通量散度呢?我想算整层水汽通量
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表