blob: bbada0d63a813d04c7dbd632c084ce8175766625 [file] [log] [blame]
! test of fftsg3d.f
!
program main
integer nmax, nmaxsqrt
parameter (nmax = 128)
parameter (nmaxsqrt = 16)
integer ip(0 : nmaxsqrt + 1), n1, n2, n3, i, j
real*8 a(0 : nmax - 1, 0 : nmax - 1, 0 : nmax - 1),
& t(0 : 8 * nmax - 1),
& w(0 : nmax * 3 / 2 - 1), err, errorcheck3d
!
write (*, *) 'data length n1=? (n1 = power of 2) '
read (*, *) n1
write (*, *) 'data length n2=? (n2 = power of 2) '
read (*, *) n2
write (*, *) 'data length n3=? (n3 = power of 2) '
read (*, *) n3
ip(0) = 0
!
! check of CDFT
call putdata3d(nmax, nmax, n1, n2, n3, a)
call cdft3d(nmax, nmax, n1, n2, n3, 1, a, t, ip, w)
call cdft3d(nmax, nmax, n1, n2, n3, -1, a, t, ip, w)
err = errorcheck3d(nmax, nmax, n1, n2, n3,
& 2.0d0 / n1 / n2 / n3, a)
write (*, *) 'cdft3d err= ', err
!
! check of RDFT
call putdata3d(nmax, nmax, n1, n2, n3, a)
call rdft3d(nmax, nmax, n1, n2, n3, 1, a, t, ip, w)
call rdft3d(nmax, nmax, n1, n2, n3, -1, a, t, ip, w)
err = errorcheck3d(nmax, nmax, n1, n2, n3,
& 2.0d0 / n1 / n2 / n3, a)
write (*, *) 'rdft3d err= ', err
!
! check of DDCT
call putdata3d(nmax, nmax, n1, n2, n3, a)
call ddct3d(nmax, nmax, n1, n2, n3, 1, a, t, ip, w)
call ddct3d(nmax, nmax, n1, n2, n3, -1, a, t, ip, w)
do j = 0, n2 - 1
do i = 0, n1 - 1
a(i, j, 0) = a(i, j, 0) * 0.5d0
end do
end do
do j = 0, n3 - 1
do i = 0, n1 - 1
a(i, 0, j) = a(i, 0, j) * 0.5d0
end do
do i = 0, n2 - 1
a(0, i, j) = a(0, i, j) * 0.5d0
end do
end do
err = errorcheck3d(nmax, nmax, n1, n2, n3,
& 8.0d0 / n1 / n2 / n3, a)
write (*, *) 'ddct3d err= ', err
!
! check of DDST
call putdata3d(nmax, nmax, n1, n2, n3, a)
call ddst3d(nmax, nmax, n1, n2, n3, 1, a, t, ip, w)
call ddst3d(nmax, nmax, n1, n2, n3, -1, a, t, ip, w)
do j = 0, n2 - 1
do i = 0, n1 - 1
a(i, j, 0) = a(i, j, 0) * 0.5d0
end do
end do
do j = 0, n3 - 1
do i = 0, n1 - 1
a(i, 0, j) = a(i, 0, j) * 0.5d0
end do
do i = 0, n2 - 1
a(0, i, j) = a(0, i, j) * 0.5d0
end do
end do
err = errorcheck3d(nmax, nmax, n1, n2, n3,
& 8.0d0 / n1 / n2 / n3, a)
write (*, *) 'ddst3d err= ', err
!
end
!
!
subroutine putdata3d(n1max, n2max, n1, n2, n3, a)
integer n1max, n2max, n1, n2, n3, j1, j2, j3, seed
real*8 a(0 : n1max - 1, 0 : n2max - 1, 0 : *), drnd
seed = 0
do j3 = 0, n3 - 1
do j2 = 0, n2 - 1
do j1 = 0, n1 - 1
a(j1, j2, j3) = drnd(seed)
end do
end do
end do
end
!
!
function errorcheck3d(n1max, n2max, n1, n2, n3, scale, a)
integer n1max, n2max, n1, n2, n3, j1, j2, j3, seed
real*8 scale, a(0 : n1max - 1, 0 : n2max - 1, 0 : *),
& drnd, err, e, errorcheck3d
err = 0
seed = 0
do j3 = 0, n3 - 1
do j2 = 0, n2 - 1
do j1 = 0, n1 - 1
e = drnd(seed) - a(j1, j2, j3) * scale
err = max(err, abs(e))
end do
end do
end do
errorcheck3d = err
end
!
!
! random number generator, 0 <= drnd < 1
real*8 function drnd(seed)
integer seed
seed = mod(seed * 7141 + 54773, 259200)
drnd = seed * (1.0d0 / 259200)
end
!