      Program Zeitmessung

      include 'include/trnet.inc'
      
C ... Vereinbarungen 
      PARAMETER (LNG = 500 000, MAXP = 16)
      REAL H(6,MAXP)	! Hilfsfeld fuer Zeitmessung
      DOUBLE PRECISION A(LNG), W(LNG)
      EXTERNAL VDplus 	! Unterprogrammname 
      
      INTEGER n, i

C ... Initialisierung des Hypercubes
      call trinit(-1)
      
C      write(*,100) ICH, NPROC
C 100   format('*** Hallo Fortran-Cube von Prozessor',I4,' aus',I4)

      if (ICH .EQ. 0) then
	write(*,110) LNG
110	Format(' Zeitmessung fuer Vektoraddition ueber alle Prozessoren.'
     +        /' Bitte Vektorlaenge vorgeben (max.',I8,'): ',$)
        read (*,*)  n
C       falsche Eingaben "sinnvoll" korrigieren: 
	n = MAX(100,MIN(n,LNG))
        write(*,120) 
120     Format( 'Zeitmessung beginnt nach Tree_Down ...' )
      endif 	

      call tree_down_0(1,n)
C ... Starte Zeitmessung (auf allen Prozessoren)
      call init_time		! alle Prozessoren	
C ... Beginn der zu messenden Aktionen	
      DO i=1,n
        A(i)=ICH*LNG+i		! Vektorelemente "berechnen"
      ENDDO
C     Summe ueber alle Prozessoren (viel Kommunikation, wenig Rechnung)        
      call cube_dod(n,A,A,W,VDplus)
C ... Ende der zu messenden Aktionen	
      call get_times(H)		! Zeitangaben einsammeln

      if (ICH .EQ. 0 ) then     ! nur auf Prozessor 0
C ...   kurze Ergebnisausgabe (außerhalb der Zeitmessung!)
        write(*,200) n,(A(i),i=1,5)
200	Format(' Kontrollanzeige der Vektorsumme (n=',I8,
     +         ', erste 5 Komponenten):' / 5F15.1)

C ...   vorher gemessene Zeiten auf Prozessor 0 ausgeben als Tabelle
	call write_times(H)
      endif

C ... Zeiten als Diagramm anzeigen (nochmal auf allen Proz. aufrufen)
      call time_graf(H)
      
      if (ICH .EQ. 0) then
	write(*,210) 
210	Format('Bitte [Enter] druecken, um Programm zu beenden.',$) 
        read(*,*)
      endif 	
      
      call tree_down_0(1,n)
      call trclose

      end

