在netcdf4 fortran 77中添加变量

时间:2014-11-19 16:11:28

标签: variables fortran netcdf

我正在尝试以netCDF4格式保存模型的输出(用fortran 77编写)。我正在使用gfortran。由于我是fortran的新手,我写了一个简单的代码,我在其中创建虚拟变量并将其添加到我的测试netcdf文件中,模拟模型的维度,变量和属性。它运作得很好。

我知道我的代码有效,我继续下一步。嗯,问题是相同的代码不起作用,我找不到原因。模型代码是旧的并且在一个.for文件中“组织”。有趣的是,主代码是作为子程序编写的。该计划的基本结构是:

  implicit real*8(a-h,o-z) 
  character dummy*80
  ...
  call main(delt,npl)      
  end    

  subroutine main(delt, npl)
  *variable declarations*
  ...
  end

我的方法是在“main”子程序之外创建netcdf文件。它工作,netcdf文件已创建。在“main”里面我定义了维度和变量(因为它们是基于子程序内部生成的数据)。当我只添加维度时,代码就像魅力一样:

  Setting dimensions
  nc_status = nf_def_dim(ncid,'parcel_id', ntot, prcl_dimid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)
  nc_status = nf_def_dim(ncid, 'time', icomp, time_dimid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)
  End define mode.
  nc_status = nf_enddef(ncid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)
  Close the file
  nc_status = nf_close(ncid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)

生成的nc文件具有正确尺寸的正确尺寸。当我尝试添加变量时出现问题:

  Dimensions
  nc_status = nf_def_dim(ncid,'parcel_id', ntot, prcl_dimid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)
  nc_status = nf_def_dim(ncid, 'time', icomp, time_dimid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)
  dimids(1) = prcl_dimid
  dimids(2) = time_dimid

  Variables
  **nc_status = nf_def_var(ncid, 'latitude', NF_FLOAT, 2, dimids, 
 +     lat_varid)**
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)

  End define mode.
  nc_status = nf_enddef(ncid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)

  Close the file
  nc_status = nf_close(ncid)
  if (nc_status .ne. nf_noerr) call handle_err(nc_status)

我从代码的粗体字体部分得到以下错误。

错误:NetCDF:不是有效的数据类型或_FillValue类型不匹配

首先,当我创建具有虚拟值的简单fortran文件时,此代码(完全相同)有效。其次,我没有定义填充值。第三,根据UNIDATA网站,NF_FLOAT是一种有效的数据类型。

我也尝试在“main”子程序中创建整个netcdf4,但是我得到了同样的错误。我用我所有的想象力试图弄清楚发生了什么,显然,没有其他人有同样的问题(或者至少没有在网上提到它......)。但我是fortran的初学者,一切皆有可能。

如果对你来说这是一个愚蠢的问题,那就太好了。对我来说一点都不傻!

0 个答案:

没有答案