Fortran 作为时间函数的变量写入NetCDF

Fortran 作为时间函数的变量写入NetCDF,fortran,fortran90,netcdf,Fortran,Fortran90,Netcdf,我试图修改Fortran 90代码,该代码以NetCDF经典格式将2D数组写入输出。我希望变量有一个额外的时间维度(即,它将是一个3D变量),在模型的集成时间内,在每个相应的时间步打印它 我不知道这是怎么做的;我很感激任何能尽可能高效地完成这项工作的建议(也是在最小文件大小的情况下) 您需要做的是定义nf90\u unlimitedlength的时间维度。这将允许您将一个二维数组一次写入一个三维数组中的一个片段,并使该数组的长度未指定。对nf90\u put\u var调用使用start和cou

我试图修改Fortran 90代码,该代码以NetCDF经典格式将2D数组写入输出。我希望变量有一个额外的时间维度(即,它将是一个3D变量),在模型的集成时间内,在每个相应的时间步打印它

我不知道这是怎么做的;我很感激任何能尽可能高效地完成这项工作的建议(也是在最小文件大小的情况下)


您需要做的是定义
nf90\u unlimited
length的时间维度。这将允许您将一个二维数组一次写入一个三维数组中的一个片段,并使该数组的长度未指定。对
nf90\u put\u var
调用使用
start
count
可选伪参数来指定在何处写入二维切片

! create the file
ierr = nf90_create(path='test.nc', cmode=NF90_CLOBBER, ncid=file_id)

! define the dimensions
ierr = nf90_def_dim(file_id, 'X', i, xdim_id)
ierr = nf90_def_dim(file_id, 'Y', j, ydim_id)
ierr = nf90_def_dim(file_id, 'Time', nf90_unlimited, tdim_id)

! now that the dimensions are defined, we can define variables on them,...
arrdims = (/ xdim_id, ydim_id, tdim_id /)
ierr = nf90_def_var(file_id, 'Array',  NF90_REAL, arrdims, array_id)

! done defining
ierr = nf90_enddef(file_id)

! Time loop
do n = 1,nm

  ! Calculations go here

  ! Write out the values      
  ierr = nf90_put_var(file_id, array_id, array, start=[1,1,n], count=[i,j,1])

enddo

我在大多数程序中所做的是在开始时创建文件并定义维度和变量,然后在循环中写入字段。如果模拟需要很长时间,并且希望能够在进行中的模拟期间查看输出,请在模型解算器do循环中执行打开/写入/关闭步骤

您给出的例程用于二维数组。。。您在3D阵列中尝试了什么?您得到了什么错误?现在看来,你的问题太宽泛了!谢谢@Milancuric。这正是我需要的,我会试试看。在NetCDFIf中,如果我想在运行时查看输出,我是否必须先关闭文件,然后再使用(比如)MATLAB?顺便问一下-哪个调用命令对应于每次为“nf90\u put\u var”调用打开文件?(我想我不应该重复使用'nf90_create'。@Jacob使用
nf90_open
nf90_close
分别打开和关闭文件。我相信您需要关闭文件才能读取它,但是,我注意到ncview可以在NetCDF文件处于打开状态并被写入时读取它们。试试看。另外,请在线查阅Fortran NetCDF用户指南。非常有用。@milancurcuc-谢谢你的帮助。我已经编写了一个模块(module_NetCDF),以方便将来的用户查询。非常感谢您的示例。非常有用。试图让我的模型打印出netcdf结果。
! create the file
ierr = nf90_create(path='test.nc', cmode=NF90_CLOBBER, ncid=file_id)

! define the dimensions
ierr = nf90_def_dim(file_id, 'X', i, xdim_id)
ierr = nf90_def_dim(file_id, 'Y', j, ydim_id)
ierr = nf90_def_dim(file_id, 'Time', nf90_unlimited, tdim_id)

! now that the dimensions are defined, we can define variables on them,...
arrdims = (/ xdim_id, ydim_id, tdim_id /)
ierr = nf90_def_var(file_id, 'Array',  NF90_REAL, arrdims, array_id)

! done defining
ierr = nf90_enddef(file_id)

! Time loop
do n = 1,nm

  ! Calculations go here

  ! Write out the values      
  ierr = nf90_put_var(file_id, array_id, array, start=[1,1,n], count=[i,j,1])

enddo