module subs
implicit none
CONTAINS
!--------------------------------------------------------------------------
! calculate mean and variance of a data set
!--------------------------------------------------------------------------
SUBROUTINE avevar(data,ave,var)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: data
REAL, INTENT(OUT) :: ave,var
INTEGER :: n
REAL, DIMENSION(size(data)) :: s
n=size(data)
ave=sum(data(:))/n
s(:)=data(:)-ave
var=dot_product(s,s)
var=(var-sum(s)**2/n)/(n-1)
END SUBROUTINE avevar
!BL
!--------------------------------------------------------------------------
! calculation of Sample AutoCorrelation Sequence
!--------------------------------------------------------------------------
subroutine autocorr(data,acs,nLag)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: data
integer,intent(in) :: nLag
real,dimension(0:nLag),intent(out) :: acs
real :: sum1, sum2, ave, var
integer :: i, lag, N
N=size(data)
!------------------------------------
call avevar(data(:),ave,var)
!------------------------------------
sum2=dot_product(data(:)-ave,data(:)-ave)
do lag=0,nLag
sum1 = 0.
do i=1,N-lag
sum1 = sum1 + (data(i+lag)-ave) * (data(i)-ave)
enddo
acs(lag)=sum1/sum2
enddo
end subroutine autocorr
end module subs
!--------------------------------------------------------------------------
! calculation of Sample AutoCorrelation Sequence
!--------------------------------------------------------------------------
program sampleAutoCorrelationSequence
use subs
implicit none
integer,parameter :: N = 128, nLag=32
character(len=255):: ifilename='fig3a.dat'
character(len=255):: ofilename='sampleAVS_fig7a.dat'
real,dimension(N) :: data1
real,dimension(0:nLag) :: sampleACS
integer :: i
!------------------------------------
open(7,file=ifilename)
read(7,*)(data1(i),i=1,N)
close(7)
!------------------------------------
call autocorr(data1(:),sampleACS(:),nLag)
open(7,file=ofilename)
write(7,'(i5,f15.6)')(i,sampleACS(i),i=0,nLag)
close(7)
end program sampleAutoCorrelationSequence