【发布时间】:2017-12-21 12:43:33
【问题描述】:
我对 Fortran 很陌生,并尝试读取 3D (80000*100*10) 单精度 NetCDF 数据(但我只是像 (80000,100,1st) 一样读取 2D 数据)。对于下面未显示的其他代码,我需要将它们转换为双精度。
如果我对所有 NF90 函数以及变量“值”使用真正的单精度,我创建的用于检查读/写是否有效的 .nc 文件确实包含 only "0" '。
如果我使用双精度(代码如下所示),它确实主要包含“0”和几个奇怪的数字,这些数字似乎与输入数据没有任何可能的关联。至少我可以通过这种方式在我的 nc 文件中得到任何输出。
如果我在 NF90 函数之后检查特定行,我不会收到任何编译错误{也不会出现“状态”中的错误代码。更新:那是错误的}。 Input_test.nc 在尺寸方面完全按照预期创建,但与实际值无关。
我的代码是:
PROGRAM read
Implicit None
INCLUDE 'netcdf.inc'
INTEGER :: NCID, horstart, verstart, horlen, verlen, horcount, vercount, STATUS, STATUS2
REAL(kind=8), DIMENSION(80000,100) :: values
horstart = 1
verstart = 1
horcount = 80000 !!(tried to use this instead of horlen, doesn't change anything)
vercount = 100 !!(tried to use this instead of verlen, doesn't change)
varname = 'pres'
!! get input data
STATUS = NF90_OPEN('my_valid_path/file.nc', 0, NCID)
STATUS = NF90_INQ_DIMID(NCID, 'ncells', horid)
STATUS = NF90_INQ_DIMID(NCID, 'height', verid)
STATUS = NF90_INQ_DIMLEN(NCID,horid,horlen)
STATUS = NF90_INQ_DIMLEN(NCID,verid,verlen)
STATUS = NF90_INQ_VARID(NCID,varname,varid)
STATUS = NF90_GET_VARA_DOUBLE(NCID,varid,[horstart,verstart,1],[horlen,verlen,1],values)
STATUS = NF90_CLOSE(NCID)
STATUS = NF90_CREATE ('some_path/input_test.nc', 0, ncid);
STATUS = NF90_DEF_DIM (ncid, 'hor',horcount, dimhor)
STATUS = NF90_DEF_DIM (ncid, 'ver',vercount, dimver)
STATUS = NF90_DEF_DIM (ncid, '1d',1, dimcode)
STATUS = NF90_DEF_VAR(ncid,'pres',NF90_DOUBLE,2,[dimhor,dimver],pres_id)
STATUS = NF90_DEF_VAR(ncid,'status',NF90_INT,1,dimcode,stat_id)
STATUS = NF90_ENDDEF(ncid)
STATUS = NF90_PUT_VARA_DOUBLE(ncid,pres_id,[horstart,verstart],[horcount,vercount],values)
STATUS = NF90_PUT_VARA_INT(ncid,stat_id,1,1,STATUS2)
STATUS = NF90_CLOSE(ncid)
我从中读取的 nc 文件不包含任何零,即使在第三维也不包含。然而,输出文件确实包含很多零,但它不是空的。
示例输入:0,095213220 0,099325478 0,10358732 0,10800611 0,11259078 0,11734842 0,12228279 0,12740466 0,13271827 0,138242863 0,1493
示例输出:0 0 0 0 0 0,000493943283800036 0,000594558776356280 0,000234268474741839 2,88491937681101e-05 2,09666131608306e-16403e-09806e-164037,
我可能在做一些愚蠢的事情,但我暂时不知道要检查什么。
更新:彻底检查 STATUS 中保存的错误代码确实在 NF90_GET_VARA_DOUBLE/(也是 REAL)处给出了非零匹配。明天再说。
【问题讨论】:
-
请注意
kind=8丑陋且不可移植。它并不意味着所有编译器中的双精度或 8 字节。一些编译器根本没有 kind 8,也不会编译你的代码。见stackoverflow.com/questions/838310/fortran-90-kind-parameter -
我是否正确地看到您正在以双精度读取输入文件?你说它是单精度的。
-
非常感谢!但是,我尝试使用 REAL(然后与 NF90_GET/PUT_VARA_REAL 和 NF90_REAL 一起使用)以及 REAL(wp),所有这些都编译并创建了一个输出文件,但输出文件中没有或不正确的值。我的意思是输入 nc 文件本身似乎包含单精度值(如果使用 Matlab 进行检查)。
-
包含
my_valid_path/file.nc的CDL 描述可能会提供信息。 -
什么是“CDL 描述”? :-)
标签: input fortran output netcdf