📄 fftsg3dt.f
字号:
! 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!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -