創建我正在剝奪其最低限度之下的分佈式模型netCDF文件:回顧性關閉與Fortran語言
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中編寫文件的方法,即使不關閉文件也可以使文件可讀?
可以在每個循環步驟調用['nf90_sync'](http://www.unidata.ucar.edu/software/netcdf/netcdf-4/newdocs/netcdf-f90/NF90_005fSYNC.html)(或一些循環步驟),它應該將緩衝數據寫入文件並可能解決一些問題。我不知道是否可以追溯關閉文件。 – SteveES
調用'nf90_sync'應該可以。另一種選擇是使用'NF90_SHARE'標誌創建文件。這可能比明確同步文件時更麻煩。 – RussF
你實際上可以在fortran中創建一個MWE,我在這裏沒有看到問題。這很好,因爲在程序崩潰的地方它確實很重要。然而,按照之前的評論所說的同步應該做到這一點,如果沒有,也可以在每一步中關閉/打開文件(有一些開銷,所以不是建議的解決方案),或者寫更多和更小的文件並稍後合併它們進入HDF5邏輯組。 – kakk11