LCOV - code coverage report
Current view: top level - src/52_fft_mpi_noabirule - fftur.finc Coverage Total Hit
Test: coverage.info Lines: 72.2 % 18 13
Test Date: 2026-09-19 17:42:43 Functions: - 0 0

            Line data    Source code
       1              : block
       2              : !Local variables-------------------------------
       3              : !scalars
       4              :  integer,parameter :: ndat1 = 1, option3 = 3, cplex0 = 0, npwin0 = 0
       5              :  integer :: ldxyz,gsp_pt,box_pt,nthreads,dat,ug_ptr,ur_ptr
       6              :  real(dp),parameter :: weight_i=one,weight_r=one
       7              :  logical :: use_fftrisc
       8              : !arrays
       9              :  integer :: ngfft(18),kg_kin0(3,0)
      10              :  real(dp) :: denpot(0,0,0)
      11              : ! *************************************************************************
      12              : 
      13       780004 :  ldxyz = ldx*ldy*ldz
      14              : 
      15              :  ! TODO ndat > 1 with threads and istwf_k == 2.
      16              :  !use_fftrisc = (mod(fftalg,10)==2 .and. istwf_k==1 .and. ndat==1)
      17       780004 :  use_fftrisc = (mod(fftalg, 10) == 2 .and. istwf_k == 1)
      18              : 
      19              :  if (use_fftrisc) then
      20              :    !call wrtout(std_out, "fft_ug: using_fftrisc")
      21              : 
      22              :    ! Initialize ngfft
      23      7019748 :    ngfft(1:8) = [nx, ny, nz, ldx, ldy, ldz, fftalg, fftcache]
      24              : 
      25      2339916 :    call C_F_pointer(c_loc(ug), real_ug, shape=[2, npw_k*ndat])
      26      2339916 :    call C_F_pointer(c_loc(ur), real_ur, shape=[2, ldx*ldy*ldz*ndat])
      27              : 
      28       779972 :    if (fftcore_mixprec == 0) then
      29              :      !$OMP PARALLEL DO PRIVATE(ug_ptr, ur_ptr) IF (ndat > 1)
      30      1559950 :      do dat=1,ndat
      31       779978 :        ug_ptr = 1 + (dat-1)*npw_k
      32       779978 :        ur_ptr = 1 + (dat-1)*ldx*ldy*ldz
      33              :        call FFT_PREF_fftrisc (cplex0,denpot,dum_ugin,real_ug(:,ug_ptr:),real_ur(:,ur_ptr:),&
      34      1559950 :          gbound,gbound,istwf_k,kg_kin0,kg_k,mgfft,ngfft,npwin0,npw_k,ldx,ldy,ldz,option3,weight_r,weight_i)
      35              :      end do
      36              :    else
      37              :      ! Mixed precision FFT but only if we have double precision API
      38              :      !$OMP PARALLEL DO PRIVATE(ug_ptr, ur_ptr) IF (ndat > 1)
      39            0 :      do dat=1,ndat
      40            0 :        ug_ptr = 1 + (dat-1)*npw_k
      41            0 :        ur_ptr = 1 + (dat-1)*ldx*ldy*ldz
      42              : #if FFT_PRECISION == FFT_DOUBLE
      43              :        call FFT_PREF_fftrisc_mixprec (cplex0,denpot,dum_ugin,real_ug(:,ug_ptr:),real_ur(:,ur_ptr:),&
      44            0 :          gbound,gbound,istwf_k,kg_kin0,kg_k,mgfft,ngfft,npwin0,npw_k,ldx,ldy,ldz,option3,weight_r,weight_i)
      45              : #elif FFT_PRECISION == FFT_SINGLE
      46              :        call FFT_PREF_fftrisc (cplex0,denpot,dum_ugin,real_ug(:,ug_ptr:),real_ur(:,ur_ptr:),&
      47            0 :          gbound,gbound,istwf_k,kg_kin0,kg_k,mgfft,ngfft,npwin0,npw_k,ldx,ldy,ldz,option3,weight_r,weight_i)
      48              : #else
      49              : #error "Wrong FFT precision"
      50              : #endif
      51              : 
      52              :      end do
      53              :    end if
      54              : 
      55              :  else
      56              : 
      57           32 :    nthreads = xomp_get_num_threads(open_parallel=.TRUE.)
      58              : 
      59              :    if (.not. SPAWN_THREADS_HERE(ndat,nthreads)) then
      60              :      ! Inplace ur --> ug
      61           32 :      call FFT_PREF_fftpad (ur,nx,ny,nz,ldx,ldy,ldz,ndat,mgfft,-1,gbound)
      62              : 
      63              :      ! Copy data in ug
      64           32 :      call TK_PREF_box2gsph (nx,ny,nz,ldx,ldy,ldz,ndat,npw_k,kg_k,ur,ug)
      65              : 
      66              :    else ! Spawn OMP threads here.
      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              : 
      73              :        call FFT_PREF_fftpad (ur(box_pt:),nx,ny,nz,ldx,ldy,ldz,ndat1,mgfft,-1,gbound)
      74              : 
      75              :        call TK_PREF_box2gsph (nx,ny,nz,ldx,ldy,ldz,ndat1,npw_k,kg_k,ur(box_pt:),ug(gsp_pt:))
      76              :      end do
      77              :    end if
      78              :  end if
      79              : 
      80              : end block
        

Generated by: LCOV version 2.3-1