首页 文章

如何在FORTRAN程序运行时打开外部文件

提问于
浏览
1

我有一个执行数值积分的FORTRAN代码 . 所有计算数据都写在外部文件(data.out)中 . 这是代码的简单草图

OPEN(UNIT=10,FILE='data.out')
DO i=1,n

........

WRITE(10,'(7(E22.16,1x))')a,b,c,d,e,f,g

........

ENDDO
CLOSE(10)

该程序长时间运行(约1.5小时),直到数值积分完成 . 在执行期间,我希望在.out文件中看到结果 . 但是,当我尝试在.exe运行时打开.out文件时,我收到以下消息:“文档data.out被另一个应用程序使用,无法访问 . ”那么,有没有办法在执行期间打开.out文件?对我来说,观察输出值很重要(它们不仅仅是上面例子中的七个),因此,在屏幕输出中发送它们并不方便(显着降低了代码的速度) . 提前谢谢了 .


*** EDIT ***


这是另一种与上述情况非常相似的情况 . 这里,集成例程从输入文件中读取初始条件,并将输出写入另一个外部文件 . 下面我将介绍相应的代码框架

OPEN(UNIT=10,FILE='input.par',STATUS='UNKNOWN')
 2   READ(10,*,END=1) x_0,y_0

 !   INTEGRATION LOOP
     DO i=1,n
     ........
     ENDDO

     OPEN(UNIT=12,FILE='data.out')
     WRITE(12,'(7(E22.16,1x))')a,b,c,d,e,f,g

     GOTO 2

 1   CLOSE(10)
     CLOSE(12)

因此,例程打开UNIT 10读取初始条件,执行集成,并在集成结束时将输出写入UNIT 12.然后,它需要另一组初始条件并重复相同的过程,直到它不再有UNIT 10中的初始条件 . 同样,我希望能够打开并监视UNIT 12.我尝试了你的方法,但在这种情况下它无法正常工作 . 我可以随时打开UNIT 12,但例程不会写出那里的所有输出 . 实际上,它只写入最后一组初始条件的输出 . 有任何想法吗?我坚信,对您的方法进行微小修改可以完成这项工作 .

2 回答

  • 1

    除了将结果打印到屏幕之外,您可以在每次写入操作后关闭文件,并在下一个集成周期中重新打开它以将新数据附加到它 .

    program test
      implicit none
    
      integer :: ii
    
      ! Create emtpy file
      open(10, file='data.out', status='REPLACE', action='WRITE')
      close(10)
    
      do ii = 1, 100
        !...
        ! Reopen file, append new information and close it again.
        open(10, file='data.out', status='OLD', action='WRITE', position='APPEND')
        write(10,'(7(E23.16,1x))') 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0
        close(10)
      end do
    
    end program test
    

    编辑:主要的想法是,在开始任何类型的循环之前,您可以通过第一个open语句创建一个空文件:

    open(10, file='data.out', status='REPLACE', action='WRITE')
      close(10)
    

    然后,在循环内部,您只需附加到该文件,以确保不替换已存在的内容:

    open(10, file='data.out', status='OLD', action='WRITE', position='APPEND')
    write(10,'(7(E23.16,1x))') 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0
    close(10)
    

    请注意传递给 open 语句的参数的差异 .

  • 0

    这样做的逻辑方法是将输出回显给终端 . 默认情况下,这是6单元 . 所以我会将输出更改为:

    WRITE(6,'(7(E22.16,1x))')a,b,c,d,e,f,g
    WRITE(10,'(7(E22.16,1x))')a,b,c,d,e,f,g
    

    试试看吧 . 它甚至可能工作 .

相关问题