LCOV - code coverage report
Current view: top level - src/53_ffts - fftbox_ip_driver.finc Coverage Total Hit
Test: coverage.info Lines: 91.4 % 35 32
Test Date: 2026-09-21 13:49:52 Functions: - 0 0

            Line data    Source code
       1              : block
       2              : 
       3              : !Local variables ------------------------------
       4              : !scalars
       5              :  integer :: ifft,ix,iy,iz,nx,ny,nz,ldx,ldy,ldz,dat,fftalga,padat
       6              :  real(dp) :: fact
       7              :  character(len=500) :: msg
       8              : !arrays
       9        12223 :  real(dp),allocatable :: arr(:,:,:,:),ftarr(:,:,:,:)
      10              : ! *************************************************************************
      11              : 
      12        12223 :   nx = plan%dims(1);   ny=plan%dims(2);   nz=plan%dims(3)
      13        12223 :  ldx = plan%embed(1); ldy=plan%embed(2); ldz=plan%embed(3)
      14        12223 :  fftalga = plan%fftalg/100
      15              : 
      16              :  ! Cpu version
      17            0 :  select case (fftalga)
      18              :  case (FFT_FFTW3)
      19            0 :    call fftw3_c2c_ip(nx, ny, nz, ldx, ldy, ldz, ndat__, iscale__, isign, ff)
      20              : 
      21              :  case (FFT_DFTI)
      22        12145 :    call dfti_c2c_ip(nx, ny, nz, ldx, ldy, ldz, ndat__, iscale__, isign, ff)
      23              : 
      24              :  case (FFT_SG, FFT_SG2002)
      25              :    ! Fallback to sg_fft_cc
      26              :    ! 1) we have to change shape and type complex -> double because we have an explicit interface.
      27              :    ! 2) transform is out-of-place here
      28              :    ! 3) Cannot use [ZC]copy: this is a template used both for single and double precision.
      29              : 
      30              :    ! MG: Well, now one can use, intrinsic :: iso_c_binding for dp version but there's no point in optimizing
      31              :    !     this part as fftw3/dfti are much faster.
      32              : 
      33          390 :    ABI_MALLOC(arr,   (2, ldx, ldy, ldz))
      34          312 :    ABI_MALLOC(ftarr, (2, ldx, ldy, ldz))
      35              : 
      36          228 :    do dat=1,ndat__
      37          150 :      padat = (dat-1) * plan%ldxyz
      38              : 
      39              :      ! Copy input data in arr
      40         4650 :      do iz=1,nz
      41       280050 :        do iy=1,ny
      42     22538700 :          do ix=1,nx
      43     22258800 :            ifft = ix + (iy-1)*ldx + (iz-1)*ldx*ldy + padat
      44     22258800 :            arr(1,ix,iy,iz) = DBLE (ff(ifft))
      45     22534200 :            arr(2,ix,iy,iz) = AIMAG(ff(ifft))
      46              :          end do
      47              :        end do
      48              :      end do
      49              : 
      50              :      ! c2c with ndat = 1
      51          150 :      call sg_fft_cc(plan%fftcache, nx, ny, nz, ldx, ldy, ldz, 1, isign, arr, ftarr)
      52              :      !
      53              :      ! Copy results stored in ftarr
      54              :      !
      55          228 :      if (isign == -1) then
      56              :        ! Copy and scale the transform
      57           80 :        fact = one/plan%nfft
      58           80 :        if (iscale__ == 0) fact = one
      59         2780 :        do iz=1,nz
      60       180980 :          do iy=1,ny
      61     14955300 :            do ix=1,nx
      62     14774400 :              ifft = ix + (iy-1)*ldx + (iz-1)*ldx*ldy + padat
      63     14952600 :              ff(ifft) = fact * DCMPLX(ftarr(1,ix,iy,iz), ftarr(2,ix,iy,iz))
      64              :            end do
      65              :          end do
      66              :        end do
      67              :        !
      68              :      else
      69              :        ! Direct copy.
      70         1870 :        do iz=1,nz
      71        99070 :          do iy=1,ny
      72      7583400 :            do ix=1,nx
      73      7484400 :              ifft = ix + (iy-1)*ldx + (iz-1)*ldx*ldy + padat
      74      7581600 :              ff(ifft) = DCMPLX(ftarr(1,ix,iy,iz), ftarr(2,ix,iy,iz))
      75              :            end do
      76              :          end do
      77              :        end do
      78              :      end if
      79              : 
      80              :    end do
      81              : 
      82           78 :    ABI_FREE(arr)
      83           78 :    ABI_FREE(ftarr)
      84              : 
      85              :  case default
      86            0 :    write(msg,'(a,i0)')"Wrong fftalga: ",fftalga
      87        12223 :    ABI_ERROR(msg)
      88              :  end select
      89              : 
      90              : end block
        

Generated by: LCOV version 2.3-1