Branch data Line data Source code
1 : : !!****m* ABINIT/defs_fftdata
2 : : !! NAME
3 : : !! defs_fftdata
4 : : !!
5 : : !! FUNCTION
6 : : !! This module contains definitions for a number of parameters
7 : : !! used to define fft grids within Abinit
8 : : !!
9 : : !! COPYRIGHT
10 : : !! Copyright (C) 2000-2026 ABINIT group (LG, PMA)
11 : : !! This file is distributed under the terms of the
12 : : !! GNU General Public License, see ~abinit/COPYING
13 : : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : : !!
15 : : !! NOTES
16 : : !! 1) Most of those number are choosen arbitrarily but any modification
17 : : !! should be done keeping in mind the overall coherency.
18 : : !! 2) ifftdata cannot be constructed directly in one big reshape instruction,
19 : : !! because the F90 line is too long for some compiler
20 : : !!
21 : : !! SOURCE
22 : :
23 : : #if defined HAVE_CONFIG_H
24 : : #include "config.h"
25 : : #endif
26 : :
27 : : module defs_fftdata
28 : :
29 : : use defs_basis
30 : :
31 : : implicit none
32 : :
33 : : integer, parameter :: mdata=7
34 : : integer, parameter :: ndata=231
35 : : integer, parameter :: mg=65536 ! biggest value in the latter tables (ifftdata and ifftsizes)
36 : :
37 : : ! The factors 2, 7 and higher than 8 are forbidden 8 is to be the favored factor
38 : : ! The factor 6 is only allowed in the first place!
39 : : ! These data have to be coherent with the one in getng.F90
40 : : integer, parameter :: ifftdata1_40(280) = (/ &
41 : : 3, 3, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 5, 5, 1, 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, &
42 : : 8, 8, 1, 1, 1, 1, 1, 9, 3, 3, 1, 1, 1, 1, 10, 5, 2, 1, 1, 1, 1, 12, 4, 3, 1, 1, 1, 1, &
43 : : 15, 5, 3, 1, 1, 1, 1, 16, 4, 4, 1, 1, 1, 1, 18, 6, 3, 1, 1, 1, 1, 20, 5, 4, 1, 1, 1, 1, &
44 : : 24, 8, 3, 1, 1, 1, 1, 25, 5, 5, 1, 1, 1, 1, 27, 3, 3, 3, 1, 1, 1, 30, 6, 5, 1, 1, 1, 1, &
45 : : 32, 8, 4, 1, 1, 1, 1, 36, 4, 3, 3, 1, 1, 1, 40, 8, 5, 1, 1, 1, 1, 45, 5, 3, 3, 1, 1, 1, &
46 : : 48, 4, 4, 3, 1, 1, 1, 50, 5, 5, 2, 1, 1, 1, 54, 6, 3, 3, 1, 1, 1, 60, 5, 4, 3, 1, 1, 1, &
47 : : 64, 8, 8, 1, 1, 1, 1, 72, 8, 3, 3, 1, 1, 1, 75, 5, 5, 3, 1, 1, 1, 80, 5, 4, 4, 1, 1, 1, &
48 : : 81, 3, 3, 3, 3, 1, 1, 90, 6, 5, 3, 1, 1, 1, 96, 8, 4, 3, 1, 1, 1, 100, 5, 5, 4, 1, 1, 1, &
49 : : 108, 4, 3, 3, 3, 1, 1, 120, 8, 5, 3, 1, 1, 1, 125, 5, 5, 5, 1, 1, 1, 128, 8, 4, 4, 1, 1, 1, &
50 : : 135, 5, 3, 3, 3, 1, 1, 144, 6, 8, 3, 1, 1, 1, 150, 6, 5, 5, 1, 1, 1, 160, 8, 5, 4, 1, 1, 1 /)
51 : : integer, parameter :: ifftdata41_80(280) = (/ &
52 : : 162, 6, 3, 3, 3, 1, 1, 180, 5, 4, 3, 3, 1, 1, 192, 6, 8, 4, 1, 1, 1, 200, 8, 5, 5, 1, 1, 1, &
53 : : 216, 8, 3, 3, 3, 1, 1, 225, 5, 5, 3, 3, 1, 1, 240, 6, 8, 5, 1, 1, 1, 243, 3, 3, 3, 3, 3, 1, &
54 : : 250, 5, 5, 5, 2, 1, 1, 256, 8, 8, 4, 1, 1, 1, 270, 6, 5, 3, 3, 1, 1, 288, 8, 4, 3, 3, 1, 1, &
55 : : 300, 5, 5, 4, 3, 1, 1, 320, 5, 4, 4, 4, 1, 1, 324, 4, 3, 3, 3, 3, 1, 360, 8, 5, 3, 3, 1, 1, &
56 : : 375, 5, 5, 5, 3, 1, 1, 384, 8, 4, 4, 3, 1, 1, 400, 5, 5, 4, 4, 1, 1, 405, 5, 3, 3, 3, 3, 1, &
57 : : 432, 4, 4, 3, 3, 3, 1, 450, 6, 5, 5, 3, 1, 1, 480, 8, 5, 4, 3, 1, 1, 486, 6, 3, 3, 3, 3, 1, &
58 : : 500, 5, 5, 5, 4, 1, 1, 512, 8, 8, 8, 1, 1, 1, 540, 5, 4, 3, 3, 3, 1, 576, 4, 4, 4, 3, 3, 1, &
59 : : 600, 8, 5, 5, 3, 1, 1, 625, 5, 5, 5, 5, 1, 1, 640, 8, 5, 4, 4, 1, 1, 648, 8, 3, 3, 3, 3, 1, &
60 : : 675, 5, 5, 3, 3, 3, 1, 720, 5, 4, 4, 3, 3, 1, 729, 3, 3, 3, 3, 3, 3, 750, 6, 5, 5, 5, 1, 1, &
61 : : 768, 4, 4, 4, 4, 3, 1, 800, 8, 5, 5, 4, 1, 1, 810, 6, 5, 3, 3, 3, 1, 864, 8, 4, 3, 3, 3, 1 /)
62 : : integer, parameter :: ifftdata81_120(280) = (/ &
63 : : 900, 5, 5, 4, 3, 3, 1, 960, 5, 4, 4, 4, 3, 1, 972, 4, 3, 3, 3, 3, 3, 1000, 8, 5, 5, 5, 1, 1, &
64 : : 1024, 4, 4, 4, 4, 4, 1, 1080, 6, 5, 4, 3, 3, 1, 1125, 5, 5, 5, 3, 3, 1, 1152, 6, 4, 4, 4, 3, 1, &
65 : : 1200, 6, 8, 5, 5, 1, 1, 1215, 5, 3, 3, 3, 3, 3 , 1250, 5, 5, 5, 5, 2, 1, 1280 , 8, 8, 5, 4, 1, 1, &
66 : : 1296, 6, 8, 3, 3, 3, 1, 1350, 6, 5, 5, 3, 3, 1, 1440, 6, 5, 4, 4, 3, 1, 1458, 6, 3, 3, 3, 3, 3, &
67 : : 1500, 5, 5, 5, 4, 3, 1, 1536, 6, 8, 8, 4, 1, 1, 1600, 8, 8, 5, 5, 1, 1, 1620, 5, 4, 3, 3, 3, 3, &
68 : : 1728, 6, 8, 4, 3, 3, 1, 1800, 6, 5, 5, 4, 3, 1, 1875, 5, 5, 5, 5, 3, 1, 1920, 6, 5, 4, 4, 4, 1, &
69 : : 1944, 6, 4, 3, 3, 3, 3, 2000, 5, 5, 5, 4, 4, 1, 2025, 5, 5, 3, 3, 3, 3, 2048, 8, 4, 4, 4, 4, 1, &
70 : : 2160, 6, 8, 5, 3, 3, 1, 2250, 6, 5, 5, 5, 3, 1, 2304, 6, 8, 4, 4, 3, 1, 2400, 6, 5, 5, 4, 4, 1, &
71 : : 2430, 6, 5, 3, 3, 3, 3, 2500, 5, 5, 5, 5, 4, 1, 2560, 8, 5, 4, 4, 4, 1, 2592, 6, 4, 4, 3, 3, 3, &
72 : : 2700, 5, 5, 4, 3, 3, 3, 2880, 6, 8, 5, 4, 3, 1, 3000, 6, 5, 5, 5, 4, 1, 3072, 6, 8, 4, 4, 4, 1 /)
73 : : integer, parameter :: ifftdata121_160(280) = (/ &
74 : : 3125, 5, 5, 5, 5, 5, 1, 3200, 8, 5, 5, 4, 4, 1, 3240, 6, 5, 4, 3, 3, 3, 3375, 5, 5, 5, 3, 3, 3, &
75 : : 3456, 6, 4, 4, 4, 3, 3, 3600, 6, 8, 5, 5, 3, 1, 3750, 6, 5, 5, 5, 5, 1, 3840, 6, 8, 5, 4, 4, 1, &
76 : : 3888, 6, 8, 3, 3, 3, 3, 4000, 8, 5, 5, 5, 4, 1, 4050, 6, 5, 5, 3, 3, 3, 4096, 8, 8, 4, 4, 4, 1, &
77 : : 4320, 6, 5, 4, 4, 3, 3, 4500, 5, 5, 5, 4, 3, 3, 4608, 6, 8, 8, 4, 3, 1, 4800, 6, 8, 5, 5, 4, 1, &
78 : : 5000, 8, 5, 5, 5, 5, 1, 5120, 8, 8, 5, 4, 4, 1, 5184, 6, 8, 4, 3, 3, 3, 5400, 6, 5, 5, 4, 3, 3, &
79 : : 5625, 5, 5, 5, 5, 3, 3, 5760, 6, 8, 8, 5, 3, 1, 6000, 6, 8, 5, 5, 5, 1, 6144, 6, 8, 8, 4, 4, 1, &
80 : : 6400, 8, 8, 5, 5, 4, 1, 6480, 6, 8, 5, 3, 3, 3, 6750, 6, 5, 5, 5, 3, 3, 6912, 6, 8, 4, 4, 3, 3, &
81 : : 7200, 6, 5, 5, 4, 4, 3, 7500, 5, 5, 5, 5, 4, 3, 7680, 6, 8, 8, 5, 4, 1, 7776, 8, 6, 6, 3, 3, 3, &
82 : : 8000, 8, 8, 5, 5, 5, 1, 8100, 6, 6, 5, 5, 3, 3, 8192, 8, 8, 8, 4, 4, 1, 08640, 8, 8, 5, 3, 3, 3, &
83 : : 09000, 8, 5, 5, 5, 3, 3, 09216 , 8, 8, 8, 6, 3, 1, 09375, 5, 5, 5, 5, 5, 3, 09600, 8, 8, 6, 5, 5, 1 /)
84 : : integer, parameter :: ifftdata161_200(280) = (/ &
85 : : 09720, 6, 6, 6, 5, 3, 3, 10000 , 5, 5, 5, 5, 4, 4, 10240, 8, 8, 8, 5, 4, 1, 10368, 8, 8, 6, 3, 3, 3, &
86 : : 10800, 8, 6, 5, 5, 3, 3, 11250 , 6, 5, 5, 5, 5, 3, 11520, 8, 8, 6, 6, 5, 1, 11664, 6, 6, 6, 6, 3, 3, &
87 : : 12000, 8, 5, 5, 5, 4, 3, 12288, 8, 8, 8, 8, 3, 1, 12500, 5, 5, 5, 5, 5, 4, 12800, 8, 8, 8, 5, 5, 1, &
88 : : 12960, 8, 6, 6, 5, 3, 3, 13500, 6, 6, 5, 5, 5, 3, 13824, 8, 8, 8, 3, 3, 3, 14400, 8, 8, 5, 5, 3, 3, &
89 : : 15000, 8, 5, 5, 5, 5, 3, 15360, 8, 8, 8, 6, 5, 1, 15552, 8, 6, 6, 6, 3, 3, 15625, 5, 5, 5, 5, 5, 5, &
90 : : 16000, 8, 5, 5, 5, 4, 4, 16200, 6, 6, 6, 5, 5, 3, 16384, 8, 8, 8, 8, 4, 1, 17280, 8, 8, 6, 5, 3, 3, &
91 : : 18000, 8, 6, 5, 5, 5, 3, 18432, 8, 8, 8, 6, 6, 1, 18750, 6, 5, 5, 5, 5, 5, 19200, 8, 8, 5, 5, 4, 3, &
92 : : 19440, 6, 6, 6, 6, 5, 3, 20000, 8, 5, 5, 5, 5, 4, 20480, 8, 8, 8, 8, 5, 1, 20736, 8, 8, 6, 6, 3, 3, &
93 : : 21600, 8, 6, 6, 5, 5, 3, 22500, 6, 6, 5, 5, 5, 5, 23040, 8, 8, 8, 5, 3, 3, 23328, 6, 6, 6, 6, 6, 3, &
94 : : 24000, 8, 8, 5, 5, 5, 3, 24576, 8, 8, 8, 8, 6, 1, 25000, 8, 5, 5, 5, 5, 5, 25600, 8, 8, 5, 5, 4, 4 /)
95 : : integer, parameter :: ifftdata201_231(217) = (/ &
96 : : 25920, 8, 6, 6, 6, 5, 3, 27000, 6, 6, 6, 5, 5, 5, 27648, 8, 8, 8, 6, 3, 3, 28800, 8, 8, 6, 5, 5, 3, &
97 : : 30000, 8, 6, 5, 5, 5, 5, 30720, 8, 8, 8, 5, 4, 3, 31104, 8, 6, 6, 6, 6, 3, 32000, 8, 8, 5, 5, 5, 4, &
98 : : 32400, 6, 6, 6, 6, 5, 5, 32768, 8, 8, 8, 8, 8, 1, 34560, 8, 8, 6, 6, 5, 3, 36000, 8, 6, 6, 5, 5, 5, &
99 : : 36864, 8, 8, 8, 8, 3, 3, 38400, 8, 8, 8, 5, 5, 3, 38880, 6, 6, 6, 6, 6, 5, 40000, 8, 8, 5, 5, 5, 5, &
100 : : 40960, 8, 8, 8, 5, 4, 4, 41472, 8, 8, 6, 6, 6, 3, 43200, 8, 6, 6, 6, 5, 5, 46080, 8, 8, 8, 6, 5, 3, &
101 : : 46656, 6, 6, 6, 6, 6, 6, 48000, 8, 8, 6, 5, 5, 5, 49152, 8, 8, 8, 8, 4, 3, 51200, 8, 8, 8, 5, 5, 4, &
102 : : 51840, 8, 6, 6, 6, 6, 5, 55296, 8, 8, 8, 6, 6, 3, 57600, 8, 8, 6, 6, 5, 5, 61440, 8, 8, 8, 8, 5, 3, &
103 : : 62208, 8, 6, 6, 6, 6, 6, 64000, 8, 8, 8, 5, 5, 5, 65536, 8, 8, 8, 8, 4, 4 /)
104 : : integer, parameter :: ifftdata(mdata,ndata)= reshape( (/ &
105 : : & ifftdata1_40, &
106 : : & ifftdata41_80, &
107 : : & ifftdata81_120, &
108 : : & ifftdata121_160, &
109 : : & ifftdata161_200, &
110 : : & ifftdata201_231 &
111 : : & /), (/mdata,ndata/) )
112 : :
113 : : integer, parameter :: ifftsizes(ndata)= (/ &
114 : : 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, &
115 : : 20, 24, 25, 27, 30, 32, 36, 40, 45, 48, &
116 : : 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, &
117 : : 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, &
118 : : 192, 200, 216, 225, 240, 243, 250, 256, 270, 288, 300, &
119 : : 320, 324, 360, 375, 384, 400, 405, 432, 450, 480, &
120 : : 486, 500, 512, 540, 576, 600, 625, 640, 648, 675, &
121 : : 720, 729, 750, 768, 800, 810, 864, 900, 960, 972, &
122 : : 1000, 1024, 1080, 1125, 1152, 1200, 1215, 1250, 1280, 1296, 1350,&
123 : : 1440, 1458, 1500, 1536, 1600, 1620, 1728, 1800, 1875, 1920,&
124 : : 1944, 2000, 2025, 2048, 2160, 2250, 2304, 2400, 2430, 2500,&
125 : : 2560, 2592, 2700, 2880, 3000, 3072, 3125, 3200, 3240, 3375,&
126 : : 3456, 3600, 3750, 3840, 3888, 4000, 4050, 4096, 4320, 4500,&
127 : : 4608, 4800, 5000, 5120, 5184, 5400, 5625, 5760, 6000, 6144,&
128 : : 6400, 6480, 6750, 6912, 7200, 7500, 7680, 7776, 8000, 8100, 8192,&
129 : : 08640, 09000, 09216, 09375, 09600, 09720, 10000, 10240, 10368, 10800, &
130 : : 11250, 11520, 11664, 12000, 12288, 12500, 12800, 12960, 13500, 13824, &
131 : : 14400, 15000, 15360, 15552, 15625, 16000, 16200, 16384, 17280, 18000, &
132 : : 18432, 18750, 19200, 19440, 20000, 20480, 20736, 21600, 22500, 23040, &
133 : : 23328, 24000, 24576, 25000, 25600, 25920, 27000, 27648, 28800, 30000, &
134 : : 30720, 31104, 32000, 32400, 32768, 34560, 36000, 36864, 38400, 38880, &
135 : : 40000, 40960, 41472, 43200, 46080, 46656, 48000, 49152, 51200, 51840, &
136 : : 55296, 57600, 61440, 62208, 64000, 65536 &
137 : : /)
138 : :
139 : : CONTAINS !===========================================================
140 : : !!***
141 : :
142 : : !!****f* defs_fftdata/size_goed_fft
143 : : !! NAME
144 : : !! size_goed_fft
145 : : !!
146 : : !! FUNCTION
147 : : !! Calculate N, the size of the smallest allowed FFT that will encompass
148 : : !! the 2M+1 points -M..+M. (Ideally, N=2M+1, but this may not be an allowable FFT).
149 : : !!
150 : : !! INPUTS
151 : : !! m_in=Input M value
152 : : !!
153 : : !! OUTPUT
154 : : !! n_out=Output N value
155 : : !! ierr=Status error
156 : : !!
157 : : !! SOURCE
158 : :
159 : 3532 : subroutine size_goed_fft(m_in,n_out,ierr)
160 : :
161 : : !Arguments ------------------------------------
162 : : !scalars
163 : : integer,intent(in) :: m_in
164 : : integer,intent(out) :: n_out,ierr
165 : :
166 : : !Local variables-------------------------------
167 : : !scalars
168 : : integer :: ii,nbest
169 : : character(len=500) :: msg
170 : : ! *************************************************************************
171 : :
172 : 3532 : ierr = 0
173 : :
174 : 3532 : nbest=2*m_in+1
175 : :
176 [ - + ]: 3532 : if (nbest<2) then
177 : 0 : write(msg,'(4a,i8)')ch10,&
178 : 0 : ' size_goed_fft : BUG-',ch10,&
179 : 0 : ' nbest = ',nbest
180 : 0 : write(std_out,*)msg
181 : 0 : ierr = 1
182 : 0 : RETURN
183 : : end if
184 : :
185 [ - + ]: 3532 : if (nbest>ifftsizes(ndata)) then
186 : 0 : write(msg,'(4a,i8,2a)')ch10,&
187 : 0 : ' size_goed_fft : ERROR-',ch10,&
188 : 0 : ' nbest = ',nbest,ch10,&
189 : 0 : ' is larger than any allowable FFT'
190 : 0 : write(std_out,*)msg
191 : 0 : ierr = 2
192 : 0 : RETURN
193 : : end if
194 : :
195 [ + + ]: 819424 : do ii=ndata,1,-1
196 [ + + ]: 819424 : if (ifftsizes(ii)>=nbest) n_out=ifftsizes(ii)
197 : : end do
198 : :
199 : : end subroutine size_goed_fft
200 : :
201 : : end module defs_fftdata
202 : : !!***
|