File: CMakeLists.txt

package info (click to toggle)
espresso 6.7-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 311,068 kB
  • sloc: f90: 447,429; ansic: 52,566; sh: 40,631; xml: 37,561; tcl: 20,077; lisp: 5,923; makefile: 4,503; python: 4,379; perl: 1,219; cpp: 761; fortran: 618; java: 568; awk: 128
file content (188 lines) | stat: -rw-r--r-- 7,051 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
###########################################################
# FFT
# The following targets will be defined:
add_library(qe_fft INTERFACE)
add_library(QE::FFT ALIAS qe_fft)
qe_install_targets(qe_fft)
###########################################################
SET(BLA_VENDOR_SAVED ${BLA_VENDOR})
if(QE_FFTW_VENDOR STREQUAL "AUTO")
    # Try to find a FFTW library installed in the system
    find_package(VendorFFTW)
    if(VendorFFTW_FOUND)
        if(VendorFFTW_ID STREQUAL "Intel")
            qe_add_global_compile_definitions(__DFTI)
            set(qe_fft_wrappers fft_scalar.DFTI.f90)
        elseif(VendorFFTW_ID STREQUAL "Arm")
            ## ARMPL implements the same interface of the standard FFTW
            ## no need of QE ARMPL wrapper
            #qe_add_global_compile_definitions(__ARM_LIB)
            #set(qe_fft_wrappers fft_scalar.ARM_LIB.f90)
            qe_add_global_compile_definitions(__FFTW3)
            set(qe_fft_wrappers fft_scalar.FFTW3.f90)
        elseif(VendorFFTW_ID STREQUAL "IBMESSL")
            qe_add_global_compile_definitions(__LINUX_ESSL)
            set(qe_fft_wrappers fft_scalar.ESSL.f90)
        endif()
        target_link_libraries(qe_fft INTERFACE VendorFFTW)
    else()
        # Try to find the official FFTW3
        message(STATUS "No vendor FFTW found")
        if(QE_ENABLE_OPENMP)
            find_package(FFTW3 COMPONENTS DOUBLE_OPENMP DOUBLE)
        else()
            find_package(FFTW3 COMPONENTS DOUBLE)
        endif()
        if(FFTW3_FOUND)
            qe_add_global_compile_definitions(__FFTW3)
            set(qe_fft_wrappers fft_scalar.FFTW3.f90)
            target_link_libraries(qe_fft INTERFACE FFTW3)
        else()
            message(STATUS "CMake variable FFTW3_ROOT may be used to hint the root directory of FFTW3 installation.")
            # Cannot find anything useful, just point out internal FFTW fallback.
            message(FATAL_ERROR "Failed to find an external FFTW library. "
                                "Alternatively, '-DQE_FFTW_VENDOR=Internal' may be used to enable reference FFTW "
                                "at a performance loss compared to optimized libraries.")

        endif()
    endif()
elseif(QE_FFTW_VENDOR MATCHES "Intel")
    if(QE_FFTW_VENDOR STREQUAL "Intel_DFTI")
        qe_add_global_compile_definitions(__DFTI)
        set(qe_fft_wrappers fft_scalar.DFTI.f90)
    elseif(QE_FFTW_VENDOR STREQUAL "Intel_FFTW3")
        qe_add_global_compile_definitions(__FFTW3)
        set(qe_fft_wrappers fft_scalar.FFTW3.f90)
    else()
        message(FATAL_ERROR "The unknown Intel FFTW library '${QE_FFTW_VENDOR}' is not supported!")
    endif()
    if(QE_ENABLE_OPENMP)
        SET(BLA_VENDOR Intel10_64lp)
    else()
        SET(BLA_VENDOR Intel10_64lp_seq)
    endif()
    find_package(LAPACK QUIET)
    find_package(VendorFFTW REQUIRED COMPONENTS MKL)
    if(VendorFFTW_FOUND)
        target_link_libraries(qe_fft INTERFACE VendorFFTW)
        message(STATUS "Found ${QE_FFTW_VENDOR} library")
    else()
        message(FATAL_ERROR "Failed to find ${QE_FFTW_VENDOR} library. "
            "Alternatively, remove -DQE_FFTW_VENDOR to automatic search a FFTW library in the system.")
    endif()
