积分 1116
贡献
精华
在线时间 小时
注册时间 2019-3-13
最后登录 1970-1-1
5 金钱
通过公众号(好奇心Log)的推文改写的计算湿位涡剖面的程序,与文献使用同样的资料求的是2016年8月21日20时(b)沿106°E的MPV1 经向剖面图,差异也太大了,是程序计算哪里有问题吗?求大神指教!
import cfgrib
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
import metpy.calc as mpcalc
from metpy.interpolate import cross_section
from metpy.units import units
from metpy.constants import g
import scipy.ndimage as ndimage
data = cfgrib.open_dataset('......\gdas1.fnl0p25.2016082112.f00.grib2',filter_by_keys={'typeOfLevel': 'isobaricInhPa'}).metpy.parse_cf()
data
heights = data['gh']
ug, vg = mpcalc.geostrophic_wind(data['gh'])
vert_abs_vort = mpcalc.absolute_vorticity(ug, vg)
vert_abs_vort
temperature, pressure, relative_humidity = xr.broadcast(data['t'],data['isobaricInhPa'],
data['r'])
#露点温度
dewpoint = mpcalc.dewpoint_from_relative_humidity(temperature,relative_humidity)
dewpoint
# 相当位温
theta_e = mpcalc.equivalent_potential_temperature(pressure, temperature, dewpoint)
theta_e
data['theta_e'] = xr.DataArray(theta_e.metpy.magnitude,
coords=heights.coords,
dims=heights.dims,
attrs={'units': 'K'})
data['u_g'] = xr.DataArray(ug.metpy.magnitude,
coords=heights.coords,
dims=heights.dims,
attrs={'units': 'm/s'})
data['v_g'] = xr.DataArray(vg.metpy.magnitude,
coords=heights.coords,
dims=heights.dims,
attrs={'units': 'm/s'})
data['relative_humidity'] = xr.DataArray(relative_humidity.metpy.magnitude,
coords=heights.coords,
dims=heights.dims,
attrs={'units': 'percent'})
data
dtheta_e_dp, dtheta_e_dy, dtheta_e_dx = (var.metpy.unit_array for var in mpcalc.gradient(data['theta_e'], axes=('vertical', 'y', 'x')))
dug_dp = mpcalc.first_derivative(data['u_g'], axis='vertical')
dvg_dp = mpcalc.first_derivative(data['v_g'], axis='vertical')
dz_dp = mpcalc.first_derivative(data['gh'], axis='vertical')
#mpv = g * (1 / dz_dp) * (-dvg_dp * dtheta_e_dx + dug_dp * dtheta_e_dy + vert_abs_vort * dtheta_e_dp)
#mpv
mpv1 = g * (1 / dz_dp) * (vert_abs_vort * dtheta_e_dp)
mpv2 = g * (1 / dz_dp) * (-dvg_dp * dtheta_e_dx + dug_dp * dtheta_e_dy)
mpv1
data['mpv1'] = xr.DataArray(mpv1*10**4,
coords=heights.coords,
dims=heights.dims,
attrs={'units': 'microkelvin/s^3'})
data['mpv2'] = xr.DataArray(mpv2*10**4,
coords=heights.coords,
dims=heights.dims,
attrs={'units': 'microkelvin/s^3'})
data
# Cross section parameters
start = (35.00,106.00)
end = (45.00,106.00)
cross = cross_section(data,start,end)
cross
fig = plt.figure(1, figsize=(14, 6))
ax = plt.axes()
#mpv1_contour = ax.contourf(cross['latitude'], cross['level'], cross['mpv1'], extend='both',
# levels=np.arange(-1, 0.2, 0.2), cmap='bwr')
#mpv1_colorbar = fig.colorbar(mpv1_contour)
mpv1_contour = ax.contour(cross['latitude'], cross['isobaricInhPa'], cross['mpv1'],
levels=np.arange(-3.0, 2.0, 0.5), colors='k', linewidths=1,
linestyles='-', alpha=1, zorder=2)
mpv1_labels = ax.clabel(mpv1_contour,inline=True,fmt='%.0f',fontsize=10,colors='tab:blue')
##mpv2_contour = ax.contour(cross['latitude'], cross['level'], cross['mpv2'],
# levels=np.arange(0, 1, 0.2), colors='k', linewidths=1,
# linestyles='-', alpha=0.5, zorder=2)
##mpv2_labels = ax.clabel(mpv2_contour,inline=True,fmt='%.0f',fontsize=10,colors='k')
ax.set_yscale('symlog')
ax.set_yticklabels(np.arange(1000, 100, -100))
ax.set_ylim(1000,200)
ax.set_yticks(np.arange(1000, 100, -100))
plt.show()
文献图b
python画的结果
我来回答