使用netcdf4编写netcdf经典格式文件

时间:2014-02-16 21:49:21

标签: fortran mpi netcdf

我最近才遇到netcdf并且对使用它没有太多线索。除此之外 - 我遇到的问题是具体的,我还没有找到任何有用的东西。我有一个fortran代码,使用MPI执行parralel中的claculations。最终结果 - 笛卡尔坐标系中的3d字段 - 然后使用netcdf将每个字段写入另一个文件。写入过程由以下代码定义:

nf90_create(path=file_name,&
           cmode=IOR(NF90_NETCDF4,NF90_MPIIO),ncid=ncid,&
           comm=mpid%comm,info=MPI_INFO_NULL))

现在,我有另一个使用netcdf3的代码,因此无法读取netcdf4格式。我想要做的是用NF90_CLASSIC_MODEL更改cmode NF90_NETCDF4。当我这样做时,代码编译,运行,但它以完全错误的方式写入数据。此外,它在从写入变量A到写入变量B之前停止。或者在它必须退出使用此命令的子例程之前停止。为了澄清一点:在提供的命令之后,代码根据MPI定义了开始和计数,并使用followind netcdf命令:

nf90_def_dim(ncid,dim_name(i),dim_len(i),dimid(i))
nf90_def_var(ncid,var_name,nf90_real,dimid,varid(1))
nf90_enddef(ncid)
nf90_put_var(ncid,varid(1),var,start=startv,count=countv)
nf90_close(ncid)

所以,我很感兴趣,我应该更改代码以经典或64bit_offstring格式编写所需的数据,而不会提到问题。如果问题的表述不清楚,我可以提供给我带来麻烦的原始子程序。

提前感谢您提出的所有意见

1 个答案:

答案 0 :(得分:2)

您是否检查过NetCDF例程返回的状态?无论如何都不可能并行写入NetCDF3格式,因此nf90_open语句中可能已经存在错误。 尝试将NetCDF调用封装到提供的check子例程中。这应该会给你更有意义的错误信息:

call check( nf90_open(...) )


contains
  subroutine check(status)
    integer, intent ( in) :: status

    if(status /= nf90_noerr) then 
      print *, trim(nf90_strerror(status))
      stop "Stopped"
    end if
  end subroutine check