2016-08-09 81 views
0

ich habe ein kleines Problem mit diesem einfachen FortranprogrammAusgabedatei enthält zusätzliche Nullen

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 

Alles scheint gut zu funktionieren, bis ich auf Datei suchen U0.txt. Diese Datei enthält mein Ergebnis plus andere Zeilen von Nullen (Millionen) mit einer Größe von 6,4 GB. Aber ich verstehe nicht, wo der Fehler liegt, denn wenn ich weniger als 8000 Zeilen lese, verschwindet dieses Problem. Ich bin auf Linux mit Gfortran-Compiler.

+0

Verwenden Sie tag [tag: fortran]. Wählen Sie einen Titel, der Ihr Problem und nicht nur das Thema beschreibt. Das Thema wird durch die Tags beschrieben. –

+0

Da '16589 ** 2' nur nördlich von' 275 * 10 ** 6' liegt, wäre es nicht verwunderlich, wenn das Programm eine sehr große Datei schreibt, wenn die 'if' Anweisungen innerhalb der verschachtelten Schleife zu' .true' ausgewertet werden . Ich komme zu dem Schluss, dass dies ein Datenproblem und kein Programmierproblem ist. –

+0

Haben Sie Zugang zu einem modernen Fortran Compiler (2008+)? Wenn dies der Fall ist, verwenden Sie bitte den 'newunit'-Spezifizierer anstelle von hartkodierenden Datei-ID-Einheiten. – jlokimlin

Antwort

1

Es spielt keine Rolle, wie viele Zeilen Sie lesen; Ihre Schleifen gehen immer noch von 1 bis 16589. Vielleicht sollten Sie n in diesen Schleifen so ändern, dass sie die tatsächliche Anzahl der gelesenen Zeilen sind.