Fortran 在NetCDF中沿无限维写入标量变量
我试图将流体力学模型中的时间变量写入netcdf文件(无限维变量)。我在Fortran90中附加了一个简化的代码示例,突出了我的问题 根据用户指定的输出间隔(本例中为10次),在模拟过程中多次调用用于写入netcdf文件的子例程。我可以在第一次调用子例程时创建文件并添加属性 在子例程的后续调用过程中,我无法正确获取start和count变量以将时间变量写入文件。这就是错误,在编写模型时间变量时,我在尝试编译代码时收到:错误:对于通用的“nf90\u put\u var”没有特定的函数Fortran 在NetCDF中沿无限维写入标量变量,fortran,fortran90,netcdf,Fortran,Fortran90,Netcdf,我试图将流体力学模型中的时间变量写入netcdf文件(无限维变量)。我在Fortran90中附加了一个简化的代码示例,突出了我的问题 根据用户指定的输出间隔(本例中为10次),在模拟过程中多次调用用于写入netcdf文件的子例程。我可以在第一次调用子例程时创建文件并添加属性 在子例程的后续调用过程中,我无法正确获取start和count变量以将时间变量写入文件。这就是错误,在编写模型时间变量时,我在尝试编译代码时收到:错误:对于通用的“nf90\u put\u var”没有特定的函数 PROGR
PROGRAM test_netcdf
IMPLICIT NONE
INTEGER :: N
REAL :: time_step = 2.
! Call efdc_netcdf 10 times
DO N=1,10
CALL efdc_netcdf(N, time_step)
time_step=time_step + 1.
ENDDO
END PROGRAM test_netcdf
************************************
! Create NetCDF file and write variables
SUBROUTINE efdc_netcdf(N, time_step)
USE netcdf
IMPLICIT NONE
LOGICAL,SAVE::FIRST_NETCDF=.FALSE.
CHARACTER (len = *), PARAMETER :: FILE_NAME = "efdc_test.nc"
INTEGER :: ncid, status
INTEGER :: time_dimid
INTEGER :: ts_varid, time_varid
INTEGER :: start(1), count(1)
INTEGER :: deltat
INTEGER :: N
REAL :: time_step
start=(/N/)
count=(/1/)
! Create file and add attributes during first call of efdc_netcdf
IF(.NOT.FIRST_NETCDF)THEN
status=nf90_create(FILE_NAME, NF90_CLOBBER, ncid)
! Define global attributes once
status=nf90_put_att(ncid, NF90_GLOBAL, 'format', 'netCDF-3 64bit offset file')
status=nf90_put_att(ncid, NF90_GLOBAL, 'os', 'Linux')
status=nf90_put_att(ncid, NF90_GLOBAL, 'arch', 'x86_64')
! Define deltat variable
status=nf90_def_var(ncid,'deltat',nf90_int,ts_varid)
! Define model time dimension
status=nf90_def_dim(ncid,'efdc_time',nf90_unlimited,time_dimid)
! Define model time variable
status=nf90_def_var(ncid,'efdc_time',nf90_real,time_dimid,time_varid)
status=nf90_enddef(ncid)
! Put deltat during first call
deltat=7
status=nf90_put_var(ncid, ts_varid, deltat)
FIRST_NETCDF=.TRUE.
ENDIF
! Put model time variable
status=nf90_put_var(ncid, time_varid, time_step, start=start, count=count)
! Close file at end of DO loop
IF(N.EQ.10) THEN
status=nf90_close(ncid)
ENDIF
RETURN
END SUBROUTINE efdc_netcdf
问题出现在编译器标志行中:
status=nf90_put_var(ncid, time_varid, time_step, start=start, count=count)
您正(正确地)尝试将标量变量time\u-step
沿变量time\u-varid
写入特定索引(start
),该变量在一维无限范围维度上定义。但是,在这种情况下,可选参数计数没有意义;您正在写入标量,计数只能是1。因此,采用单个标量作为输入的nf90\u put\u var()
的fortran绑定没有为count定义可选参数,这就是为什么编译器会出现“没有针对泛型“nf90\u put\u var”的特定函数”错误。这一切都是完全合理的,但无论是错误消息还是文档都不能超级有助于找出解决问题的方法
您可以通过将时间步长数据放入real,dimension(1)
变量来修复代码,并将其替换为;但最简单的方法是去掉count规范,这在这里是不必要的:
status=nf90_put_var(ncid, time_varid, time_step, start=start)
不要理会前面的评论。
nf90\u put\u var
的count
参数对于标量参数(如单个实数)没有任何意义。忽略这一点,否则您的程序将按照此处所写的方式工作(gfortran、netcdf 4.1.3和4.2.1)。我也将尝试忽略计数,但当我将维度(1)
添加到实数
变量声明中时,代码工作正常。