Fortran输出大数组到netCDF nf90_enddef

时间:2015-07-30 23:38:10

标签: arrays fortran fortran90 netcdf dataoutputstream

关于stackoverflow的第一个问题。

我已经坚持了5天。我想在Fortran中编写一个netcdf文件。

我正在使用netcdf / 3.6.3我正在尝试输出一个名为frech的大型43000x 18000阵列和一些较小的阵列(1d阵列)。

我的代码示例在它下面是一个非常大的文件,问题不在于为变量添加值,问题是结束变量的定义:

  print*,"nunks is",nunks
  print*,"neqns is",neqns


  ok=nf90_create('michalek.nc', NF90_CLOBBER, ncid)
  print *,"create ok=",ok

  ok=   nf90_def_dim(ncid,"nunks", nunks, nunks_dimid)
  print *,"def nunks dimension ",ok
  ok=   nf90_def_dim(ncid,"neqns", neqns, neqns_dimid)
  print *,"def neqns dimension ",ok
  dimids=(/neqns_dimid, nunks_dimid/)
  print *,dimids
  ok=   nf90_def_var(ncid,"frech", NF90_REAL, dimids, frech_varid)
  print *,"def frech",ok
  ok=   nf90_def_var(ncid,"src", NF90_REAL, nunks_dimid, src_varid)
  print *,"def src",ok
  ok=   nf90_def_var(ncid,"csrc", NF90_REAL, nunks_dimid, csrc_varid)
  print *,"define csrc",ok
  ok=   nf90_def_var(ncid,"dat", NF90_REAL, neqns_dimid, dat_varid)
  print *,"define dat",ok
  ok=   nf90_def_var(ncid,"cdat", NF90_REAL, neqns_dimid, cdat_varid)
  print *,"define cdat",ok
  ok=   nf90_enddef(ncid)
  print *,"end dif ", ok
  ok=   nf90_put_var(ncid, frech_varid, frech)
  print *, 'frech put in ok=',ok
  ok=   nf90_put_var(ncid, src_varid, src)
  print *, 'src put in ok=',ok
  ok=   nf90_put_var(ncid, csrc_varid, csrc)
  print *, 'csrc put in ok=',ok
  ok=   nf90_put_var(ncid, dat_varid, dat)
  print *, 'dat put in ok=',ok
  ok=   nf90_put_var(ncid, cdat_varid, cdat)
  print *, 'cdat put in ok=',ok
  ok=   nf90_close(ncid)
  print *, 'close?',ok

我知道正确读取文件时ok = 0 但是当我到达结束文件定义的阶段(nf90_enddif)时,ok返回为= -62并且不创建netcdf文件。我认为这是一个太大阵列的问题,但我无法解决这个问题

上述代码的相关输出是:

nunks is       43894
neqns is       18144
create ok=           0
def nunks dimension            0
def neqns dimension            0
     2           1
def frech           0
def src           0
define csrc           0
define dat           0
define cdat           0
end dif          -62
frech put in ok=         -39
src put in ok=         -39
csrc put in ok=         -39
dat put in ok=         -39
cdat put in ok=         -39
close?         -62

感谢您的帮助!

此致 彼得:)

3 个答案:

答案 0 :(得分:1)

这可能是由于netcdf中变量大小的限制,4千兆(见下文)。您可能希望在保存数组之前对其进行切片,或者移至netcdf-4 / hdf-5。

  

是否已消除所有netCDF大小限制?

     

基于netCDF-4 HDF5的格式对变量的大小没有实际限制。

     

但是,对于经典和64位偏移格式,netCDF对象的大小仍然存在限制。每个固定大小的变量(除了最后一个,当没有记录变量时)和一个记录值的单个记录变量(除了最后一个)的数据大小限制为小于4 GiB,这是netCDF 3.6之前版本的两倍大小限制。

     

最大记录数仍为232-1。

有关详细信息,请参阅http://www.unidata.ucar.edu/software/netcdf/docs/faq.html#Large%20File%20Support10

答案 1 :(得分:0)

在NetCDF经典格式中,如果不使用无限制尺寸,则只允许1个超过2GiB的变量。它也必须是数据集中的最后一个变量,并且到开头的偏移量不超过2GiB。看起来移动frech到底应该有效。

答案 2 :(得分:0)

在Argonne-Northwestern的Parallel-NetCDF(http://cucis.ece.northwestern.edu/projects/PnetCDF/)中,我们通过创建CDF-5文件格式来放宽文件大小限制。花了一段时间,但我认为我们正在让Unidata-NetCDF识别它。

如果您控制数据的读者和编写者,您可能希望查看具有较新CDF-5文件格式的parallel-netcdf是否适合您。如果您需要与他人合作,可能要等到它正式成为Unidata的NetCDF(并让Unidata知道它对您有用!)。