Line data Source code
1 : MODULE m_selecFFT 2 : 3 : USE m_juDFT 4 : 5 : IMPLICIT NONE 6 : 7 : INTEGER, PARAMETER :: defaultFFT_const = 0 8 : INTEGER, PARAMETER :: mklFFT_const = 1 9 : INTEGER, PARAMETER :: spFFT_const = 2 10 : INTEGER, PARAMETER :: fftw_const = 3 11 : integer, parameter :: cufft_const = 4 12 : 13 : #ifdef CPP_FFT_MKL 14 : LOGICAL, PARAMETER :: mklFFT_available = .TRUE. 15 : #else 16 : LOGICAL, PARAMETER :: mklFFT_available = .FALSE. 17 : #endif 18 : 19 : #ifdef CPP_FFTW 20 : LOGICAL, PARAMETER :: fftw_available = .TRUE. 21 : #else 22 : LOGICAL, PARAMETER :: fftw_available = .FALSE. 23 : #endif 24 : 25 : #ifdef CPP_SPFFT 26 : LOGICAL, PARAMETER :: spFFT_available = .TRUE. 27 : #else 28 : LOGICAL, PARAMETER :: spFFT_available = .FALSE. 29 : #endif 30 : 31 : #ifdef _OPENACC 32 : LOGICAL, PARAMETER :: cuFFT_available = .TRUE. 33 : #else 34 : LOGICAL, PARAMETER :: cuFFT_available = .FALSE. 35 : #endif 36 : 37 : 38 : CONTAINS 39 : 40 185423 : FUNCTION selecFFT(l_sparse, l_gpu) 41 : 42 : INTEGER :: selecFFT 43 : LOGICAL, INTENT(IN) :: l_sparse 44 : logical,optional, intent(in) :: l_gpu 45 : 46 : INTEGER :: fftRoutine 47 : 48 : fftRoutine = defaultFFT_const 49 : #ifdef CPP_FFTW 50 185423 : fftRoutine = fftw_const 51 : #endif 52 : 53 : #ifdef CPP_FFT_MKL 54 : fftRoutine = mklFFT_const 55 : #endif 56 : 57 : #ifdef CPP_SPFFT 58 : IF(l_sparse) fftRoutine = spFFT_const 59 : #endif 60 : 61 : #ifdef _OPENACC 62 : if(present(l_gpu)) then 63 : if(l_gpu) fftRoutine = cufft_const 64 : endif 65 : #endif 66 : 67 : IF (TRIM(juDFT_string_for_argument("-fft"))=="fftw") THEN 68 : #ifdef CPP_FFTW 69 185423 : fftRoutine = fftw_const 70 : #else 71 : CALL juDFT_error("Selected fftw is not available!", calledby="selecFFT") 72 : #endif 73 : 74 : END IF 75 185423 : IF (TRIM(juDFT_string_for_argument("-fft"))=="mkl") THEN 76 : #ifdef CPP_FFT_MKL 77 : fftRoutine = mklFFT_const 78 : #else 79 185423 : CALL juDFT_error("Selected FFT (mkl) is not available!", calledby="selecFFT") 80 : #endif 81 : END IF 82 : 83 185423 : IF (TRIM(juDFT_string_for_argument("-fft"))=="spfft") THEN 84 : #ifdef CPP_SPFFT 85 : IF(l_sparse) fftRoutine = spFFT_const 86 : #else 87 185423 : CALL juDFT_error("Selected FFT (spfft) is not available!", calledby="selecFFT") 88 : #endif 89 : END IF 90 : 91 185423 : IF (TRIM(juDFT_string_for_argument("-fft"))=="cufft") THEN 92 : #ifdef _OPENACC 93 : if(present(l_gpu)) then 94 : IF(l_gpu) fftRoutine = cuFFT_const 95 : endif 96 : #else 97 185423 : CALL juDFT_error("Selected FFT (spfft) is not available!", calledby="selecFFT") 98 : #endif 99 : END IF 100 : 101 185423 : IF (TRIM(juDFT_string_for_argument("-fft"))=="inbuilt") THEN 102 185423 : IF(l_sparse) fftRoutine = defaultFFT_const 103 : END IF 104 : 105 185423 : selecFFT = fftRoutine 106 : 107 185423 : END FUNCTION 108 : 109 : END MODULE m_selecFFT