【问题标题】:Reading many files in Fortran subroutine在 Fortran 子例程中读取许多文件
【发布时间】:2016-12-23 11:36:12
【问题描述】:

我有一个在主程序中多次调用的 Fortran 子例程(我无权访问)。在我的子例程中,我希望根据输入参数在每次迭代中从几个(~10^4)文件之一中读取数据。每个文件都有一行数据;我的数据格式如下:

  0.97014199999999995       0.24253600000000000        0.0000000000000000    

我正在使用以下代码行来打开和读取文件:

      program test_read
      implicit none
      integer  :: i, iopen_status, iread_status
      real :: gb
      CHARACTER(len=25) :: filename
      CHARACTER(*), PARAMETER :: fileplace =
     & "/home/ajax/hexmesh_readn/G3/"
      dimension gb(3)

      i = 5
      WRITE(filename,'(a,I0,a)')'GBn_',i,'.txt'
      open(unit=15,
     & file=fileplace//filename,IOSTAT=iopen_status)
      read (15,*,IOSTAT=iread_status) gb
      print *,"gb",gb(1),gb(2),gb(3)
      close(15)
      end program test_read
  • 在主程序中,i 是一个变量,但我有一个包含 i 的所有可能值的文件。
  • 现在,当我在本地计算机上运行时,这段代码运行良好。但是,当我将它与主程序一起提交时,它的行为有些奇怪。具体来说,它读取一些文件,但不读取其他文件。
  • 当我打印出用于打开和读取的 IOSTAT 时,我看到所有文件的打开 IOSTAT 为 0,而对于读取命令,一些文件为 0,一些文件为 -1,其他文件为 29!我查看了错误代码 29 的含义,我了解到它可能表明在路径中找不到该文件。但是文件肯定在那里。
  • 另外,我看不出它无法读取的文件有什么不同。事实上,我什至看到同一个文件给出 0 和 29 的 IOSTAT 值!
  • 需要注意的一点是,我在多个内核上运行主程序。这可能与错误有关吗?

【问题讨论】:

  • 我猜你使用的是固定格式的源代码,所以请注意代码的格式(你可能只是想再缩进四列)。我的建议 elsewhere 使用 iomsg= 说明符(并在使用 iostat= 时检查 iostat 值)适用于此。
  • 看起来iomsg 仅在 Fortran 2003 及更高版本中可用,但我使用的是 Fortran 90。另外,你的意思是我应该缩进 4 列?在第一列之前?
  • iomsg=,试试吧。它可能不适用于您的编译器,但目前流行使用的只有 Fortran 90 的编译器很少(并且没有更多的 Fortran 2003 编译器)。值得注意的是,您在问题中的代码不是 Fortran 90。
  • @francescalus 是对的!您的代码甚至不符合 Fortran 2003。 Fortran 2008 中引入了隐含形状声明;因此 `CHARACTER(*), PARAMETER :: fileplace = & "/home/ajax/hexmesh_readn/G3/" 不是有效的 Fortran 90 但完全合法的 Fortran 2008+。
  • @jlokimlin 显示的代码中没有隐含的形状声明。 CHARACTER(*) 是一个假定的长度声明。该语法在 Fortran 90 中有效。

标签: fortran


【解决方案1】:

您是否同时运行同一程序的多个实例?在某些操作系统上,不同的程序不能同时打开同一个文件。指定您想要只读访问可能允许多个程序访问。在 Fortran 开放语句上:action='read'

如果您正在运行多线程程序,那么不同的线程可能会同时对不同的文件进行 IO...每个线程应该使用不同的单元号以避免冲突。

【讨论】:

  • 我更担心他可能只是从一个进程中打开了太多文件,超出了操作系统对打开文件的限制。
  • 代码显示文件正在关闭,因此每个进程的文件数可能不是问题。
  • 所以,不同的线程试图根据其单元号访问同一个文件。我通过使用作为输入函数的可变单元号(上面代码中的i)解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2020-03-13
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多