! Il programma calcola la somma 
! 1+1/2+1/3+1/4+...+1/n
! con l'algoritmo "sequenziale" e con l'algoritmo "parallelo"
! mediante le function SOMMAS e SOMMAP
PROGRAM SOMMATORIE
  IMPLICIT NONE
  INTEGER :: K, I
  REAL, DIMENSION(:), ALLOCATABLE :: A
  REAL :: SOMMAP, SOMMAS
  
  WRITE(*,*)"ASSEGNA K TALE K 2**K E' IL NUMERO DI ADDENDI"
  READ(*,*) K
  ALLOCATE(A(2**K))
  
  ! RIEMPIO IL VETTORE 
  DO I=1,2**K
     A(I)=1.0/I
  END DO
  
  WRITE(*,*) SOMMAS(K,A)
  WRITE(*,*) SOMMAP(K,A)
END PROGRAM SOMMATORIE

FUNCTION SOMMAP(K,A)
  IMPLICIT NONE
  ! CALCOLA LA SOMMA A(1)+A(2)+....+A(2**K) IN PARALLELO
  INTEGER               :: K
  REAL, DIMENSION(2**K) :: A
  REAL                  :: SOMMAP
  INTEGER               :: N, I, J
  REAL, DIMENSION(2**K) :: B
  
  B=A
  N=2**K
  DO I=1,K
     N=N/2
     DO J=1,N
        B(J)=B(2*J-1)+B(2*J)
     END DO
  END DO
  SOMMAP=B(1)
END FUNCTION SOMMAP

FUNCTION SOMMAS(K,A)
  IMPLICIT NONE
  ! CALCOLA LA SOMMA A(1)+A(2)+....+A(2**K) IN SEQUENZIALE
  INTEGER               :: K
  REAL, DIMENSION(2**K) :: A
  REAL                  :: SOMMAS, S
  INTEGER               :: I
  
  S=0.0
  DO I=1,2**K
     S=S+A(I)
  END DO
  SOMMAS=S
END FUNCTION SOMMAS




