0

我一直在尝试将存储为 numpy 数组的数据导出到 GrADS-flat 二进制文件。似乎 GrADS 无法识别 .ctl 文件中给出的 Z 维度。无论我为“设置 z 整数”使用什么值,GrADS 都只显示第一级。

这是我的问题的最小再现

我的python代码:

import numpy as np
from array import array

data = np.linspace(1, 60, num=60, endpoint=True)
data = np.reshape(data, [5, 4, 3])
print(data)

with open('temp.dat', 'ab') as wf:
  float_array = array('f', data.flatten())
  float_array.tofile(wf)
wf.close()

执行此操作会将数字 [1, 2, 3, ..., 60] 作为单精度浮点数写入二进制文件

我的 .ctl 文件:

DSET  ^temp.dat
TITLE title
UNDEF -9.99E33
XDEF 3 LINEAR 0.0  1 
YDEF 4 LINEAR 0.0  1 
ZDEF 5 LEVELS 0 1 2 3 4
TDEF 1 LINEAR 0Z10apr1991 12hr 
VARS      1
var     0  99  some var
ENDVARS

这组 .dat 和 .ctl 文件按预期将前 12 个数字显示为字段的第一级。

ga-> open temp.ctl 
Scanning description file:  temp.ctl
Data file temp.dat is open as file 1
LON set to 0 2 
LAT set to 0 3 
LEV set to 0 0 
Time values set: 1991:4:10:0 1991:4:10:0 
E set to 1 1 
ga-> set digsize 0.6
digsiz = 0.6 
ga-> set lon -1 3
LON set to -1 3 
ga-> set lat -1 4
LAT set to -1 4 
ga-> set gxout grid
ga-> d var

在此处输入图像描述

但是,如果我尝试“设置 z 2”,它仍然显示第一级。 Orelse,var(z=3) 和 var(z=1) 是

var(z=1)=
[[ 1.  2.  3.]
  [ 4.  5.  6.]
  [ 7.  8.  9.]
  [10. 11. 12.]]
  
var(z=3)=
 [[25. 26. 27.]
  [28. 29. 30.]
  [31. 32. 33.]
  [34. 35. 36.]]

这应该显示“24”的常量字段......但GrADS显示“0”,好像z = 3与z = 1相同。

ga-> c
ga-> d var(z=3) - var(z=1)

在此处输入图像描述

更让人无法理解的是,如果我在 .ctl 文件中给出 var2,毕业生们会认为 var2(z=1) 应该是 var2(z=1)!

我知道除了 GrADS 之外还有很多更好的可视化工具,但我想使用遗留的 GrADS 代码,所以这是不可避免的。
我是否以错误的顺序编写了二进制文件?或者二进制文件是否缺少标题或分隔符或什么?如果有人知道为什么会这样,我就是研究生。提前致谢。

4

1 回答 1

0

我的同事刚刚指出问题出在 .ctl 文件中。我已将层号设置为零,GrADS 将其识别为“表面层”,这是一个单层可变场,可以覆盖在其上方的任何层上。

我可以使用更正的 .ctl 文件显示该字段的任何层。

我更正的.ctl。

DSET  ^temp.dat
TITLE title
UNDEF -9.99E33
XDEF 3 LINEAR 0.0  1 
YDEF 4 LINEAR 0.0  1 
ZDEF 5 LEVELS 0 1 2 3 4
TDEF 1 LINEAR 0Z10apr1991 12hr 
VARS      1
// this should be 5 not zero because there are five layers!
// var     0  99  some var
var     5  99  some var
ENDVARS
于 2021-07-02T00:58:02.240 回答