LCOV - code coverage report
Current view: top level - src/52_fft_mpi_noabirule - fftug.finc Coverage Total Hit
Test: coverage.info Lines: 70.6 % 17 12
Test Date: 2026-09-20 18:56:22 Functions: - 0 0

            Line data    Source code
       1              : block
       2              : !Local variables-------------------------------
       3              : !scalars
       4              :  integer,parameter :: ndat1 = 1, option0 = 0, cplex0 = 0, npwout0 = 0
       5              :  integer :: ldxyz,gsp_pt,box_pt,nthreads,dat,ug_ptr,ur_ptr
       6              :  real(dp),parameter :: weight1_i=one, weight1_r=one
       7              :  logical :: use_fftrisc
       8              : !arrays
       9              :  integer :: ngfft(18)
      10              :  real(dp) :: denpot(0,0,0)
      11              : ! *************************************************************************
      12              : 
      13              :  ! FFT: ug -> ur
      14       215006 :  use_fftrisc = mod(fftalg, 10) == 2 .and. any(istwf_k== [1, 2])
      15              : 
      16              :  if (use_fftrisc) then
      17              :    !call wrtout(std_out, "fft_ug: using_fftrisc")
      18              :    !
      19              :    ! Initialize ngfft
      20      1916784 :    ngfft(1:8) = [nx, ny, nz, ldx, ldy, ldz, fftalg, fftcache]
      21              : 
      22       638928 :    call C_F_pointer(c_loc(ug), real_ug, shape=[2, npw_k*ndat])
      23       638928 :    call C_F_pointer(c_loc(ur), real_ur, shape=[2, ldx*ldy*ldz*ndat])
      24              : 
      25       212976 :    if (fftcore_mixprec == 0) then
      26              :      !$OMP PARALLEL DO PRIVATE(ug_ptr, ur_ptr) IF (ndat > 1)
      27       426754 :      do dat=1,ndat
      28       213778 :        ug_ptr = 1 + (dat-1)*npw_k
      29       213778 :        ur_ptr = 1 + (dat-1)*ldx*ldy*ldz
      30              :        call FFT_PREF_fftrisc (cplex0,denpot,real_ug(:,ug_ptr:),fofgout,real_ur(:,ur_ptr:), &
      31              :          gbound,gbound,istwf_k,kg_k,kg_k,mgfft,ngfft,npw_k,npwout0,ldx,ldy,ldz,option0,weight1_r,weight1_i, &
      32       426754 :          abi_convention=(isign__==+1), iscale=iscale__)
      33              :      end do
      34              : 
      35              :    else
      36              :      ! Mixed precision FFT but only if we have the double precision API.
      37              :      !$OMP PARALLEL DO PRIVATE(ug_ptr, ur_ptr) IF (ndat > 1)
      38            0 :      do dat=1,ndat
      39            0 :        ug_ptr = 1 + (dat-1)*npw_k
      40            0 :        ur_ptr = 1 + (dat-1)*ldx*ldy*ldz
      41              : #if FFT_PRECISION == FFT_DOUBLE
      42              :        call FFT_PREF_fftrisc_mixprec (cplex0,denpot,real_ug(:,ug_ptr:),fofgout,real_ur(:,ur_ptr:),&
      43              :          gbound,gbound,istwf_k,kg_k,kg_k,mgfft,ngfft,npw_k,npwout0,ldx,ldy,ldz,option0,weight1_r,weight1_i, &
      44            0 :          abi_convention=(isign__==+1), iscale=iscale__)
      45              : #elif FFT_PRECISION == FFT_SINGLE
      46              :        call FFT_PREF_fftrisc (cplex0,denpot,real_ug(:,ug_ptr:),fofgout,real_ur(:,ur_ptr:),&
      47              :          gbound,gbound,istwf_k,kg_k,kg_k,mgfft,ngfft,npw_k,npwout0,ldx,ldy,ldz,option0,weight1_r,weight1_i, &
      48            0 :          abi_convention=(isign__==+1), iscale=iscale__)
      49              : #else
      50              : #error "Wrong FFT precision"
      51              : #endif
      52              :      end do
      53              :    end if
      54              : 
      55              :  else
      56         2030 :    nthreads = xomp_get_num_threads(open_parallel=.TRUE.)
      57              : 
      58              :    if (.not. SPAWN_THREADS_HERE(ndat, nthreads)) then
      59              :      ! Insert ug in ur defined on the (augmented) FFT mesh
      60         2030 :      call TK_PREF_gsph2box (nx, ny, nz, ldx, ldy, ldz, ndat, npw_k, istwf_k, kg_k, ug, ur)
      61              :      ! zero-padded FFT.
      62         2030 :      call FFT_PREF_fftpad (ur, nx, ny, nz, ldx, ldy, ldz, ndat, mgfft, isign__, gbound, iscale=iscale__)
      63              : 
      64              :    else
      65              :      ! Spawn OMP threads here.
      66              :      ldxyz = ldx*ldy*ldz
      67              : 
      68              : !$OMP PARALLEL DO PRIVATE(gsp_pt, box_pt)
      69              :      do dat=1,ndat
      70              :        gsp_pt = 1 + dist * npw_k * (dat-1)
      71              :        box_pt = 1 + dist * ldxyz * (dat-1)
      72              :        ! Insert ug in ur defined on the (augmented) FFT mesh
      73              :        call TK_PREF_gsph2box (nx, ny, nz, ldx, ldy, ldz, ndat1, npw_k, istwf_k, kg_k, ug(gsp_pt:), ur(box_pt:))
      74              :        ! zero-padded FFT.
      75              :        call FFT_PREF_fftpad (ur(box_pt:), nx, ny, nz, ldx, ldy, ldz, ndat1, mgfft, isign__, gbound, iscale=iscale__)
      76              :      end do
      77              :    end if
      78              :  end if
      79              : end block
        

Generated by: LCOV version 2.3-1