⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fftsg3d.f

📁 2维fft程序
💻 F
📖 第 1 页 / 共 3 页
字号:
!                     do j1 = 0, n1 - 1!                         a(j1,j2,j3) = a(j1,j2,j3) * (8.0d0/n1/n2/n3)!                     end do!                 end do!             end do!         .!!! -------- DST (Discrete Sine Transform) / Inverse of DST --------!     [definition]!         <case1> IDST (excluding scale)!             S(k1,k2,k3) = sum_j1=1^n1 sum_j2=1^n2 sum_j3=1^n3!                               A(j1,j2,j3) * !                               sin(pi*j1*(k1+1/2)/n1) * !                               sin(pi*j2*(k2+1/2)/n2) * !                               sin(pi*j3*(k3+1/2)/n3), !                               0<=k1<n1, 0<=k2<n2, 0<=k3<n3!         <case2> DST!             S(k1,k2,k3) = sum_j1=0^n1-1 sum_j2=0^n2-1 sum_j3=0^n3-1!                               a(j1,j2,j3) * !                               sin(pi*(j1+1/2)*k1/n1) * !                               sin(pi*(j2+1/2)*k2/n2) * !                               sin(pi*(j3+1/2)*k3/n3), !                               0<k1<=n1, 0<k2<=n2, 0<k3<=n3!     [usage]!         <case1>!             ip(0) = 0  ! first time only!             call ddst3d(n1max, n2max, n1, n2, n3, 1, a, t, ip, w)!         <case2>!             ip(0) = 0  ! first time only!             call ddst3d(n1max, n2max, n1, n2, n3, -1, a, t, ip, w)!     [parameters]!         n1max  :row1 size of the 3D array (integer)!         n2max  :row2 size of the 3D array (integer)!         n1     :data length (integer)!                 n1 >= 2, n1 = power of 2!         n2     :data length (integer)!                 n2 >= 2, n2 = power of 2!         n3     :data length (integer)!                 n3 >= 2, n3 = power of 2!         a(0:n1-1,0:n2-1,0:n3-1)!                :input/output data (real*8)!                 <case1>!                     input data!                         a(mod(j1,n1),mod(j2,n2),mod(j3,n3)) = A(j1,j2,j3), !                             0<j1<=n1, 0<j2<=n2, 0<j3<=n3!                     output data!                         a(k1,k2,k3) = S(k1,k2,k3), !                             0<=k1<n1, 0<=k2<n2, 0<=k3<n3!                 <case2>!                     output data!                         a(mod(k1,n1),mod(k2,n2),mod(k3,n3)) = S(k1,k2,k3), !                             0<k1<=n1, 0<k2<=n2, 0<k3<=n3!         t(0:*) :work area (real*8)!                 length of t >= max(4*n2, 4*n3)!         ip(0:*):work area for bit reversal (integer)!                 length of ip >= 2+sqrt(n)!                 (n = max(n1/2, n2/2, n3/2))!                 ip(0),ip(1) are pointers of the cos/sin table.!         w(0:*) :cos/sin table (real*8)!                 length of w >= max(n1*3/2, n2*3/2, n3*3/2)!                 w(),ip() are initialized if ip(0) = 0.!     [remark]!         Inverse of !             call ddst3d(n1max, n2max, n1, n2, n3, -1, a, t, ip, w)!         is !             do j3 = 0, n3 - 1!                 do j2 = 0, n2 - 1!                     a(0, j2, j3) = a(0, j2, j3) * 0.5d0!                 end do!                 do j1 = 0, n1 - 1!                     a(j1, 0, j3) = a(j1, 0, j3) * 0.5d0!                 end do!             end do!             do j2 = 0, n2 - 1!                 do j1 = 0, n1 - 1!                     a(j1, j2, 0) = a(j1, j2, 0) * 0.5d0!                 end do!             end do!             call ddst3d(n1max, n2max, n1, n2, n3, 1, a, t, ip, w)!             do j3 = 0, n3 - 1!                 do j2 = 0, n2 - 1!                     do j1 = 0, n1 - 1!                         a(j1,j2,j3) = a(j1,j2,j3) * (8.0d0/n1/n2/n3)!                     end do!                 end do!             end do!         .!!      subroutine cdft3d(n1max, n2max, n1, n2, n3, isgn, a,      &    t, ip, w)      integer n1max, n2max, n1, n2, n3, isgn, ip(0 : *), n      real*8 a(0 : n1max - 1, 0 : n2max - 1, 0 : n3 - 1),      &    t(0 : *), w(0 : *)      n = 2 * max(n2, n3)      n = max(n, n1)      if (n .gt. 4 * ip(0)) then          call makewt(n / 4, ip, w)      end if      call xdft3da_sub(n1max, n2max, n1, n2, n3, 0,      &    isgn, a, t, ip, w)      call cdft3db_sub(n1max, n2max, n1, n2, n3,      &    isgn, a, t, ip, w)      end!      subroutine rdft3d(n1max, n2max, n1, n2, n3, isgn, a,      &    t, ip, w)      integer n1max, n2max, n1, n2, n3, isgn, ip(0 : *),      &    n, nw, nc      real*8 a(0 : n1max - 1, 0 : n2max - 1, 0 : n3 - 1),      &    t(0 : *), w(0 : *)      n = 2 * max(n2, n3)      n = max(n, n1)      nw = ip(0)      if (n .gt. 4 * nw) then          nw = n / 4          call makewt(nw, ip, w)      end if      nc = ip(1)      if (n1 .gt. 4 * nc) then          nc = n1 / 4          call makect(nc, ip, w(nw))      end if      if (isgn .lt. 0) then          call rdft3d_sub(n1max, n2max, n1, n2, n3, isgn, a)          call cdft3db_sub(n1max, n2max, n1, n2, n3,      &        isgn, a, t, ip, w)          call xdft3da_sub(n1max, n2max, n1, n2, n3, 1,      &        isgn, a, t, ip, w)      else          call xdft3da_sub(n1max, n2max, n1, n2, n3, 1,      &        isgn, a, t, ip, w)          call cdft3db_sub(n1max, n2max, n1, n2, n3,      &        isgn, a, t, ip, w)          call rdft3d_sub(n1max, n2max, n1, n2, n3, isgn, a)      end if      end!      subroutine rdft3dsort(n1max, n2max, n1, n2, n3, isgn, a)      integer n1max, n2max, n1, n2, n3, isgn, n2h, n3h, j, k      real*8 a(0 : n1max - 1, 0 : n2max - 1, 0 : n3 - 1), x, y      n2h = n2 / 2      n3h = n3 / 2      if (isgn .lt. 0) then          do k = 0, n3 - 1              do j = n2h + 1, n2 - 1                  a(0, j, k) = a(n1 + 1, j, k)                  a(1, j, k) = a(n1, j, k)              end do          end do          do k = n3h + 1, n3 - 1              a(0, 0, k) = a(n1 + 1, 0, k)              a(1, 0, k) = a(n1, 0, k)              a(0, n2h, k) = a(n1 + 1, n2h, k)              a(1, n2h, k) = a(n1, n2h, k)          end do          a(1, 0, 0) = a(n1, 0, 0)          a(1, n2h, 0) = a(n1, n2h, 0)          a(1, 0, n3h) = a(n1, 0, n3h)          a(1, n2h, n3h) = a(n1, n2h, n3h)      else          do j = n2h + 1, n2 - 1              y = a(0, j, 0)              x = a(1, j, 0)              a(n1, j, 0) = x              a(n1 + 1, j, 0) = y              a(n1, n2 - j, 0) = x              a(n1 + 1, n2 - j, 0) = -y              a(0, j, 0) = a(0, n2 - j, 0)              a(1, j, 0) = -a(1, n2 - j, 0)          end do          do k = 1, n3 - 1              do j = n2h + 1, n2 - 1                  y = a(0, j, k)                  x = a(1, j, k)                  a(n1, j, k) = x                  a(n1 + 1, j, k) = y                  a(n1, n2 - j, n3 - k) = x                  a(n1 + 1, n2 - j, n3 - k) = -y                  a(0, j, k) = a(0, n2 - j, n3 - k)                  a(1, j, k) = -a(1, n2 - j, n3 - k)              end do          end do          do k = n3h + 1, n3 - 1              y = a(0, 0, k)              x = a(1, 0, k)              a(n1, 0, k) = x              a(n1 + 1, 0, k) = y              a(n1, 0, n3 - k) = x              a(n1 + 1, 0, n3 - k) = -y              a(0, 0, k) = a(0, 0, n3 - k)              a(1, 0, k) = -a(1, 0, n3 - k)              y = a(0, n2h, k)              x = a(1, n2h, k)              a(n1, n2h, k) = x              a(n1 + 1, n2h, k) = y              a(n1, n2h, n3 - k) = x              a(n1 + 1, n2h, n3 - k) = -y              a(0, n2h, k) = a(0, n2h, n3 - k)              a(1, n2h, k) = -a(1, n2h, n3 - k)          end do          a(n1, 0, 0) = a(1, 0, 0)          a(n1 + 1, 0, 0) = 0          a(1, 0, 0) = 0          a(n1, n2h, 0) = a(1, n2h, 0)          a(n1 + 1, n2h, 0) = 0          a(1, n2h, 0) = 0          a(n1, 0, n3h) = a(1, 0, n3h)          a(n1 + 1, 0, n3h) = 0          a(1, 0, n3h) = 0          a(n1, n2h, n3h) = a(1, n2h, n3h)          a(n1 + 1, n2h, n3h) = 0          a(1, n2h, n3h) = 0      end if      end!      subroutine ddct3d(n1max, n2max, n1, n2, n3, isgn, a,      &    t, ip, w)      integer n1max, n2max, n1, n2, n3, isgn, ip(0 : *),      &    n, nw, nc      real*8 a(0 : n1max - 1, 0 : n2max - 1, 0 : n3 - 1),      &    t(0 : *), w(0 : *)      n = max(n2, n3)      n = max(n, n1)      nw = ip(0)      if (n .gt. 4 * nw) then          nw = n / 4          call makewt(nw, ip, w)      end if      nc = ip(1)      if (n .gt. nc) then          nc = n          call makect(nc, ip, w(nw))      end if      call ddxt3da_sub(n1max, n2max, n1, n2, n3, 0,      &    isgn, a, t, ip, w)      call ddxt3db_sub(n1max, n2max, n1, n2, n3, 0,      &    isgn, a, t, ip, w)      end!      subroutine ddst3d(n1max, n2max, n1, n2, n3, isgn, a,      &    t, ip, w)      integer n1max, n2max, n1, n2, n3, isgn, ip(0 : *),      &    n, nw, nc      real*8 a(0 : n1max - 1, 0 : n2max - 1, 0 : n3 - 1),      &    t(0 : *), w(0 : *)      n = max(n2, n3)      n = max(n, n1)      nw = ip(0)      if (n .gt. 4 * nw) then          nw = n / 4          call makewt(nw, ip, w)      end if      nc = ip(1)      if (n .gt. nc) then          nc = n          call makect(nc, ip, w(nw))      end if      call ddxt3da_sub(n1max, n2max, n1, n2, n3, 1,      &    isgn, a, t, ip, w)      call ddxt3db_sub(n1max, n2max, n1, n2, n3, 1,      &    isgn, a, t, ip, w)      end!! -------- child routines --------!      subroutine xdft3da_sub(n1max, n2max, n1, n2, n3, icr,      &    isgn, a, t, ip, w)      integer n1max, n2max, n1, n2, n3, icr, isgn,      &    ip(0 : *), i, j, k      real*8 a(0 : n1max - 1, 0 : n2max - 1, 0 : n3 - 1),      &    t(0 : *), w(0 : *)      do k = 0, n3 - 1          if (icr .eq. 0) then              do j = 0, n2 - 1                  call cdft(n1, isgn, a(0, j, k), ip, w)              end do          else if (isgn .ge. 0) then              do j = 0, n2 - 1                  call rdft(n1, isgn, a(0, j, k), ip, w)              end do          end if          if (n1 .gt. 4) then              do i = 0, n1 - 8, 8                  do j = 0, n2 - 1                      t(2 * j) = a(i, j, k)                      t(2 * j + 1) = a(i + 1, j, k)                      t(2 * n2 + 2 * j) = a(i + 2, j, k)                      t(2 * n2 + 2 * j + 1) = a(i + 3, j, k)                      t(4 * n2 + 2 * j) = a(i + 4, j, k)                      t(4 * n2 + 2 * j + 1) = a(i + 5, j, k)                      t(6 * n2 + 2 * j) = a(i + 6, j, k)                      t(6 * n2 + 2 * j + 1) = a(i + 7, j, k)                  end do                  call cdft(2 * n2, isgn, t, ip, w)                  call cdft(2 * n2, isgn, t(2 * n2), ip, w)                  call cdft(2 * n2, isgn, t(4 * n2), ip, w)                  call cdft(2 * n2, isgn, t(6 * n2), ip, w)                  do j = 0, n2 - 1                      a(i, j, k) = t(2 * j)                      a(i + 1, j, k) = t(2 * j + 1)                      a(i + 2, j, k) = t(2 * n2 + 2 * j)                      a(i + 3, j, k) = t(2 * n2 + 2 * j + 1)                      a(i + 4, j, k) = t(4 * n2 + 2 * j)                      a(i + 5, j, k) = t(4 * n2 + 2 * j + 1)                      a(i + 6, j, k) = t(6 * n2 + 2 * j)                      a(i + 7, j, k) = t(6 * n2 + 2 * j + 1)                  end do

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -