流函数和速度势一直广泛应用于大气、海洋、
环境科学等领域。流函数对应旋转风,
常用于大气环流演变、大洋环流模拟、
大范围水汽输送分析等方面。速度势对应辐散风,代表大气中的地转偏差运动,
密切联系大气垂直运动,进而产生
水汽相变和潜热释放,在热带天气系统分析、中小
尺度动力学、山谷风和湖陆风等局地环流研究和污
染扩散等领域尤为重要。
全球流函数、速度势的计算由于不涉及边界条件有唯一解析解,
而有限区域流函数、速度势求解问题,需要对有
边界条件限制下的泊松方程求解,常用的方法有迭代法、谱展开法、变分法、调和余弦法等。参考气象家园论坛里
沙颖凯用加速利布曼法计算流函数和速度势的MATLAB代码(
http://bbs.06climate.com/forum.php?mod=viewthread&tid=20777)
,在MeteoInfo 3.8.11版本中加入了相关功能,考虑到计算速度,迭代计算的代码(liebermanIteration)用Java语言实现(https://github.com/meteoinfo/MeteoInfo/blob/54476160dd02766523325260ad53b40c627475e9/meteoinfo-math/src/main/java/org/meteoinfo/math/meteo/MeteoMath.java),其它部分用Jython语言实现,放在meteolib包中(https://github.com/meteoinfo/MeteoInfo/blob/54476160dd02766523325260ad53b40c627475e9/meteoinfo-lab/pylib/mipylib/meteolib/calc/kinematics.py),函数名分别为stream_function和velocity_potential,参数为经度、纬度、风场U分量、风场V分量、最大迭代次数(缺省为1e6)、最小残差值(缺省为1e-7)、超张弛系数(缺省为0.2)。
利用
沙颖
凯贴中提供的MATLAB数据测试了流函数:
fn = 'D:/Temp/matlab/Mar_21_2009_00UTM.mat'
data = np.loadmat(fn)
u = data['u'][::-1]
v = data['v'][::-1]
lon = data['longitude'][::-1]
lat = data['latitude'][::-1]
psi, Upsi, Vpsi = meteolib.stream_function(lon, lat, u, v, 1000, 1e-5)
axesm()
geoshow('country')
levs = arange(-40, 40.1, 5)
contourf(lon, lat, psi*1e-6, levs, edgecolor='gray', extend='both', cmap='BlueRed')
colorbar(shrink=0.8)
qq = quiver(lon, lat, Upsi, Vpsi, color='darkgray',
size=10, overhang=1, headwidth=4, headlength=4, antialias=True)
quiverkey(qq, 0.85, 0.12, 20, bbox={'edge':True, 'fill':True})
title('Stream function')
xlim(90, 160)
ylim(0, 60)
上图结果和帖子中的图形类似,区别主要由于迭代算法代码中dx2、dy2顺序不同导致,由于数据二维数组维度分别为纬度(y)和经度(x),计算残差时第一维应该除以dy2,第二维除以dx2。
速度势测试利用了此贴(
http://bbs.06climate.com/forum.php?mod=viewthread&tid=94948&extra=page%3D1&page=1
)中的数据:
fn = 'D:/Temp/nc/2019_mon_u_v.nc'
f = addfile(fn)
u = f['U'][0,::-1]
v = f['V'][0,::-1]
lon1 = u.dimvalue(1)
lat1 = u.dimvalue(0)
lon, lat = meshgrid(lon1, lat1)
phi, Uphi, Vphi = meteolib.velocity_potential(lon, lat, u, v)
axesm()
geoshow('country', edgecolor='darkgray')
levs = arange(-8, 8.1, 2)
contourf(lon1, lat1, phi * 1e-6, levs, extend='both', cmap='BlueRed')
colorbar()
ss = 10
qq = quiver(lon[::ss,::ss], lat[::ss,::ss], Uphi[::ss,::ss], Vphi[::ss,::ss],
size=50, overhang=1, headwidth=4, headlength=4, antialias=True)
quiverkey(qq, 0.85, 0.12, 5, bbox={'edge':True, 'fill':True})
title('Velocity potential')
可以看出速度势的高低值中心和数值量级与NCL、GRADS的结果相似,也没有原MATLAB代码南北端色块拉长的边界的现象。
也利用NCL网站上的示例数据(https://www.ncl.ucar.edu/Applications/wind.shtml)进行了测试:
fn = 'D:/Temp/nc/uv300.nc'
f = addfile(fn)
u = f['U'][0]
v = f['V'][0]
lon1 = u.dimvalue(1)
lat1 = u.dimvalue(0)
lon, lat = meshgrid(lon1, lat1)
phi, Uphi, Vphi = meteolib.velocity_potential(lon, lat, u, v)
axesm()
geoshow('country', edgecolor='darkgray')
levs = arange(-8, 8.1, 1)
contourf(lon1, lat1, phi * 1e-6, levs, extend='both', cmap='amwg256')
colorbar()
ss = 2
qq = quiver(lon[::ss,::ss], lat[::ss,::ss], Uphi[::ss,::ss], Vphi[::ss,::ss],
size=150, overhang=1, headwidth=4, headlength=4, antialias=True)
quiverkey(qq, 0.85, 0.12, 3, bbox={'edge':True, 'fill':True})
title('Velocity potential')
可以看出和NCL网站的结果图相似。
本人并非学气象出身也对于流函数和速度势也缺乏深入研究,代码可能会有bug,欢迎批评指正。
参考文献:
任晨平、曹洁、王黎娟、崔晓鹏,
有限区域流函数和速度势的3 种求解方法在
分析台风Bilis 暴雨增幅中的比较研究,气候与环境研究,2013,18(6),721-732.
曹洁、陈海山、Xu Qin,
近70 年有限区域流函数速度势算法研究的
回顾和新进展,大气科学,2023,47(2),502-516.
声明:
欢迎转载、转发。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及内容、版权和其他问题,请联系小编
(微信:qxxjgzh)
处理。