Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用openmp在fortran中读取多个netcdf文件_Fortran_Openmp_Netcdf4 - Fatal编程技术网

使用openmp在fortran中读取多个netcdf文件

使用openmp在fortran中读取多个netcdf文件,fortran,openmp,netcdf4,Fortran,Openmp,Netcdf4,我有两个netcdf文件-ocean_rst_01.nc和ocean_rst_02.nc-我希望使用Fortran中的openmp并行读取。我使用的代码如下 implicit none .... .... !$OMP THREADPRIVATE(ncid,varid) write ( *, '(a,i8)' ) & ' The number of processors available = ', omp_get_num_procs ( )

我有两个netcdf文件-ocean_rst_01.nc和ocean_rst_02.nc-我希望使用Fortran中的openmp并行读取。我使用的代码如下

   implicit none
   ....
   ....

   !$OMP THREADPRIVATE(ncid,varid)
     write ( *, '(a,i8)' ) &
  '  The number of processors available = ', omp_get_num_procs ( )
     write ( *, '(a,i8)' ) &
  '  The number of threads available    = ', omp_get_max_threads ( )
   filen = "ocean_rst_0x"
   !$OMP PARALLEL DO PRIVATE(j,filename,varname,buf) 
   do i = 1, nbv
      j = OMP_GET_THREAD_NUM()
      print*,"i=",i, "j = ",j! OMP_GET_THREAD_NUM()
      if (i<10) write(num,"(a11,i1)") filen,i
      if (i>=10) write(num,"(a10,i2)") filen,i
      filename(i)=trim(num)//".nc"
      write(6,*) "Reading file = ",trim(filename(i))," by ", j
      varname="CHLA"

      call check( NF90_OPEN(trim(filename(i)),NF90_NOWRITE,ncid) )
      call check( NF90_INQ_VARID(ncid,trim(varname),varid) )
      start = (/1, 1, 1/)
      count = (/nlon, nlat, nlev/)
      call check( NF90_GET_VAR(ncid,varid,buf,start=start, &
       count = count) )
      call check( NF90_CLOSE(ncid))

      call check( NF90_OPEN(trim(filename(i)),NF90_NOWRITE,ncid) )
      call check( NF90_INQ_VARID(ncid,"zeta",varid) )
      start_1 = (/1, 1/)
      count_1 = (/nlon, nlat/)
      call check( NF90_GET_VAR(ncid,varid,buf2d,start=start_1, &
       count = count_1) )
      call check( NF90_CLOSE(ncid))

      var(:,:,:,i) = buf(:,:,:)
      var2d(:,:,i) = buf2d(:,:)
      write(6,*) "var = ",var(132,231,39,i), "read by thread = ",j
      write(6,*) "zeta = ",var2d(132,231,i), "read by thread = ",j
   enddo
   !$OMP END PARALLEL DO

  end
隐式无
....
....
!$OMP线程专用(ncid、varid)
写入(*,‘(a,i8)’)&
“可用处理器数=”,omp\u get\u num\u procs()
写入(*,‘(a,i8)’)&
“可用线程数=”,omp\u get\u max\u线程()
filen=“ocean\u rst\u 0x”
!$OMP并行DO专用(j,文件名,变量名,buf)
i=1,nbv吗
j=OMP\u GET\u THREAD\u NUM()
打印*,“i=,i,”j=,j!OMP_GET_THREAD_NUM()
如果(i=10)写入(num,“(a10,i2)”)文件n,i
文件名(i)=修剪(num)/“.nc”
写入(6,*)“读取文件=”,修剪(文件名(i)),“由”,j
varname=“CHLA”
调用检查(NF90_打开(修剪(文件名(i)),NF90_NOWRITE,ncid))
呼叫检查(NF90_INQ_VARID(ncid、trim(varname)、VARID))
开始=(/1,1,1/)
计数=(/nlon,nlat,nlev/)
呼叫检查(NF90获取变量(ncid、varid、buf、start=start、&
计数=计数)
呼叫检查(NF90_关闭(ncid))
调用检查(NF90_打开(修剪(文件名(i)),NF90_NOWRITE,ncid))
呼叫检查(NF90\u INQ\u VARID(ncid,“zeta”,VARID))
start_1=(/1,1/)
计数_1=(/nlon,nlat/)
呼叫检查(NF90获取变量(ncid、varid、buf2d、start=start 1、&
计数=计数(1))
呼叫检查(NF90_关闭(ncid))
变量(:,:,:,i)=buf(:,:,:,:)
var2d(:,:,i)=buf2d(:,:)
写(6,*)“var=”,var(132231,39,i),“readbythread=”,j
写(6,*)“zeta=”,var2d(132231,i),“线程读取=”,j
结束循环
!$端部平行DO
结束
我正在CRAY机器上使用ftn和netcdf4库编译代码

我得到随机输出。有时我会得到正确的输出。有时,两个线程的var2d和/或var输出是相同的。如果我将buf2d声明为private,我会得到一个分段错误(核心转储)错误。有时我会犯以下错误

a、 out:posixio.c:442:px_rel:Assertion`pxp->bf_offset bf_offset+(off_t)pxp->bf_extent'失败。 中止(堆芯转储)


如果我读取多个ascii文件,上面的算法工作得很好。使用openmp在fortran 90中读取多个netcdf文件的正确方法是什么

不幸的是,netcdf当前不是线程安全的,例如,请参阅

例如,尽管人们似乎确实在考虑这样做


因此,您希望执行的操作不太可能正常工作,如果正常工作,则可能无法可靠工作,因为一个线程的操作将“干扰”另一个线程的操作。

欢迎,请执行以下操作。所有Fortran问题都使用tag。Fortran 90只是一个旧版本。什么是
num
?它来自哪里?请声明您的所有变量,请参阅。您是否确实知道netcdf是线程安全的,如果是,它是以线程安全的方式编译的?
netcdf
不是线程安全的,除了java接口。非常感谢你提供的信息。我现在已经放弃了这种方法,转而使用mpi。它与mpi一起工作。@aryapaul您有一些关于如何在nf90_open中使用mpi的示例吗?