camfort-0.62: samples/book/five/code51.f90
!!!!!!!!!!!!!!!!!!!!!!!!!!! Program 5.1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! !
! Please Note: !
! !
! (1) This computer program is written by Tao Pang in conjunction with !
! his book, "An Introduction to Computational Physics," published !
! by Cambridge University Press in 1997. !
! !
! (2) No warranties, express or implied, are made for this program. !
! !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
PROGRAM DFT_EXAMPLE
!
! Example of the discrete Fourier transform with function f(x) =
! x(1-x) in [0,1]. The inverse transform is also performed for
! comparison. Copyright (c) Tao Pang 1997.
!
IMPLICIT NONE
INTEGER, PARAMETER :: N=128,M=8
INTEGER :: I
REAL :: F0,H,X
REAL, DIMENSION (N) :: FR,FI,GR,GI
!
F0 = 1.0/SQRT(FLOAT(N))
H = 1.0/(N-1)
!
DO I = 1, N
X = H*(I-1)
FR(I) = X*(1.0-X)
FI(I) = 0.0
END DO
!
CALL DFT (FR,FI,GR,GI,N)
DO I = 1, N
GR(I) = F0*GR(I)
GI(I) = F0*GI(I)
END DO
!
! Perform inverse Fourier transform
!
DO I = 1, N
GI(I) = -GI(I)
END DO
CALL DFT (GR,GI,FR,FI,N)
DO I = 1, N
FR(I) = F0*FR(I)
FI(I) = -F0*FI(I)
END DO
WRITE (6,"(2F16.8)") (H*(I-1),FR(I),I=1,N,M)
WRITE (6,"(2F16.8)") H*(N-1),FR(N)
END PROGRAM DFT_EXAMPLE
!
SUBROUTINE DFT (FR,FI,GR,GI,N)
!
! Subroutine to perform the discrete Fourier transform with
! FR and FI as the real and imaginary parts of the input and
! GR and GI as the corresponding output.
!
IMPLICIT NONE
INTEGER, INTENT (IN) :: N
INTEGER :: I,J
REAL :: PI,X,Q
REAL, INTENT (IN), DIMENSION (N) :: FR,FI
REAL, INTENT (OUT), DIMENSION (N) :: GR,GI
!
PI = 4.0*ATAN(1.0)
X = 2*PI/N
!
DO I = 1, N
GR(I) = 0.0
GI(I) = 0.0
DO J = 1, N
Q = X*(J-1)*(I-1)
GR(I) = GR(I)+FR(J)*COS(Q)+FI(J)*SIN(Q)
GI(I) = GI(I)+FI(J)*COS(Q)-FR(J)*SIN(Q)
END DO
END DO
END SUBROUTINE DFT