2016-08-09 4 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 ГБ. Но я не понимаю, где ошибка, потому что если я прочитаю менее 8000 строк, эта проблема исчезнет. Я на Linux с компилятором gfortran.

+0

Используйте тег [tag: fortran]. Выберите заголовок, который описывает вашу проблему, а не только тему. Тема описывается тегами. –

+0

Поскольку '16589 ** 2' находится к северу от' 275 * 10 ** 6', было бы неудивительно, если бы эта программа записывала очень большой файл, когда операторы 'if' внутри вложенного цикла вычислялись на' .true.' , Я пришел к выводу, что это проблема с данными, а не проблема программирования. –

+0

У вас есть доступ к современному компилятору Fortran (2008+)? Если это так, пожалуйста, используйте спецификатор 'newunit' вместо единиц идентификатора файла жесткого кодирования. – jlokimlin

ответ

1

Не имеет значения, сколько строк вы читаете; ваши петли все еще идут от 1 до 16589. Возможно, вы должны изменить n в этих циклах на фактическое количество строк, которые вы читаете.