Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
在Fortran子程序中读取多个文件_Fortran - Fatal编程技术网

在Fortran子程序中读取多个文件

在Fortran子程序中读取多个文件,fortran,Fortran,我有一个Fortran子程序,在主程序中被调用多次(我没有访问权限)。在我的子例程中,我希望在每次迭代中根据输入参数从几个(~10^4)文件中的一个读取数据。每个文件都有一行数据;我的数据格式如下: 0.97014199999999995 0.24253600000000000 0.0000000000000000 我使用以下代码行打开和读取文件: program test_read implicit none inte

我有一个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,而用于读取命令的IOSTAT对于某些文件是0,对于某些文件是1,对于其他文件是29!我查找了错误代码29的含义,了解到它可能表示在路径中找不到该文件。但文件肯定在那里
  • 而且,我看不出它无法读取的文件有什么不同。事实上,我甚至看到同一个文件给出的IOSTAT值为0和29
  • 需要注意的是,我正在几个内核上运行主程序。这可能与错误有关吗

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


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

我猜您使用的是固定格式的源代码,因此请注意代码的格式(您可能只想再缩进四列)。我的建议是使用
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显示的代码中没有隐含的形状声明<代码>字符(*)是假定的长度声明。该语法是有效的Fortran 90。我更担心的是,他可能只是从一个进程中打开了太多文件,并且超过了操作系统对打开文件的限制。代码显示文件正在关闭,因此每个进程的文件数可能不是问题。因此,结果表明,不同的线程试图根据同一文件的单元号访问该文件。我通过使用一个可变单元号来解决这个问题,该单元号是输入的函数(
I
,在上面的代码中)。