调整Fortran代码以编写文件,运行可执行文件并从文件中读取数组

时间:2014-07-01 16:01:02

标签: fortran

我是Fortran的新手,但我正在尝试修改Fortran代码,而我在做一些我认为可能很简单的事情时遇到了麻烦。

我想调整一个名为original.f的Fortran文件,以便它生成一个名为input.inp的输入文件,并用之前在original.f中计算的4个整数填充它,以便input.inp看起来像,例如:

    &input
        A = 1
        B = 2
        C = 3
        D = 4
    &end

我知道如何写这种格式:

    OPEN(UNIT=10,FILE='input.inp')
    WRITE (10,00001) 1,2,3,4
    ...
    ...
    ...
    00001 Format (/2x,'&input',
         &        /2x,'A = ',i4,
         &        /2x,'B = ',i4,
         &        /2x,'C = ',i4,
         &        /2x,'D = ',i4,
         &        /2x,'&end')

(或类似的东西,当我让它工作时我可以摆弄)但我不知道如何创建input.inp文件将其写入其中然后使用此输入文件。

输入文件需要用于运行名为" exec"的可执行文件。我会在bash中运行它:

    ./exec < input.inp > output.out

其中output.out包含两个名为eg(11)和ai(11,6,2)的数组(给定维度),如:

    eg(1)= 1
    eg(2)= 2
    ...
    ...
    ...
    eg(11)= 11
    ai(1,1,1)= 111
    ai(1,2,1)= 121
    ...
    ...
    ...
    ai(11,6,2)=1162

最后,我需要将这些输入读回到original.f中,以便可以在文件中进一步使用它们。我在original.f的开头定义了这些数组:

    COMMON /DATA  / eg(11),ai(11,6,2)

但我不确定Fortran是否会从output.out中读取linw来填充这些数组。

对此过程中任何阶段的任何帮助都将非常感激。

非常感谢

詹姆斯

2 个答案:

答案 0 :(得分:1)

由于您已经展示了如何创建输入文件,我假设问题是如何阅读它。该代码显示了&#34; a&#34;和&#34; b&#34;跳过第一行后,可以从连续的行中读取。在Windows上,如果生成的可执行文件是a.exe,则命令a.exe&lt; data.txt或类型data.txt | a.exe将从data.txt中读取。

program xread
implicit none
character (len=10) :: words(3)
integer, parameter :: iu = 5 ! assuming unit 5 is standard input
integer            :: a,b
read (iu,*) ! skip line with &input
read (iu,*) words ! read "a", "=", and "1" into 3 strings
read (words(3),*) a ! read integer from 3rd string
read (iu,*) words ! read "b", "=", and "1" into 3 strings 
read (words(3),*) b ! read integer from 3rd string
print*,"a =",a," b =",b
end program xread

答案 1 :(得分:0)

如果我正确理解了扩展的问题,你必须处理一个输出文件,由你未编写的其他代码生成,使用eg(1) = ...这样的行。

对于您事先了解元素数量及其排序的最简单情况,您只需从后面搜索每一行的等号:

program readme
  implicit none
  character(100) :: buffer
  integer :: i, j, k, pos, eg(11), ai(11,6,2)

  do i = 1,11
    read*, buffer
    pos = index(buffer, '=', back = .true.)
    read(buffer(pos+1:), *) eg(i)
  enddo

  ! I have assumed an arbitrary ordering here
  do k = 1,2
    do i = 1,11
      do j = 1,6
        read*, buffer
        pos = index(buffer, '=', back = .true.)
        read(buffer(pos+1:), *) ai(i,j,k)
      enddo
    enddo
  enddo 
end program

为简单起见,假设数据是提供给标准输入的。