(git:374b731)
Loading...
Searching...
No Matches
fft_lib.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7MODULE fft_lib
8
9 USE fft_kinds, ONLY: dp
10 USE fft_plan, ONLY: fft_plan_type
11 USE fftsg_lib, ONLY: fftsg1dm,&
12 fftsg3d,&
16 USE fftw3_lib, ONLY: &
17 fft_alloc => fftw_alloc, fft_dealloc => fftw_dealloc, fftw31dm, fftw33d, &
20#include "../../base/base_uses.f90"
21
22 IMPLICIT NONE
23 PRIVATE
24
25 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fft_lib'
26
29 PUBLIC :: fft_alloc, fft_dealloc
30
31CONTAINS
32! **************************************************************************************************
33!> \brief Interface to FFT libraries
34!> \param fftlib ...
35!> \return ...
36!> \par History
37!> IAB 09-Jan-2009 : Modified to use fft_plan_type
38!> (c) The Numerical Algorithms Group (NAG) Ltd, 2009 on behalf of the HECToR project
39!> \author JGH
40! **************************************************************************************************
41 FUNCTION fft_library(fftlib) RESULT(flib)
42
43 CHARACTER(len=*), INTENT(IN) :: fftlib
44 INTEGER :: flib
45
46 SELECT CASE (fftlib)
47 CASE DEFAULT
48 flib = -1
49 CASE ("FFTSG")
50 flib = 1
51 CASE ("FFTW3")
52 flib = 3
53 END SELECT
54
55 END FUNCTION fft_library
56
57! **************************************************************************************************
58!> \brief ...
59!> \param fft_type ...
60!> \param wisdom_file ...
61! **************************************************************************************************
62 SUBROUTINE fft_do_init(fft_type, wisdom_file)
63 INTEGER, INTENT(IN) :: fft_type
64 CHARACTER(LEN=*), INTENT(IN) :: wisdom_file
65
66 SELECT CASE (fft_type)
67 CASE DEFAULT
68 cpabort("fft_do_init")
69 CASE (1)
70 CALL fftsg_do_init()
71 CASE (3)
72 CALL fftw3_do_init(wisdom_file)
73 END SELECT
74
75 END SUBROUTINE
76
77! **************************************************************************************************
78!> \brief ...
79!> \param fft_type ...
80!> \param wisdom_file ...
81!> \param ionode ...
82! **************************************************************************************************
83 SUBROUTINE fft_do_cleanup(fft_type, wisdom_file, ionode)
84 INTEGER, INTENT(IN) :: fft_type
85 CHARACTER(LEN=*), INTENT(IN) :: wisdom_file
86 LOGICAL, INTENT(IN) :: ionode
87
88 SELECT CASE (fft_type)
89 CASE DEFAULT
90 cpabort("fft_do_cleanup")
91 CASE (1)
92 CALL fftsg_do_cleanup()
93 CASE (3)
94 CALL fftw3_do_cleanup(wisdom_file, ionode)
95 END SELECT
96
97 END SUBROUTINE
98
99! **************************************************************************************************
100!> \brief ...
101!> \param fft_type ...
102!> \param DATA ...
103!> \param max_length ...
104! **************************************************************************************************
105 SUBROUTINE fft_get_lengths(fft_type, DATA, max_length)
106
107 INTEGER, INTENT(IN) :: fft_type
108 INTEGER, DIMENSION(*) :: data
109 INTEGER, INTENT(INOUT) :: max_length
110
111 SELECT CASE (fft_type)
112 CASE DEFAULT
113 cpabort("fft_get_lengths")
114 CASE (1)
115 CALL fftsg_get_lengths(DATA, max_length)
116 CASE (3)
117 CALL fftw3_get_lengths(DATA, max_length)
118 END SELECT
119
120 END SUBROUTINE fft_get_lengths
121
122! **************************************************************************************************
123
124! **************************************************************************************************
125!> \brief ...
126!> \param plan ...
127!> \param fft_type ...
128!> \param fft_in_place ...
129!> \param fsign ...
130!> \param n ...
131!> \param zin ...
132!> \param zout ...
133!> \param plan_style ...
134! **************************************************************************************************
135 SUBROUTINE fft_create_plan_3d(plan, fft_type, fft_in_place, fsign, n, zin, zout, plan_style)
136
137 TYPE(fft_plan_type), INTENT(INOUT) :: plan
138 INTEGER, INTENT(IN) :: fft_type
139 LOGICAL, INTENT(IN) :: fft_in_place
140 INTEGER, INTENT(IN) :: fsign
141 INTEGER, DIMENSION(3), INTENT(IN) :: n
142 COMPLEX(KIND=dp), DIMENSION(*), INTENT(INOUT) :: zin, zout
143 INTEGER, INTENT(IN) :: plan_style
144
145 plan%fft_type = fft_type
146 plan%fsign = fsign
147 plan%fft_in_place = fft_in_place
148 plan%n_3d = n
149!$ plan%need_alt_plan = .FALSE.
150
151 ! Planning only needed for FFTW3
152 IF (fft_type .EQ. 3) THEN
153 CALL fftw3_create_plan_3d(plan, zin, zout, plan_style)
154 plan%valid = .true.
155 END IF
156
157 END SUBROUTINE fft_create_plan_3d
158
159!
160! really ugly, plan is intent out, because plan%fsign is also a status flag
161! if something goes wrong, plan%fsign is set to zero, and the plan becomes invalid
162!
163! **************************************************************************************************
164!> \brief ...
165!> \param plan ...
166!> \param scale ...
167!> \param zin ...
168!> \param zout ...
169!> \param stat ...
170! **************************************************************************************************
171 SUBROUTINE fft_3d(plan, scale, zin, zout, stat)
172 TYPE(fft_plan_type), INTENT(IN) :: plan
173 REAL(kind=dp), INTENT(IN) :: scale
174 COMPLEX(KIND=dp), DIMENSION(*), INTENT(INOUT) :: zin, zout
175 INTEGER, INTENT(OUT) :: stat
176
177 stat = plan%fsign
178 IF (plan%n_3d(1)*plan%n_3d(2)*plan%n_3d(3) > 0) THEN
179 SELECT CASE (plan%fft_type)
180 CASE DEFAULT
181 cpabort("fft_3d")
182 CASE (1)
183 CALL fftsg3d(plan%fft_in_place, stat, scale, plan%n_3d, zin, zout)
184 CASE (3)
185 CALL fftw33d(plan, scale, zin, zout, stat)
186 END SELECT
187 END IF
188 ! stat is set to zero on error, -1,+1 are OK
189 IF (stat .EQ. 0) THEN
190 stat = 1
191 ELSE
192 stat = 0
193 END IF
194
195 END SUBROUTINE fft_3d
196
197! **************************************************************************************************
198
199! **************************************************************************************************
200!> \brief ...
201!> \param plan ...
202!> \param fft_type ...
203!> \param fsign ...
204!> \param trans ...
205!> \param n ...
206!> \param m ...
207!> \param zin ...
208!> \param zout ...
209!> \param plan_style ...
210! **************************************************************************************************
211 SUBROUTINE fft_create_plan_1dm(plan, fft_type, fsign, trans, n, m, zin, zout, plan_style)
212 TYPE(fft_plan_type), INTENT(INOUT) :: plan
213 INTEGER, INTENT(IN) :: fft_type, fsign
214 LOGICAL, INTENT(IN) :: trans
215 INTEGER, INTENT(IN) :: n, m
216 COMPLEX(KIND=dp), DIMENSION(*), INTENT(IN) :: zin, zout
217 INTEGER, INTENT(IN) :: plan_style
218
219 plan%fft_type = fft_type
220 plan%fsign = fsign
221 plan%trans = trans
222 plan%n = n
223 plan%m = m
224!$ plan%need_alt_plan = .FALSE.
225
226 ! Planning only needed for FFTW3
227 IF ((fft_type .EQ. 3) .AND. (n*m .NE. 0)) THEN
228 CALL fftw3_create_plan_1dm(plan, zin, zout, plan_style)
229 plan%valid = .true.
230 ELSE
231 plan%valid = .false.
232 END IF
233
234 END SUBROUTINE fft_create_plan_1dm
235
236! **************************************************************************************************
237!> \brief ...
238!> \param plan ...
239! **************************************************************************************************
240 SUBROUTINE fft_destroy_plan(plan)
241 TYPE(fft_plan_type), INTENT(INOUT) :: plan
242
243! Planning only needed for FFTW3
244
245 IF (plan%valid .AND. plan%fft_type .EQ. 3) THEN
246 CALL fftw3_destroy_plan(plan)
247 plan%valid = .false.
248 END IF
249
250 END SUBROUTINE
251
252! **************************************************************************************************
253!> \brief ...
254!> \param plan ...
255!> \param zin ...
256!> \param zout ...
257!> \param scale ...
258!> \param stat ...
259! **************************************************************************************************
260 SUBROUTINE fft_1dm(plan, zin, zout, scale, stat)
261 TYPE(fft_plan_type), INTENT(IN) :: plan
262 COMPLEX(KIND=dp), DIMENSION(*), INTENT(INOUT) :: zin, zout
263 REAL(kind=dp), INTENT(IN) :: scale
264 INTEGER, INTENT(OUT) :: stat
265
266 stat = plan%fsign
267 IF (plan%n*plan%m > 0) THEN
268 SELECT CASE (plan%fft_type)
269 CASE DEFAULT
270 cpabort("fft_1dm")
271 CASE (1)
272 CALL fftsg1dm(stat, plan%trans, plan%n, plan%m, zin, zout, scale)
273 CASE (3)
274 CALL fftw31dm(plan, zin, zout, scale, stat)
275 END SELECT
276 END IF
277 ! stat is set to zero on error, -1,+1 are OK
278 IF (stat .EQ. 0) THEN
279 stat = 1
280 ELSE
281 stat = 0
282 END IF
283
284 END SUBROUTINE fft_1dm
285
286END MODULE
287
Defines the basic variable types.
Definition fft_kinds.F:13
integer, parameter, public dp
Definition fft_kinds.F:18
subroutine, public fft_do_init(fft_type, wisdom_file)
...
Definition fft_lib.F:63
subroutine, public fft_3d(plan, scale, zin, zout, stat)
...
Definition fft_lib.F:172
subroutine, public fft_create_plan_1dm(plan, fft_type, fsign, trans, n, m, zin, zout, plan_style)
...
Definition fft_lib.F:212
subroutine, public fft_destroy_plan(plan)
...
Definition fft_lib.F:241
integer function, public fft_library(fftlib)
Interface to FFT libraries.
Definition fft_lib.F:42
subroutine, public fft_1dm(plan, zin, zout, scale, stat)
...
Definition fft_lib.F:261
subroutine, public fft_get_lengths(fft_type, data, max_length)
...
Definition fft_lib.F:106
subroutine, public fft_create_plan_3d(plan, fft_type, fft_in_place, fsign, n, zin, zout, plan_style)
...
Definition fft_lib.F:136
subroutine, public fft_do_cleanup(fft_type, wisdom_file, ionode)
...
Definition fft_lib.F:84
Type to store data about a (1D or 3D) FFT, including FFTW plan.
Definition fft_plan.F:18
subroutine, public fftsg1dm(fsign, trans, n, m, zin, zout, scale)
...
Definition fftsg_lib.F:136
subroutine, public fftsg_do_init()
...
Definition fftsg_lib.F:25
subroutine, public fftsg_get_lengths(data, max_length)
...
Definition fftsg_lib.F:48
subroutine, public fftsg_do_cleanup()
...
Definition fftsg_lib.F:34
subroutine, public fftsg3d(fft_in_place, fsign, scale, n, zin, zout)
...
Definition fftsg_lib.F:79
subroutine, public fftw3_do_cleanup(wisdom_file, ionode)
...
Definition fftw3_lib.F:198
subroutine, public fftw3_destroy_plan(plan)
...
Definition fftw3_lib.F:1186
subroutine, public fftw3_create_plan_3d(plan, zin, zout, plan_style)
...
Definition fftw3_lib.F:748
subroutine, public fftw3_get_lengths(data, max_length)
...
Definition fftw3_lib.F:331
subroutine, public fftw33d(plan, scale, zin, zout, stat)
...
Definition fftw3_lib.F:999
subroutine, public fftw31dm(plan, zin, zout, scale, stat)
...
Definition fftw3_lib.F:1222
subroutine, public fftw3_do_init(wisdom_file)
...
Definition fftw3_lib.F:231
subroutine, public fftw3_create_plan_1dm(plan, zin, zout, plan_style)
...
Definition fftw3_lib.F:1090