python 基于metpy计算位涡平流项(水平)

简介: 使用python 计算位涡水平平流项

使用python 计算位涡水平平流项



使用数据:potential vorticity、水平风场分量:U、V


数据来源:

  • ERA5
  • hourly :一天四次
  • 空间分辨率:0.5x0.5
  • 时间范围:2004-06
    使用的函数:
  • metpy.calc.advection(scalar, u=None, v=None, w=None, *, dx=None, dy=None, dz=None, x_dim=- 1, y_dim=- 2, vertical_dim=- 3)
  • metpy.calc.advection官方介绍
    与我之前的一个计算水汽散度的帖子的方法差不多:使用metpy计算水汽散度


编程需要注意的点:


  • metpy.calc.advection()中传入的变量应该是二维的(lonxlat),而我们下载的位涡数据是四维的(time x level x lat x lon),所以需要做循环计算
  • 使用metpy时需要给予各项附上响应的单位,防止计算的量纲出错
  • metpy.calc.advection()中的x_dim=- 1, y_dim=- 2,分别对应了你的经度和纬度的维度,默认是经度为最后一维,纬度是倒数第二维
  • 虽然metpy.calc.advection()提供了三个方向的计算,但是第三维的计算不太完善,因此本文以下只计算水平项
  • 需要计算出dx、dy,也就是网格点的实际距离,这里metpy也给出了对应的函数:mpcalc.lat_lon_grid_deltas


代码如下:


import xarray as xr
import numpy as np
from metpy.units import units
import metpy.constants as constants
import metpy.calc as mpcalc
#########################文件路径##################################################
path=r'D:\PV\download_pv_hourly.nc'
path1=r'D:\PV\uv_0.5x0.5_2004-06.nc'
#########################读取pv############################################################
f_pv = xr.open_dataset(path)
pv   = f_pv.pv.sel(time=slice('2004-06-23','2004-06-30')).sortby('latitude')
pv_units=pv.units
lev  = pv.level
pressure = np.array(lev).reshape((1,37,1,1))*units.hPa
dpdl= np.gradient( pressure,axis=1)
##########################读取水平风场#########################################################
f = xr.open_dataset(path1).sortby('latitude').sel(time=slice('2004-06-23','2004-06-30'))
f = f.transpose('time','level','latitude','longitude')
f_u = f.u
f_v = f.v
lat =  f_u.latitude
lon =  f_u.longitude
time = f_u.time
dx, dy = mpcalc.lat_lon_grid_deltas(lon, lat)
pvadv=np.zeros((32,37,361,720))
for i in range(32):
    for j in range(37):
        print(i,j)  
        pvadv[i,j,:,:] = mpcalc.advection(pv[i,j,:,:],u=f_u[i,j,:,:],v=f_v[i,j,:,:],dx=dx,dy=dy,x_dim=-1,y_dim=-2)
pvadv=pvadv*units['K m**2 kg**-1 s**-1']/units.s
##########################计算平流垂向#####################################
# vertical
p_v=pv*units['K m**2 kg**-1 s**-1']
dpvdl=np.gradient( p_v,axis=1)
pvvdv = f_w*(units.Pa/units.s)*(dpvdl/dpdl)
#########################保存数据#############################################################
pvadv_nc=xr.Dataset({'pvadv':(('time','level','lat','lon'),pvadv)},
                    coords = {
                        'time':time,
                        'level':lev.data,
                        'lat':lat.data,
                        'lon':lon.data,
                        }
                    )
pvadv_nc.attrs['long_name']='potential vorticity advection'
pvadv_nc.to_netcdf('pvadv.nc')
###########################保存数据##########################################################
pvvdv_nc=xr.Dataset({'pvadv':(('time','level','lat','lon'),pvvdv.data)},
                    coords = {
                        'time':time,
                        'level':lev.data,
                        'lat':lat.data,
                        'lon':lon.data,
                        }
                    )