elseif(QE_FFTW_VENDOR STREQUAL "ArmPL")
    if(QE_ENABLE_OPENMP)
        SET(BLA_VENDOR Arm_mp)
    else()
        SET(BLA_VENDOR Arm)
    endif()
    find_package(LAPACK QUIET)
    find_package(VendorFFTW REQUIRED COMPONENTS ArmPL)
    if(VendorFFTW_FOUND)
        qe_add_global_compile_definitions(__FFTW3)
        set(qe_fft_wrappers fft_scalar.FFTW3.f90)
        target_link_libraries(qe_fft INTERFACE VendorFFTW)
        message(STATUS "Found ${QE_FFTW_VENDOR} library")
    else()
        message(FATAL_ERROR "Failed to find ${QE_FFTW_VENDOR} library. "
            "Alternatively, remove -DQE_FFTW_VENDOR to automatic search a FFTW library installed in the system.")
    endif()
elseif(QE_FFTW_VENDOR STREQUAL "IBMESSL")
    SET(BLA_VENDOR IBMESSL)
    find_package(BLAS QUIET)
    find_package(VendorFFTW REQUIRED COMPONENTS IBMESSL)
    if(VendorFFTW_FOUND)
        qe_add_global_compile_definitions(__LINUX_ESSL)
        set(qe_fft_wrappers fft_scalar.ESSL.f90)
        target_link_libraries(qe_fft INTERFACE VendorFFTW)
        message(STATUS "Found ${QE_FFTW_VENDOR} library")
    else()
        message(FATAL_ERROR "Failed to find ${QE_FFTW_VENDOR} library. "
            "Alternatively, remove -DQE_FFTW_VENDOR to automatic search a FFTW library installed in the system.")
    endif()
elseif(QE_FFTW_VENDOR STREQUAL "FFTW3")
    if(QE_ENABLE_OPENMP)
        find_package(FFTW3 REQUIRED COMPONENTS DOUBLE_OPENMP DOUBLE)
    else()
        find_package(FFTW3 REQUIRED COMPONENTS DOUBLE)
    endif()
    if(FFTW3_FOUND)
        qe_add_global_compile_definitions(__FFTW3)
        set(qe_fft_wrappers fft_scalar.FFTW3.f90)
        target_link_libraries(qe_fft INTERFACE FFTW)
        message(STATUS "Found FFTW3 library")
    else()
        message(FATAL_ERROR "Failed to find ${QE_FFTW_VENDOR} library. "
            "Alternatively, remove -DQE_FFTW_VENDOR to automatic search a FFTW library installed in the system.")
    endif()
elseif(QE_FFTW_VENDOR STREQUAL "Internal")
    message(STATUS "QE internal implementation of FFTW (FFTXLib)")
    qe_add_global_compile_definitions(__FFTW)
    set(qe_fft_wrappers fft_scalar.FFTW.f90)
else()
    message(FATAL_ERROR "The FFTW vendor library '${QE_FFTW_VENDOR}' is not supported!")
endif()
SET(BLA_VENDOR ${BLA_VENDOR_SAVED})

set(f_sources
    fft_scatter.f90
    fft_scatter_2d.f90
    scatter_mod.f90 
    fft_ggen.f90
    fft_fwinv.f90
    fft_scalar.f90
    fftw_interfaces.f90
    fft_parallel.f90
    fft_parallel_2d.f90
    fft_interfaces.f90
    fft_interpolate.f90
    stick_base.f90
    fft_smallbox.f90
    fft_smallbox_type.f90
    fft_support.f90
    fft_error.f90
    fft_types.f90
    tg_gather.f90
    fft_helper_subroutines.f90
    fft_param.f90)

if(QE_ENABLE_CUDA)
  set(f_sources ${f_sources}
      fft_scatter_gpu.f90
      fft_scatter_2d_gpu.f90
      fft_buffers.f90
      fft_scalar.cuFFT.f90)
endif()

set(c_sources
    fft_stick.c
    fftw.c
    fftw_sp.c
    fftw_dp.c)

qe_add_library(qe_fftx ${f_sources} ${c_sources} ${qe_fft_wrappers})
add_library(QE::FFTX ALIAS qe_fftx)
target_link_libraries(qe_fftx
    PRIVATE
        QE::FFT
        QE::OpenMP_Fortran
        QE::MPI_Fortran
        QE::LAPACK)
qe_install_targets(qe_fftx)

###########################################################
# Tests
# TODO move all tests to a proper location
###########################################################
if(QE_ENABLE_TEST)
    set(sources fft_test.f90)
    qe_add_executable(qe_fftx_test ${sources})
    set_target_properties(qe_fftx_test PROPERTIES OUTPUT_NAME qe_fftx_test.x RUNTIME_OUTPUT_DIRECTORY ${QE_TESTS_DIR})
    target_link_libraries(qe_fftx_test
        PRIVATE
            QE::OpenMP_Fortran
            QE::MPI_Fortran
            QE::LAPACK
            QE::FFTX)
    add_test(NAME test_qe_fftx COMMAND ${QE_TESTS_DIR}/qe_fftx_test.x)
endif()