(git:e7e05ae)
fftsg_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 !--------------------------------------------------------------------------------------------------!
7 MODULE fftsg_lib
8  USE fft_kinds, ONLY: dp
9  USE mltfftsg_tools, ONLY: mltfftsg
10 
11  IMPLICIT NONE
12 
13  PRIVATE
14 
15  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fftsg_lib'
16 
18 
19 CONTAINS
20 
21 ! **************************************************************************************************
22 !> \brief ...
23 ! **************************************************************************************************
24  SUBROUTINE fftsg_do_init()
25 
26  ! no init needed
27 
28  END SUBROUTINE
29 
30 ! **************************************************************************************************
31 !> \brief ...
32 ! **************************************************************************************************
33  SUBROUTINE fftsg_do_cleanup()
34 
35  ! no cleanup needed
36 
37  END SUBROUTINE
38 
39 ! **************************************************************************************************
40 !> \brief ...
41 !> \param DATA ...
42 !> \param max_length ...
43 !> \par History
44 !> Adapted to new interface structure
45 !> \author JGH
46 ! **************************************************************************************************
47  SUBROUTINE fftsg_get_lengths(DATA, max_length)
48 
49  INTEGER, DIMENSION(*) :: data
50  INTEGER, INTENT(INOUT) :: max_length
51 
52  INTEGER, PARAMETER :: rlen = 81
53  INTEGER, DIMENSION(rlen), PARAMETER :: radix = (/2, 4, 6, 8, 9, 12, 15, 16, 18, 20, 24, 25, &
54  27, 30, 32, 36, 40, 45, 48, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, 108, 120, 125, 128, &
55  135, 144, 150, 160, 162, 180, 192, 200, 216, 225, 240, 243, 256, 270, 288, 300, 320, 324, &
56  360, 375, 384, 400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675, &
57  720, 729, 750, 768, 800, 810, 864, 900, 960, 972, 1000, 1024/)
58 
59  INTEGER :: ndata
60 
61 !------------------------------------------------------------------------------
62 
63  ndata = min(max_length, rlen)
64  DATA(1:ndata) = radix(1:ndata)
65  max_length = ndata
66 
67  END SUBROUTINE fftsg_get_lengths
68 
69 ! **************************************************************************************************
70 !> \brief ...
71 !> \param fft_in_place ...
72 !> \param fsign ...
73 !> \param scale ...
74 !> \param n ...
75 !> \param zin ...
76 !> \param zout ...
77 ! **************************************************************************************************
78  SUBROUTINE fftsg3d(fft_in_place, fsign, scale, n, zin, zout)
79 
80  LOGICAL, INTENT(IN) :: fft_in_place
81  INTEGER, INTENT(INOUT) :: fsign
82  REAL(kind=dp), INTENT(IN) :: scale
83  INTEGER, DIMENSION(*), INTENT(IN) :: n
84  COMPLEX(KIND=dp), DIMENSION(*), INTENT(INOUT) :: zin, zout
85 
86  COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:) :: xf, yf
87  INTEGER :: nx, ny, nz
88 
89 !------------------------------------------------------------------------------
90 
91  nx = n(1)
92  ny = n(2)
93  nz = n(3)
94 
95  IF (fft_in_place) THEN
96 
97  ALLOCATE (xf(nx*ny*nz), yf(nx*ny*nz))
98 
99  CALL mltfftsg('N', 'T', zin, nx, ny*nz, xf, ny*nz, nx, nx, &
100  ny*nz, fsign, 1.0_dp)
101  CALL mltfftsg('N', 'T', xf, ny, nx*nz, yf, nx*nz, ny, ny, &
102  nx*nz, fsign, 1.0_dp)
103  CALL mltfftsg('N', 'T', yf, nz, ny*nx, zin, ny*nx, nz, nz, &
104  ny*nx, fsign, scale)
105 
106  DEALLOCATE (xf, yf)
107 
108  ELSE
109 
110  ALLOCATE (xf(nx*ny*nz))
111 
112  CALL mltfftsg('N', 'T', zin, nx, ny*nz, zout, ny*nz, nx, nx, &
113  ny*nz, fsign, 1.0_dp)
114  CALL mltfftsg('N', 'T', zout, ny, nx*nz, xf, nx*nz, ny, ny, &
115  nx*nz, fsign, 1.0_dp)
116  CALL mltfftsg('N', 'T', xf, nz, ny*nx, zout, ny*nx, nz, nz, &
117  ny*nx, fsign, scale)
118 
119  DEALLOCATE (xf)
120 
121  END IF
122 
123  END SUBROUTINE fftsg3d
124 
125 ! **************************************************************************************************
126 !> \brief ...
127 !> \param fsign ...
128 !> \param trans ...
129 !> \param n ...
130 !> \param m ...
131 !> \param zin ...
132 !> \param zout ...
133 !> \param scale ...
134 ! **************************************************************************************************
135  SUBROUTINE fftsg1dm(fsign, trans, n, m, zin, zout, scale)
136 
137  INTEGER, INTENT(INOUT) :: fsign
138  LOGICAL, INTENT(IN) :: trans
139  INTEGER, INTENT(IN) :: n, m
140  COMPLEX(KIND=dp), DIMENSION(*), INTENT(INOUT) :: zin
141  COMPLEX(KIND=dp), DIMENSION(*), INTENT(OUT) :: zout
142  REAL(kind=dp), INTENT(IN) :: scale
143 
144 !------------------------------------------------------------------------------
145 
146  IF (trans) THEN
147  IF (fsign > 0) THEN
148  CALL mltfftsg("T", "N", zin, m, n, zout, n, m, n, m, fsign, scale)
149  ELSE
150  CALL mltfftsg("N", "T", zin, n, m, zout, m, n, n, m, fsign, scale)
151  END IF
152  ELSE
153  CALL mltfftsg("N", "N", zin, n, m, zout, n, m, n, m, fsign, scale)
154  END IF
155 
156  END SUBROUTINE fftsg1dm
157 
158 END MODULE
159 
Defines the basic variable types.
Definition: fft_kinds.F:13
integer, parameter, public dp
Definition: fft_kinds.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 mltfftsg(transa, transb, a, ldax, lday, b, ldbx, ldby, n, m, isign, scale)
...