2016-08-09 138 views
0

我有一个小问题,这个简单的Fortran程序输出文件包含额外的零

PROGRAM Calc_U0 
Implicit None 
real, dimension(:,:), allocatable :: x,y 
integer :: n=16589,m=9,nm=6,I,J,r 

open (unit = 7, file = "U0.txt") 
open (unit=99, file='slice06.txt', status='old', action='read') 

allocate(x(n,m)) 
allocate(y(n,nm)) 

do I=1,n 
    read(99,*,END=71) x(I,:) 
enddo 

71 do I=1,n 
    print*,I 
    do J=1,n 
    if(I/=J) then 
     !! if(x(I,1)==x(J,1)) then 
     if(x(I,2)==x(J,2)) then 
      if(x(I,3)==-x(J,3)) then 
       y(I,1)=x(I,1) 
       y(I,2)=x(I,2) 
       y(I,3)=x(I,3) 
       y(I,4)=(x(I,7)+x(J,7))/2 
       y(I,5)=(x(I,8)+x(J,8))/2 
       y(I,6)=(x(I,9)+x(J,9))/2 
       write(7,*) (y(I,r),r=1,6) 
      endif 
     endif 
     !!endif 
    endif 

    enddo 

enddo 

END PROGRAM Calc_U0 

一切似乎都做工精细,直到我看文件U0.txt。该文件包含我的结果以及其他零行(百万),大小为6.4 GB。但是我不明白错误在哪里,因为如果我阅读少于8000行,这个问题就会消失。我在Linux上使用gfortran编译器。

+0

使用标签[tag:fortran]。选择一个描述你的问题的标题,而不仅仅是主题。主题由标签描述。 –

+0

既然'16589 ** 2'就是'275 * 10 ** 6'的北部,如果该程序在嵌套循环中的if语句评估为“真”时写入一个非常大的文件就不足为奇了。 。我得出这样的结论:这是一个数据问题,而不是编程问题。 –

+0

您是否可以访问现代Fortran编译器(2008+)?如果是这样,请使用'newunit'说明符代替硬编码文件标识符单元。 – jlokimlin

回答

1

无论你读多少行都没关系;你的循环仍然是从1到16589。也许你应该把这些循环中的n改为你读的实际行数。