回顾关闭使用Fortran创建的NetCDF文件

时间:2017-03-21 10:07:43

标签: fortran netcdf

我正在运行一个剥离到最低限度的分布式模型:

integer, parameter :: &
nx = 1200,& ! Number of columns in grid
ny = 1200,& ! Number of rows in grid
nt = 6000   ! Number of timesteps

integer :: it ! Loop counter

real :: var1(nx,ny), var2(nx,ny), var3(nx,ny), etc(nx,ny) 

! Create netcdf to write model output
call check( nf90_create(path="out.nc",cmode=nf90_clobber, ncid=nc_out_id) )

! Loop over time
do it = 1,nt

   ! Calculate a lot of variables 
   ...

   ! Write some variables in out.nc at each timestep
   CALL check( nf90_put_var(ncid=nc_out_id, varid=var1_varid, values=var1, &
    start = (/ 1, 1, it /), count = (/ nx, ny, 1 /)) )

   ! Close the netcdf otherwise it is not readable: 
   if (it == nt)  call check( nf90_close(nc_out_id) )

enddo

我处于模型的开发阶段,所以它不可避免地在意外点(通常在Calculate a lot of variables阶段)崩溃,这意味着,如果模型在时间步长it =3000崩溃,则2999时间步长将写入netcdf输出文件,但由于文件尚未关闭,我将无法读取该文件。尽管如此,数据已写入:我目前有一个2GB的out.nc文件,我无法阅读。当我ncdump显示的文件

netcdf out.nc {
dimensions:
         x = 1400 ;
         y = 1200 ;
         time = UNLIMITED ; // (0 currently)
variables:
         float var1 (time, y, x) ;
data:
}

我的问题是:(1)是否有办法追溯性地关闭文件,甚至在Fortran之外,以便能够读取已经写入的数据? (2)或者,是否有另一种方法可以在Fortran中编写文件,即使不关闭它也可以使文件可读?

1 个答案:

答案 0 :(得分:1)

调用nf90_close时,缓冲输出将写入磁盘并放弃文件ID,以便可以重复使用。问题很可能是由于缓冲输出未在程序因崩溃而终止时写入磁盘,这意味着只有在“定义模式”中所做的更改才会出现在文件中(如ncdump所示)。 / p>

因此,您需要更频繁地强制将数据写入磁盘。有三种方法可以做到这一点(据我所知)。

  • nf90_sync - 在调用时将缓冲的数据同步到磁盘。这使您可以最大程度地控制何时输出数据(例如,每个循环步骤,或每n个循环步骤),这可以让您优化速度与稳健性,但会为您引入更多编程和检查开销。
  • 感谢@RussF提出这个想法。使用nf90_share标志创建或打开文件。如果netCDF文件打算同时由多个读取器/写入器使用,则建议使用此方法。它与用于写入数据的nf90_sync的自动实现基本相同。它提供的控制较少,但编程开销也较少。注意:
      

    这仅适用于netCDF-3 classic或64位偏移文件。

  • 最后,我不推荐一个选项,但包括完整性(我想可能会出现这种情况,这是最好的选择,尽管没有人想到) - 关闭并重新打开文件。我不建议这样做,因为它会降低你的程序速度,并增加导致错误的可能性。