pvvdv_nc.attrs['long_name']='potential vorticity vertical advection'
pvvdv_nc.to_netcdf(r'pvvdv.nc')


Tips:

  • 一般的计算结果显示的量级为10的-5次方到10的-8次方
  • 虽然ERA5提供了位涡的数据,但是还是自己根据位涡的定义重新计算以下对比验证,如研究中高纬区域可能存在一些问题


                          一个努力学习python的ocean er
                          水平有限,欢迎指正!!!
                            欢迎评论、收藏、点赞、转发、关注。
                            关注我不后悔,记录学习进步的过程~~


相关文章
|
1天前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
19 9
|
19天前
|
开发框架 并行计算 安全
Python的GIL限制了CPython在多核下的并行计算,但通过替代解释器(如Jython, IronPython, PyPy)和多进程、异步IO可规避
【6月更文挑战第26天】Python的GIL限制了CPython在多核下的并行计算,但通过替代解释器(如Jython, IronPython, PyPy)和多进程、异步IO可规避。Numba、Cython等工具编译优化代码,未来社区可能探索更高级的并发解决方案。尽管GIL仍存在,现有策略已能有效提升并发性能。
23 3
|
22天前
|
JSON 数据格式 索引
Python内置函数如`print()`输出信息,`len()`计算长度
【6月更文挑战第23天】Python内置函数如`print()`输出信息,`len()`计算长度,`type()`识别类型,`range()`生成序列,`sum()`求和,`min()`和`max()`找极值,`abs()`取绝对值,`round()`四舍五入,`sorted()`排序,`zip()`和`enumerate()`组合及遍历,`map()`和`filter()`应用函数。标准库如`os`用于操作系统交互,`sys`处理解释器信息,`math`提供数学运算,`re`支持正则表达式,`json`处理JSON数据。学习这些能提升编程效率。
31 5
|
2天前
|
存储 算法 安全
我们来看一个简单的Python代码示例,它使用`hashlib`模块中的`md5()`和`sha256()`函数来计算字符串的哈希值。
我们来看一个简单的Python代码示例,它使用`hashlib`模块中的`md5()`和`sha256()`函数来计算字符串的哈希值。
9 0
|
1月前
|
分布式计算 负载均衡 并行计算
Python 分布式计算框架 PP (Parallel Python):集群模式下的实践探索
该文介绍了使用Parallel Python (PP) 在两台物理机上构建分布式计算集群的经验。PP是一个轻量级框架,旨在简化Python代码在多处理器系统和集群中的并行执行。文中通过设置子节点的IP、端口和密钥启动PP服务器,并在主节点创建PP实例进行负载均衡。实验使用官方的质数和计算示例,显示PP在集群模式下能有效利用多台机器的多核CPU,实现计算效率的显著提升。未来,作者计划进一步研究PP在更复杂任务和大规模集群中的应用潜力。
143 4
|
1月前
|
机器学习/深度学习 算法 Serverless
利用无穷级数逼近计算幂运算与开根号——Python实现
使用泰勒级数逼近法,本文介绍了如何用Python计算特殊幂运算,包括分数次幂和开根号。通过定义辅助函数,如`exp`、`getN_minus_n`、`multi`和`getnum`,实现了计算任意实数次幂的功能。实验结果显示,算法能有效计算不同情况下的幂运算,例如`0.09^2`、`1^2`、`0.25^2`、`0.09^(0.5)`、`1^(0.5)`和`0.25^(0.5)`。虽然精度可能有限,但可通过调整迭代次数平衡精度与计算速度。
|
21天前
|
Python
使用Python计算有效值函数(RMS值)
使用Python计算有效值函数(RMS值)
32 0
|
2月前
|
算法 Python Java
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
55 0
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
|
Python
Python计算圆周率
Python计算圆周率
84 0
|
Python
用python采用蒙特卡洛模拟计算圆周率--学习笔记15
用python采用蒙特卡洛模拟计算圆周率--学习笔记15
126 0