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,
          )


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

相关文章
|
1月前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
160 60
|
9天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
42 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
12天前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
37 3
|
11天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
25 1
|
15天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
41 3
|
19天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
24 1
|
27天前
|
Python
【10月更文挑战第15天】「Mac上学Python 26」小学奥数篇12 - 图形变换与坐标计算
本篇将通过 Python 和 Cangjie 双语实现图形变换与坐标计算。这个题目帮助学生理解平面几何中的旋转、平移和对称变换,并学会用编程实现坐标变化。
63 1
|
1月前
|
机器学习/深度学习 移动开发 Python
【10月更文挑战第11天】「Mac上学Python 22」小学奥数篇8 - 排列组合计算
本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。
59 4
|
30天前
|
数据可视化 Python
【10月更文挑战第12天】「Mac上学Python 23」小学奥数篇9 - 基础概率计算
本篇将通过 Python 和 Cangjie 双语实现基础概率的计算,帮助学生学习如何解决简单的概率问题,并培养逻辑推理和编程思维。
48 1
|
10天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。