我正在运行一个剥离到最低限度的分布式模型:
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中编写文件,即使不关闭它也可以使文件可读?
答案 0 :(得分:1)
调用nf90_close
时,缓冲输出将写入磁盘并放弃文件ID,以便可以重复使用。问题很可能是由于缓冲输出未在程序因崩溃而终止时写入磁盘,这意味着只有在“定义模式”中所做的更改才会出现在文件中(如ncdump所示)。 / p>
因此,您需要更频繁地强制将数据写入磁盘。有三种方法可以做到这一点(据我所知)。
nf90_sync
- 在调用时将缓冲的数据同步到磁盘。这使您可以最大程度地控制何时输出数据(例如,每个循环步骤,或每n个循环步骤),这可以让您优化速度与稳健性,但会为您引入更多编程和检查开销。nf90_share
标志创建或打开文件。如果netCDF文件打算同时由多个读取器/写入器使用,则建议使用此方法。它与用于写入数据的nf90_sync
的自动实现基本相同。它提供的控制较少,但编程开销也较少。注意:
这仅适用于netCDF-3 classic或64位偏移文件。