Line data Source code
1 : ! This file is part of ELPA.
2 : !
3 : ! The ELPA library was originally created by the ELPA consortium,
4 : ! consisting of the following organizations:
5 : !
6 : ! - Max Planck Computing and Data Facility (MPCDF), formerly known as
7 : ! Rechenzentrum Garching der Max-Planck-Gesellschaft (RZG),
8 : ! - Bergische Universität Wuppertal, Lehrstuhl für angewandte
9 : ! Informatik,
10 : ! - Technische Universität München, Lehrstuhl für Informatik mit
11 : ! Schwerpunkt Wissenschaftliches Rechnen ,
12 : ! - Fritz-Haber-Institut, Berlin, Abt. Theorie,
13 : ! - Max-Plack-Institut für Mathematik in den Naturwissenschaften,
14 : ! Leipzig, Abt. Komplexe Strukutren in Biologie und Kognition,
15 : ! and
16 : ! - IBM Deutschland GmbH
17 : !
18 : !
19 : ! More information can be found here:
20 : ! http://elpa.mpcdf.mpg.de/
21 : !
22 : ! ELPA is free software: you can redistribute it and/or modify
23 : ! it under the terms of the version 3 of the license of the
24 : ! GNU Lesser General Public License as published by the Free
25 : ! Software Foundation.
26 : !
27 : ! ELPA is distributed in the hope that it will be useful,
28 : ! but WITHOUT ANY WARRANTY; without even the implied warranty of
29 : ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 : ! GNU Lesser General Public License for more details.
31 : !
32 : ! You should have received a copy of the GNU Lesser General Public License
33 : ! along with ELPA. If not, see <http://www.gnu.org/licenses/>
34 : !
35 : ! ELPA reflects a substantial effort on the part of the original
36 : ! ELPA consortium, and we ask you to respect the spirit of the
37 : ! license that we chose: i.e., please contribute any changes you
38 : ! may have back to the original ELPA library distribution, and keep
39 : ! any derivatives of ELPA under the same license that we chose for
40 : ! the original distribution, the GNU Lesser General Public License.
41 : !
42 : !
43 : ! ELPA2 -- 2-stage solver for ELPA
44 : !
45 : ! Copyright of the original code rests with the authors inside the ELPA
46 : ! consortium. The copyright of any additional modifications shall rest
47 : ! with their original authors, but shall adhere to the licensing terms
48 : ! distributed along with the original code in the file "COPYING".
49 : !
50 : ! Author: Andreas Marek, MPCDF
51 :
52 : #include "config-f90.h"
53 : !> \brief Fortran module tp provide some variables for the LEGACY interface. This is obsolete, please use the new interface
54 : module elpa2_utilities
55 : use elpa
56 : implicit none
57 : public
58 :
59 : integer(kind=c_int), parameter :: number_of_real_kernels = ELPA_2STAGE_NUMBER_OF_REAL_KERNELS - 6
60 : integer(kind=c_int), parameter :: number_of_complex_kernels = ELPA_2STAGE_NUMBER_OF_COMPLEX_KERNELS
61 :
62 : #ifdef WITH_REAL_GENERIC_KERNEL
63 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_GENERIC = ELPA_2STAGE_REAL_GENERIC
64 : #endif
65 : #ifdef WITH_REAL_GENERIC_SIMPLE_KERNEL
66 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_GENERIC_SIMPLE = ELPA_2STAGE_REAL_GENERIC_SIMPLE
67 : #endif
68 : #ifdef WITH_REAL_BGP_KERNEL
69 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_BGP = ELPA_2STAGE_REAL_BGP
70 : #endif
71 : #ifdef WITH_REAL_BGQ_KERNEL
72 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_BGQ = ELPA_2STAGE_REAL_BGQ
73 : #endif
74 : #ifdef WITH_REAL_SSE_ASSEMBLY_KERNEL
75 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_SSE = ELPA_2STAGE_REAL_SSE_ASSEMBLY
76 : #endif
77 : #ifdef WITH_REAL_SSE_BLOCK2_KERNEL
78 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK2 = ELPA_2STAGE_REAL_SSE_BLOCK2
79 : #endif
80 : #ifdef WITH_REAL_SSE_BLOCK4_KERNEL
81 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK4 = ELPA_2STAGE_REAL_SSE_BLOCK4
82 : #endif
83 : #ifdef WITH_REAL_SSE_BLOCK6_KERNEL
84 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK6 = ELPA_2STAGE_REAL_SSE_BLOCK6
85 : #endif
86 : #ifdef WITH_REAL_AVX_BLOCK2_KERNEL
87 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK2 = ELPA_2STAGE_REAL_AVX_BLOCK2
88 : #endif
89 : #ifdef WITH_REAL_AVX_BLOCK4_KERNEL
90 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK4 = ELPA_2STAGE_REAL_AVX_BLOCK4
91 : #endif
92 : #ifdef WITH_REAL_AVX_BLOCK6_KERNEL
93 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK6 = ELPA_2STAGE_REAL_AVX_BLOCK6
94 : #endif
95 : #ifdef WITH_REAL_AVX2_BLOCK2_KERNEL
96 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK2 = ELPA_2STAGE_REAL_AVX2_BLOCK2
97 : #endif
98 : #ifdef WITH_REAL_AVX2_BLOCK4_KERNEL
99 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK4 = ELPA_2STAGE_REAL_AVX2_BLOCK4
100 : #endif
101 : #ifdef WITH_REAL_AVX2_BLOCK6_KERNEL
102 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK6 = ELPA_2STAGE_REAL_AVX2_BLOCK6
103 : #endif
104 : #ifdef WITH_REAL_AVX512_BLOCK2_KERNEL
105 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK2 = ELPA_2STAGE_REAL_AVX512_BLOCK2
106 : #endif
107 : #ifdef WITH_REAL_AVX512_BLOCK4_KERNEL
108 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK4 = ELPA_2STAGE_REAL_AVX512_BLOCK4
109 : #endif
110 : #ifdef WITH_REAL_AVX512_BLOCK6_KERNEL
111 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK6 = ELPA_2STAGE_REAL_AVX512_BLOCK6
112 : #endif
113 : #ifdef WITH_GPU_KERNEL
114 : integer(kind=c_int), parameter :: REAL_ELPA_KERNEL_GPU = ELPA_2STAGE_REAL_GPU
115 : #endif
116 :
117 : integer(kind=c_int), parameter :: DEFAULT_REAL_ELPA_KERNEL = ELPA_2STAGE_REAL_DEFAULT
118 :
119 : #ifdef WITH_COMPLEX_GENERIC_KERNEL
120 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_GENERIC = ELPA_2STAGE_COMPLEX_GENERIC
121 : #endif
122 : #ifdef WITH_COMPLEX_GENERIC_SIMPLE_KERNEL
123 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_GENERIC_SIMPLE = ELPA_2STAGE_COMPLEX_GENERIC_SIMPLE
124 : #endif
125 : #ifdef WITH_COMPLEX_BGP_KERNEL
126 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_BGP = ELPA_2STAGE_COMPLEX_BGP
127 : #endif
128 : #ifdef WITH_COMPLEX_BGQ_KERNEL
129 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_BGQ = ELPA_2STAGE_COMPLEX_BGQ
130 : #endif
131 : #ifdef WITH_COMPLEX_SSE_ASSEMBLY_KERNEL
132 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_SSE = ELPA_2STAGE_COMPLEX_SSE_ASSEMBLY
133 : #endif
134 : #ifdef WITH_COMPLEX_SSE_BLOCK1_KERNEL
135 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_SSE_BLOCK1 = ELPA_2STAGE_COMPLEX_SSE_BLOCK1
136 : #endif
137 : #ifdef WITH_COMPLEX_SSE_BLOCK2_KERNEL
138 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_SSE_BLOCK2 = ELPA_2STAGE_COMPLEX_SSE_BLOCK2
139 : #endif
140 : #ifdef WITH_COMPLEX_AVX_BLOCK1_KERNEL
141 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_AVX_BLOCK1 = ELPA_2STAGE_COMPLEX_AVX_BLOCK1
142 : #endif
143 : #ifdef WITH_COMPLEX_AVX_BLOCK2_KERNEL
144 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_AVX_BLOCK2 = ELPA_2STAGE_COMPLEX_AVX_BLOCK2
145 : #endif
146 : #ifdef WITH_COMPLEX_AVX2_BLOCK1_KERNEL
147 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_AVX2_BLOCK1 = ELPA_2STAGE_COMPLEX_AVX2_BLOCK1
148 : #endif
149 : #ifdef WITH_COMPLEX_AVX2_BLOCK2_KERNEL
150 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_AVX2_BLOCK2 = ELPA_2STAGE_COMPLEX_AVX2_BLOCK2
151 : #endif
152 : #ifdef WITH_COMPLEX_AVX512_BLOCK1_KERNEL
153 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_AVX512_BLOCK1 = ELPA_2STAGE_COMPLEX_AVX512_BLOCK1
154 : #endif
155 : #ifdef WITH_COMPLEX_AVX512_BLOCK2_KERNEL
156 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_AVX512_BLOCK2 = ELPA_2STAGE_COMPLEX_AVX512_BLOCK2
157 : #endif
158 : #ifdef WITH_GPU_KERNEL
159 : integer(kind=c_int), parameter :: COMPLEX_ELPA_KERNEL_GPU = ELPA_2STAGE_COMPLEX_GPU
160 : #endif
161 :
162 : integer(kind=c_int), parameter :: DEFAULT_COMPLEX_ELPA_KERNEL = ELPA_2STAGE_COMPLEX_DEFAULT
163 :
164 : character(35), parameter, dimension(number_of_real_kernels) :: &
165 : REAL_ELPA_KERNEL_NAMES = (/"REAL_ELPA_KERNEL_GENERIC ", &
166 : "REAL_ELPA_KERNEL_GENERIC_SIMPLE ", &
167 : "REAL_ELPA_KERNEL_BGP ", &
168 : "REAL_ELPA_KERNEL_BGQ ", &
169 : "REAL_ELPA_KERNEL_SSE ", &
170 : "REAL_ELPA_KERNEL_SSE_BLOCK2 ", &
171 : "REAL_ELPA_KERNEL_SSE_BLOCK4 ", &
172 : "REAL_ELPA_KERNEL_SSE_BLOCK6 ", &
173 : "REAL_ELPA_KERNEL_AVX_BLOCK2 ", &
174 : "REAL_ELPA_KERNEL_AVX_BLOCK4 ", &
175 : "REAL_ELPA_KERNEL_AVX_BLOCK6 ", &
176 : "REAL_ELPA_KERNEL_AVX2_BLOCK2 ", &
177 : "REAL_ELPA_KERNEL_AVX2_BLOCK4 ", &
178 : "REAL_ELPA_KERNEL_AVX2_BLOCK6 ", &
179 : "REAL_ELPA_KERNEL_AVX512_BLOCK2 ", &
180 : "REAL_ELPA_KERNEL_AVX512_BLOCK4 ", &
181 : "REAL_ELPA_KERNEL_AVX512_BLOCK6 ", &
182 : "REAL_ELPA_KERNEL_GPU "/)
183 :
184 : character(35), parameter, dimension(number_of_complex_kernels) :: &
185 : COMPLEX_ELPA_KERNEL_NAMES = (/"COMPLEX_ELPA_KERNEL_GENERIC ", &
186 : "COMPLEX_ELPA_KERNEL_GENERIC_SIMPLE ", &
187 : "COMPLEX_ELPA_KERNEL_BGP ", &
188 : "COMPLEX_ELPA_KERNEL_BGQ ", &
189 : "COMPLEX_ELPA_KERNEL_SSE ", &
190 : "COMPLEX_ELPA_KERNEL_SSE_BLOCK1 ", &
191 : "COMPLEX_ELPA_KERNEL_SSE_BLOCK2 ", &
192 : "COMPLEX_ELPA_KERNEL_AVX_BLOCK1 ", &
193 : "COMPLEX_ELPA_KERNEL_AVX_BLOCK2 ", &
194 : "COMPLEX_ELPA_KERNEL_AVX2_BLOCK1 ", &
195 : "COMPLEX_ELPA_KERNEL_AVX2_BLOCK2 ", &
196 : "COMPLEX_ELPA_KERNEL_AVX512_BLOCK1 ", &
197 : "COMPLEX_ELPA_KERNEL_AVX512_BLOCK2 ", &
198 : "COMPLEX_ELPA_KERNEL_GPU "/)
199 :
200 : integer(kind=c_int), parameter :: &
201 : AVAILABLE_REAL_ELPA_KERNELS(number_of_real_kernels) = &
202 : (/ &
203 : #if WITH_REAL_GENERIC_KERNEL
204 : 1 &
205 : #else
206 : 0 &
207 : #endif
208 : #if WITH_REAL_GENERIC_SIMPLE_KERNEL
209 : ,1 &
210 : #else
211 : ,0 &
212 : #endif
213 : #if WITH_REAL_BGP_KERNEL
214 : ,1 &
215 : #else
216 : ,0 &
217 : #endif
218 : #if WITH_REAL_BGQ_KERNEL
219 : ,1 &
220 : #else
221 : ,0 &
222 : #endif
223 : #if WITH_REAL_SSE_ASSEMBLY_KERNEL
224 : ,1 &
225 : #else
226 : ,0 &
227 : #endif
228 : #if WITH_REAL_SSE_BLOCK2_KERNEL
229 : ,1 &
230 : #else
231 : ,0 &
232 : #endif
233 : #if WITH_REAL_SSE_BLOCK4_KERNEL
234 : ,1 &
235 : #else
236 : ,0 &
237 : #endif
238 : #if WITH_REAL_SSE_BLOCK6_KERNEL
239 : ,1 &
240 : #else
241 : ,0 &
242 :
243 : #endif
244 : #if WITH_REAL_AVX_BLOCK2_KERNEL
245 : ,1 &
246 : #else
247 : ,0 &
248 : #endif
249 : #if WITH_REAL_AVX_BLOCK4_KERNEL
250 : ,1 &
251 : #else
252 : ,0 &
253 : #endif
254 : #if WITH_REAL_AVX_BLOCK6_KERNEL
255 : ,1 &
256 : #else
257 : ,0 &
258 : #endif
259 : #if WITH_REAL_AVX2_BLOCK2_KERNEL
260 : ,1 &
261 : #else
262 : ,0 &
263 : #endif
264 : #if WITH_REAL_AVX2_BLOCK4_KERNEL
265 : ,1 &
266 : #else
267 : ,0 &
268 : #endif
269 : #if WITH_REAL_AVX2_BLOCK6_KERNEL
270 : ,1 &
271 : #else
272 : ,0 &
273 : #endif
274 : #if WITH_REAL_AVX512_BLOCK2_KERNEL
275 : ,1 &
276 : #else
277 : ,0 &
278 : #endif
279 : #if WITH_REAL_AVX512_BLOCK4_KERNEL
280 : ,1 &
281 : #else
282 : ,0 &
283 : #endif
284 : #if WITH_REAL_AVX512_BLOCK6_KERNEL
285 : ,1 &
286 : #else
287 : ,0 &
288 : #endif
289 :
290 : #ifdef WITH_GPU_VERSION
291 : ,1 &
292 : #else
293 : ,0 &
294 : #endif
295 : /)
296 :
297 : integer(kind=c_int), parameter :: &
298 : AVAILABLE_COMPLEX_ELPA_KERNELS(number_of_complex_kernels) = &
299 : (/ &
300 : #if WITH_COMPLEX_GENERIC_KERNEL
301 : 1 &
302 : #else
303 : 0 &
304 : #endif
305 : #if WITH_COMPLEX_GENERIC_SIMPLE_KERNEL
306 : ,1 &
307 : #else
308 : ,0 &
309 : #endif
310 : #if WITH_COMPLEX_BGP_KERNEL
311 : ,1 &
312 : #else
313 : ,0 &
314 : #endif
315 : #if WITH_COMPLEX_BGQ_KERNEL
316 : ,1 &
317 : #else
318 : ,0 &
319 : #endif
320 : #if WITH_COMPLEX_SSE_ASSEMBLY_KERNEL
321 : ,1 &
322 : #else
323 : ,0 &
324 : #endif
325 : #if WITH_COMPLEX_SSE_BLOCK1_KERNEL
326 : ,1 &
327 : #else
328 : ,0 &
329 : #endif
330 : #if WITH_COMPLEX_SSE_BLOCK2_KERNEL
331 : ,1 &
332 : #else
333 : ,0 &
334 : #endif
335 : #if WITH_COMPLEX_AVX_BLOCK1_KERNEL
336 : ,1 &
337 : #else
338 : ,0 &
339 : #endif
340 : #if WITH_COMPLEX_AVX_BLOCK2_KERNEL
341 : ,1 &
342 : #else
343 : ,0 &
344 : #endif
345 : #if WITH_COMPLEX_AVX2_BLOCK1_KERNEL
346 : ,1 &
347 : #else
348 : ,0 &
349 : #endif
350 : #if WITH_COMPLEX_AVX2_BLOCK2_KERNEL
351 : ,1 &
352 : #else
353 : ,0 &
354 : #endif
355 : #if WITH_COMPLEX_AVX512_BLOCK1_KERNEL
356 : ,1 &
357 : #else
358 : ,0 &
359 : #endif
360 : #if WITH_COMPLEX_AVX512_BLOCK2_KERNEL
361 : ,1 &
362 : #else
363 : ,0 &
364 : #endif
365 :
366 : #ifdef WITH_GPU_VERSION
367 : ,1 &
368 : #else
369 : ,0 &
370 : #endif
371 : /)
372 :
373 :
374 : contains
375 :
376 :
377 0 : function elpa_real_kernel_name(THIS_ELPA_REAL_KERNEL) result(name)
378 : implicit none
379 :
380 : integer, intent(in) :: THIS_ELPA_REAL_KERNEL
381 : character(35) :: name
382 :
383 :
384 0 : if (AVAILABLE_REAL_ELPA_KERNELS(THIS_ELPA_REAL_KERNEL) .eq. 1) then
385 0 : name = trim(REAL_ELPA_KERNEL_NAMES(THIS_ELPA_REAL_KERNEL))
386 : else
387 0 : name = ""
388 : endif
389 0 : return
390 :
391 : end function
392 :
393 0 : function elpa_complex_kernel_name(THIS_ELPA_COMPLEX_KERNEL) result(name)
394 : implicit none
395 :
396 : integer, intent(in) :: THIS_ELPA_COMPLEX_KERNEL
397 : character(35) :: name
398 :
399 :
400 0 : if (AVAILABLE_COMPLEX_ELPA_KERNELS(THIS_ELPA_COMPLEX_KERNEL) .eq. 1) then
401 0 : name = trim(COMPLEX_ELPA_KERNEL_NAMES(THIS_ELPA_COMPLEX_KERNEL))
402 : else
403 0 : name = ""
404 : endif
405 :
406 0 : return
407 :
408 : end function
409 :
410 : end module elpa2_utilities
|