在交错网格上使用数据时计算网格中心值

2024-05-23 17:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在与MITgcm合作进行一些模拟,特别是对内波模型的模拟;我得到了带有结果的.nc文件,但有些变量的坐标不完全相同。我要解释一下:我想计算出速度的分量,但是,由于一些我不完全理解的数值原因,水平速度坐标在细胞的左侧,垂直坐标在细胞的底部。为了操作速度数据,我需要统一所有坐标的参考。在

我考虑过做这样的事

 u (i,j,k) = u(i,j,k) + u(i+1,j,k)
 v (i,j,k) = v(i,j,k) + v(i,j+1,k)

所以我的坐标都在单元的中心,在同一个参照系中。在

我不知道如何使用python编辑NetCDF文件。我很乐意提取所有uv数据,像我说的那样进行编辑,并用这两个变量创建一个新的NetCDF文件。在

有可能吗?我怎么能做到呢?在

编辑:添加了ncdump信息

^{pr2}$

Tags: 文件数据模型编辑水平原因netcdf速度
2条回答

该模型使用的是staggered grid,其中u-速度在网格的西/东面上求解,而v-速度在北/南网格面上求解。在

你是对的,现在你需要对组件进行后期处理,这样u-和v-都被放置在每个网格单元的中心。在

让我们将nx定义为x维中的网格单元数(即,u分量在其中求解),而ny是y维中的网格单元数(即v分量在其中求解)。nz是垂直模型层的数目。在

那么u的维数是nx+1xnyxnz,而{}具有nxxny+1xnz。这是一个简单的平均值,然后让u和{}进入每个细胞的中心:

u_center = 0.5 * (u[0:nx,:,:] + u[1:nx+1,:,:]) # now has dimensions [nx,ny,nz])

v_center = 0.5 * (v[:,0:ny,:] + v[:,1:ny+1,:]) # now has dimensions [nx,ny,nz])

import netCDF4
import numpy as np

ncfile = netCDF4.Dataset('/path/to/file/foo.nc', 'r')
u = ncfile.variables['u'][:,:,:] # nx+1 x ny x nz 
v = ncfile.variables['v'][:,:,:] # nx x ny+1 x nz 

nx = np.shape(u)[0] - 1 
ny = np.shape(v)[1] - 1 
nz = np.shape(u)[2] 

u_center = 0.5 * (u[0:nx,:,:] + u[1:nx+1,:,:]) 
v_center = 0.5 * (v[:,0:ny,:] + v[:,1:ny+1,:])

# Write out u_center and v_center into a new netCDF file
ncfile_out = netCDF4.Dataset('./output.nc', 'w')
ncfile_out.createDimension('longitude', nx)
ncfile_out.createDimension('latitude', ny)
ncfile_out.createDimension('level', nz)
u_out = ncfile_out.createVariable('u_center', 'f4', ('longitude', 'latitude', 'level')
v_out = ncfile_out.createVariable('v_center', 'f4', ('longitude', 'latitude', 'level')
u_out[:,:,:] = u_center[:,:,:]
v_out[:,:,:] = v_center[:,:,:]
ncfile_out.close()

如何从命令行使用cdo使用2点平均值,使用shift函数和集合平均值函数?在

cdo selvar,U mitfile.nc u.nc  # select the velocity fields
cdo selvar.v mitfile.nc v.nc 

# shift to the right/up and average both memberss
cdo ensmean -shiftx,1 u.nc u.nc ucen.nc 
cdo ensmean -shifty,1 v.nc v.nc vcen.nc 

# cat the files and calculate the wind:
cdo cat ucen.nc vcen.nc uv.nc
cdo expr,"wind=sqrt(U*U+V*V)" uv.nc wind.nc

注:如果您的字段是全局的,那么您需要使用以下方法在经度方向执行循环移位:

^{pr2}$

相关问题 更多 >