python--测试使用不同的方式计算位涡平流项的差异

简介: python--测试使用不同的方式计算位涡平流项的差异

python计算位涡平流项



主要为了测试计算位涡平流项的准确性,这里使用了两种方法来计算位涡的平流项。


  • 方法1:使用metpy函数
  • 方法2:编写代码自己计算


一般使用metpy函数的计算结果,已经是等号右边的那一项了。也就是说相当于下图所示:


51b7b60f3eb14ae2906c999c9237434b.png

展开来就是:


image.png


使用metpy的函数时,需要注意的点:变量带上单位。


具体的代码如下所示:


import numpy as np
import pandas as pd
import xarray as xr
import proplot as pplt
import glob
from matplotlib.colors import ListedColormap 
from wrf import getvar,pvo,interplevel,destagger,latlon_coords
from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter
from netCDF4 import Dataset
import matplotlib as mpl   
from metpy.units import units
import metpy.constants as constants
import metpy.calc as mpcalc
import cmaps
f_w   = r'D:/wind.nc'
f_pv  = r'D:/pv.nc'
def  cal_dxdy(file):
    ncfile = Dataset(file)
    P = getvar(ncfile, "pressure")
    lats, lons = latlon_coords(P)
    lon = lons[0]
    lon[lon<=0]=lon[lon<=0]+360
    lat = lats[:,0]
    dx, dy = mpcalc.lat_lon_grid_deltas(lon.data, lat.data)
    return lon,lat,dx,dy
path  = r'J:/wrfout/'
filelist = glob.glob(path+'wrf*')
filelist.sort()
lon,lat,dx,dy = cal_dxdy(filelist[-1]) 
dw = xr.open_dataset(f_w)
dp = xr.open_dataset(f_pv)
u = dw.u
v = dw.v
pv = dp.pv
u = u.data*units('m/s')
v = v.data*units('m/s')
units.define('PVU = 1e-6 m^2 s^-1 K kg^-1 = pvu')
pv = pv.data*units('pvu').to('m^2 s^-1 K kg^-1')
lon = dw.lon
lat = dw.lat
time= dw.time
leve= dw.level
xlon,ylat=np.meshgrid(lon,lat)
dlony,dlonx=np.gradient(xlon)
dlaty,dlatx=np.gradient(ylat)
pi=3.14159265
re=6.37e6
dx=re*np.cos(ylat*pi/180)*dlonx*pi/180
dy=re*dlaty*pi/180
adv = np.full((time.shape[0],leve.shape[0],lat.shape[0],lon.shape[0]),np.nan)*units('m/s')*units("m^2 s^-1 K kg^-1")/units("m")
for i in range(time.shape[0]):
    for j in range(leve.shape[0]):
        print(i,j) 
        adv[i,j,:,:] = mpcalc.advection(pv[i,j,:,:],u=u[i,j,:,:],v=v[i,j,:,:],dx=dx,dy=dy,x_dim=-1,y_dim=-2)
########################## way 2 ########################################## 
u0 = dw.u.data
v0 = dw.v.data
dpdx = np.gradient(pv,axis=-1)
dpdy = np.gradient(pv,axis=-2)
pvadv = np.full((time.shape[0],leve.shape[0],lat.shape[0],lon.shape[0]),np.nan)
for i in range(time.shape[0]):
    for j in range(leve.shape[0]):
        print(i,j) 
        pvadv[i,j] = -(u0[i,j]*dpdx[i,j]/dx+v0[i,j]*dpdy[i,j]/dy)
f, axs = pplt.subplots( ncols=1, nrows=2,
                       figsize=(8,6),
                      tight=True,
                       proj='cyl',
                       proj_kw={'lon_0': 180}, lonlim=(100, 210), 
                             latlim=(-25, 25),
                       share=4,
                       )
axs[0].contourf(lon[::4],lat[::4],adv[16,6][::4,::4],colorbar='b')
axs[1].contourf(lon[::4],lat[::4],pvadv[16,6][::4,::4],colorbar='b')
axs.format(title=time[16],titleloc='l',
          coast=True, 
            labels=True,
           fontsize=10,
          )


结果对比,更方面的是直接绘制折线图。选取两个同样的点即可

相关文章
|
16天前
|
测试技术 Go Python
在python中测试应用
【6月更文挑战第29天】本文介绍Python的unittest是内置的单元测试框架,适合线性控制流的代码测试。并举实例说明,如何组织测试代码,如何构造脚手架和测试套件。
29 6
在python中测试应用
|
12天前
|
测试技术 Python
|
1天前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
19 9
|
8天前
|
Java 测试技术 开发者
Python:使用标准库编写单元测试
在现代软件开发中,编写单元测试是确保代码质量和可靠性的重要步骤。Python 提供了一个内置的单元测试框架,称为 unittest,它可以帮助开发者方便地编写和运行测试。本文将详细介绍如何使用 unittest 编写单元测试。
|
13天前
|
测试技术 API 持续交付
【Python自动化测试】文章探讨了Python在测试领域的关键作用,分为三部分
【7月更文挑战第2天】【Python自动化测试】文章探讨了Python在测试领域的关键作用,分为三部分:1) 自动化测试的重要性与Python的易用性、库支持、跨平台和社区优势;2) Unittest作为标准测试框架的基础用法,及Pytest的灵活性与强大功能;3) 实践中包括Selenium的Web UI测试、Requests的API测试,强调测试隔离、持续集成等最佳实践。Python助力高效稳定的软件测试。
24 2
|
17天前
|
消息中间件 缓存 中间件
【赠书活动 - 第1期】- 测试工程师Python开发实战(异步图书出品)| 文末送书
【赠书活动 - 第1期】- 测试工程师Python开发实战(异步图书出品)| 文末送书
|
19天前
|
XML 测试技术 数据格式
软件测试之 自动化测试 基于Python语言使用Selenium、ddt、unitTest 实现自动化测试(下)
软件测试之 自动化测试 基于Python语言使用Selenium、ddt、unitTest 实现自动化测试(下)
29 3
|
19天前
|
开发框架 并行计算 安全
Python的GIL限制了CPython在多核下的并行计算,但通过替代解释器(如Jython, IronPython, PyPy)和多进程、异步IO可规避
【6月更文挑战第26天】Python的GIL限制了CPython在多核下的并行计算,但通过替代解释器(如Jython, IronPython, PyPy)和多进程、异步IO可规避。Numba、Cython等工具编译优化代码,未来社区可能探索更高级的并发解决方案。尽管GIL仍存在,现有策略已能有效提升并发性能。
23 3
|
19天前
|
Java 测试技术 程序员
软件测试之 自动化测试 基于Python语言使用Selenium、ddt、unitTest 实现自动化测试(上)
软件测试之 自动化测试 基于Python语言使用Selenium、ddt、unitTest 实现自动化测试(上)
37 1
|
2天前
|
存储 算法 安全
我们来看一个简单的Python代码示例,它使用`hashlib`模块中的`md5()`和`sha256()`函数来计算字符串的哈希值。
我们来看一个简单的Python代码示例,它使用`hashlib`模块中的`md5()`和`sha256()`函数来计算字符串的哈希值。
9 0

相关实验场景

更多