【发布时间】:2018-04-05 17:46:30
【问题描述】:
我目前正在尝试运行 python 脚本来计算我的 WRF 输出数据上的 3 维锋生,以执行横截面分析。我已经有一个可用的 Petterson 公式的二维版本来进行比较,但是我的三维版本只捕捉了二维版本的非常小的方面。
我用来计算 3D 锋生的公式是:
其中梯度项为:
这是我的二维码 (925 hPa) 生成的示例图像:
这是一个三维代码,然后向下插值到相同的二维 (925 hPa) 表面:
一些读数至少出现在图像上的相同地理区域这一事实向我表明,我至少在正确的轨道上,并且我可能在某个地方犯了一个小错误。从我所见,我的 python 代码看起来是正确的,至少根据我对 np.gradient 函数如何工作的理解,这里是计算前沿生成的代码:
# Fetch the fields we need
p = getvar(ncFile, "pressure") * 100 # Convert to Pa
z = getvar(ncFile, "z")
ua = getvar(ncFile, "ua")
va = getvar(ncFile, "va")
theta = getvar(ncFile, "theta")
omega = getvar(ncFile, "omega")
dz = np.gradient(z, axis=0)
dp = np.gradient(p, axis=0)
theta_gradient = np.sqrt((np.gradient(theta, dx, axis=2))**2 + (np.gradient(theta, dy, axis=1))**2 + (np.gradient(theta, axis=0) / dz)**2)
zonal_gradient = (-1 * np.gradient(theta, dx, axis=2)) * ((np.gradient(ua, dx, axis=2) * np.gradient(theta, dx, axis=2)) + (np.gradient(va, dx, axis=2) * np.gradient(theta, dy, axis=1)))
meridional_gradient = (-1 * np.gradient(theta, dy, axis=1)) * ((np.gradient(ua, dy, axis=1) * np.gradient(theta, dx, axis=2)) + (np.gradient(va, dy, axis=1) * np.gradient(theta, dy, axis=1)))
vertical_gradient = (-1 * (np.gradient(theta, axis=0) / dp)) * ((np.gradient(omega, dx, axis=2) * np.gradient(theta, dx, axis=2)) + (np.gradient(omega, dy, axis=1) * np.gradient(theta, dy, axis=1)))
F3D = 1.08e9 * (1 / theta_gradient) * (zonal_gradient + meridional_gradient + vertical_gradient)
return F3D
作为参考,dx 和 dy 项是直接从 NetCDF 文件本身获取的(它有属性 DX 和 DY,都定义为 4000m)
我正在使用 wrf-python 库通过 getvar 导入我的数据,它正在导入 netCDF 文件。作为参考,netCDF 文件使用类似于标准 numpy 数组的数组结构: [自下而上、南北、东西]
所以轴参数的顺序应该是正确的(z = 0,y = 1,x = 2)。
我的一位指导老师认为梯度的边缘可能会导致计算内部出现一些问题,但我的理解是每个点都是独立于边缘计算的,因此应该没有区别,但这是我不是 100% 确定的。
有谁知道为什么计算会产生如上图所示的错误结果?
【问题讨论】:
-
这里只是一点点更新。我决定今天尝试单独计算条款,我想我在这里解决了问题。这里的 dz 项应该处理 z[n+1] - z[n-1] 作为梯度项的分母,实际上是在做 z[n+1] - z[n]。 dp 项也在做同样的事情,它会抛出除以 dz 和 dp 的偏导数项。
标签: python numpy 3d gradient weather