【问题标题】:Strange numbers in the output from Netcdf in FortranFortran 中 Netcdf 输出中的奇怪数字
【发布时间】: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


【解决方案1】:

通过错误处理程序,我得出上述代码有效的结论。这些错误最终来自我试图读取的变量的拼写错误。

【讨论】:

    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多