Eigenvalue SoLvers for Petaflop-Applications (ELPA)  2017.11.001
elpa_index.h
Go to the documentation of this file.
1 /*
2 !
3 ! Copyright 2017, L. Hüdepohl and A. Marek, MPCDF
4 !
5 ! This file is part of ELPA.
6 !
7 ! The ELPA library was originally created by the ELPA consortium,
8 ! consisting of the following organizations:
9 !
10 ! - Max Planck Computing and Data Facility (MPCDF), formerly known as
11 ! Rechenzentrum Garching der Max-Planck-Gesellschaft (RZG),
12 ! - Bergische Universität Wuppertal, Lehrstuhl für angewandte
13 ! Informatik,
14 ! - Technische Universität München, Lehrstuhl für Informatik mit
15 ! Schwerpunkt Wissenschaftliches Rechnen ,
16 ! - Fritz-Haber-Institut, Berlin, Abt. Theorie,
17 ! - Max-Plack-Institut für Mathematik in den Naturwissenschaften,
18 ! Leipzig, Abt. Komplexe Strukutren in Biologie und Kognition,
19 ! and
20 ! - IBM Deutschland GmbH
21 !
22 ! This particular source code file contains additions, changes and
23 ! enhancements authored by Intel Corporation which is not part of
24 ! the ELPA consortium.
25 !
26 ! More information can be found here:
27 ! http://elpa.mpcdf.mpg.de/
28 !
29 ! ELPA is free software: you can redistribute it and/or modify
30 ! it under the terms of the version 3 of the license of the
31 ! GNU Lesser General Public License as published by the Free
32 ! Software Foundation.
33 !
34 ! ELPA is distributed in the hope that it will be useful,
35 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
36 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
37 ! GNU Lesser General Public License for more details.
38 !
39 ! You should have received a copy of the GNU Lesser General Public License
40 ! along with ELPA. If not, see <http://www.gnu.org/licenses/>
41 !
42 ! ELPA reflects a substantial effort on the part of the original
43 ! ELPA consortium, and we ask you to respect the spirit of the
44 ! license that we chose: i.e., please contribute any changes you
45 ! may have back to the original ELPA library distribution, and keep
46 ! any derivatives of ELPA under the same license that we chose for
47 ! the original distribution, the GNU Lesser General Public License.
48 !
49 */
50 #pragma once
51 #include <stdlib.h>
52 #include <stdio.h>
53 #include <string.h>
54 #include <search.h>
55 #include <math.h>
56 
57 #include "config.h"
58 #include <elpa/elpa.h>
59 
60 #define nelements(x) (sizeof(x)/sizeof(x[0]))
61 
62 #define FOR_ALL_TYPES(X) \
63  X(int, "%d", -1) \
64  X(double, "%g", NAN)
65 
66 /* A simple structure for storing values to a pre-set
67  * number of keys */
68 
69 /* Forward declaration of configuration structure */
71 
72 /* Function type for the cardinality */
73 typedef int (*elpa_index_cardinality_t)(void);
74 
75 /* Function type to enumerate all possible values, starting from 0 */
76 typedef int (*elpa_index_enumerate_int_option_t)(int i);
77 
78 /* Function types to check the validity of a value */
79 typedef int (*elpa_index_valid_int_t)(elpa_index_t index, int n, int new_value);
80 typedef int (*elpa_index_valid_double_t)(elpa_index_t index, int n, double new_value);
81 
82 /* Function type to give a string representation of a value */
83 typedef const char* (*elpa_index_to_string_int_t)(int n);
84 
85 
86 typedef struct {
87  char *name;
88  char *description;
89  char *env_default;
90  char *env_force;
91  int once;
92  int readonly;
94 
95 
96 typedef struct {
106 
107 
108 typedef struct {
113 
117 };
118 
120 #define STRUCT_MEMBERS(TYPE, ...) \
121  struct { \
122  TYPE *values; \
123  int *is_set; \
124  int *notified; \
125  } TYPE##_options;
127 };
128 
129 
130 /*
131  !f> interface
132  !f> function elpa_index_instance_c() result(index) bind(C, name="elpa_index_instance")
133  !f> import c_ptr
134  !f> type(c_ptr) :: index
135  !f> end function
136  !f> end interface
137  */
138 elpa_index_t elpa_index_instance();
139 
140 
141 /*
142  !f> interface
143  !f> subroutine elpa_index_free_c(index) bind(C, name="elpa_index_free")
144  !f> import c_ptr
145  !f> type(c_ptr), value :: index
146  !f> end subroutine
147  !f> end interface
148  */
149 void elpa_index_free(elpa_index_t index);
150 
151 
152 /*
153  !f> interface
154  !f> function elpa_index_get_int_value_c(index, name, success) result(value) &
155  !f> bind(C, name="elpa_index_get_int_value")
156  !f> import c_ptr, c_int, c_char
157  !f> type(c_ptr), value :: index
158  !f> character(kind=c_char), intent(in) :: name(*)
159  !f>#ifdef USE_FORTRAN2008
160  !f> integer(kind=c_int), optional, intent(out) :: success
161  !f>#else
162  !f> integer(kind=c_int), intent(out) :: success
163  !f>#endif
164  !f> integer(kind=c_int) :: value
165  !f> end function
166  !f> end interface
167  */
168 int elpa_index_get_int_value(elpa_index_t index, char *name, int *success);
169 
170 
171 /*
172  !f> interface
173  !f> function elpa_index_set_int_value_c(index, name, value) result(success) &
174  !f> bind(C, name="elpa_index_set_int_value")
175  !f> import c_ptr, c_int, c_char
176  !f> type(c_ptr), value :: index
177  !f> character(kind=c_char), intent(in) :: name(*)
178  !f> integer(kind=c_int),intent(in), value :: value
179  !f> integer(kind=c_int) :: success
180  !f> end function
181  !f> end interface
182  */
183 int elpa_index_set_int_value(elpa_index_t index, char *name, int value);
184 
185 
186 /*
187  !f> interface
188  !f> function elpa_index_int_value_is_set_c(index, name) result(success) bind(C, name="elpa_index_int_value_is_set")
189  !f> import c_ptr, c_int, c_char
190  !f> type(c_ptr), value :: index
191  !f> character(kind=c_char), intent(in) :: name(*)
192  !f> integer(kind=c_int) :: success
193  !f> end function
194  !f> end interface
195  */
196 int elpa_index_int_value_is_set(elpa_index_t index, char *name);
197 
198 
199 /*
200  !f> interface
201  !f> function elpa_index_get_int_loc_c(index, name) result(loc) bind(C, name="elpa_index_get_int_loc")
202  !f> import c_ptr, c_char
203  !f> type(c_ptr), value :: index
204  !f> character(kind=c_char), intent(in) :: name(*)
205  !f> type(c_ptr) :: loc
206  !f> end function
207  !f> end interface
208  */
209 int* elpa_index_get_int_loc(elpa_index_t index, char *name);
210 
211 
212 /*
213  !f> interface
214  !f> function elpa_index_get_double_value_c(index, name, success) result(value) bind(C, name="elpa_index_get_double_value")
215  !f> import c_ptr, c_int, c_double, c_char
216  !f> type(c_ptr), value :: index
217  !f> character(kind=c_char), intent(in) :: name(*)
218  !f>#ifdef USE_FORTRAN2008
219  !f> integer(kind=c_int), intent(out), optional :: success
220  !f>#else
221  !f> integer(kind=c_int), intent(out) :: success
222  !f>#endif
223  !f> real(kind=c_double) :: value
224  !f> end function
225  !f> end interface
226  */
227 double elpa_index_get_double_value(elpa_index_t index, char *name, int *success);
228 
229 
230 /*
231  !f> interface
232  !f> function elpa_index_set_double_value_c(index, name, value) result(success) &
233  !f> bind(C, name="elpa_index_set_double_value")
234  !f> import c_ptr, c_int, c_double, c_char
235  !f> type(c_ptr), value :: index
236  !f> character(kind=c_char), intent(in) :: name(*)
237  !f> real(kind=c_double),intent(in), value :: value
238  !f> integer(kind=c_int) :: success
239  !f> end function
240  !f> end interface
241  */
242 int elpa_index_set_double_value(elpa_index_t index, char *name, double value);
243 
244 
245 /*
246  !f> interface
247  !f> function elpa_index_double_value_is_set_c(index, name) result(success) &
248  !f> bind(C, name="elpa_index_double_value_is_set")
249  !f> import c_ptr, c_int, c_char
250  !f> type(c_ptr), value :: index
251  !f> character(kind=c_char), intent(in) :: name(*)
252  !f> integer(kind=c_int) :: success
253  !f> end function
254  !f> end interface
255  */
256 int elpa_index_double_value_is_set(elpa_index_t index, char *name);
257 
258 
259 /*
260  !f> interface
261  !f> function elpa_index_get_double_loc_c(index, name) result(loc) bind(C, name="elpa_index_get_double_loc")
262  !f> import c_ptr, c_char
263  !f> type(c_ptr), value :: index
264  !f> character(kind=c_char), intent(in) :: name(*)
265  !f> type(c_ptr) :: loc
266  !f> end function
267  !f> end interface
268  */
269 double* elpa_index_get_double_loc(elpa_index_t index, char *name);
270 
271 
272 /*
273  !f> interface
274  !f> function elpa_index_value_is_set_c(index, name) result(success) bind(C, name="elpa_index_value_is_set")
275  !f> import c_ptr, c_int, c_char
276  !f> type(c_ptr), value :: index
277  !f> character(kind=c_char), intent(in) :: name(*)
278  !f> integer(kind=c_int) :: success
279  !f> end function
280  !f> end interface
281  */
282 int elpa_index_value_is_set(elpa_index_t index, char *name);
283 
284 
285 /*
286  !pf> interface
287  !pf> function elpa_int_value_to_string_c(name, value, string) &
288  !pf> result(error) bind(C, name="elpa_int_value_to_string")
289  !pf> import c_int, c_ptr, c_char
290  !pf> character(kind=c_char), intent(in) :: name(*)
291  !pf> integer(kind=c_int), intent(in), value :: value
292  !pf> type(c_ptr), intent(out) :: string
293  !pf> integer(kind=c_int) :: error
294  !pf> end function
295  !pf> end interface
296  !pf>
297  */
298 int elpa_int_value_to_string(char *name, int value, const char **string);
299 
300 
301 /*
302  !pf> interface
303  !pf> pure function elpa_int_value_to_strlen_c(name, value) &
304  !pf> result(length) bind(C, name="elpa_int_value_to_strlen")
305  !pf> import c_int, c_ptr, c_char
306  !pf> character(kind=c_char), intent(in) :: name(*)
307  !pf> integer(kind=c_int), intent(in), value :: value
308  !pf> integer(kind=c_int) :: length
309  !pf> end function
310  !pf> end interface
311  !pf>
312  */
313 int elpa_int_value_to_strlen(char *name, int value);
314 
315 
316 /*
317  !f> interface
318  !f> pure function elpa_index_int_value_to_strlen_c(index, name) &
319  !f> result(length) bind(C, name="elpa_index_int_value_to_strlen")
320  !f> import c_int, c_ptr, c_char
321  !f> type(c_ptr), intent(in), value :: index
322  !f> character(kind=c_char), intent(in) :: name(*)
323  !f> integer(kind=c_int) :: length
324  !f> end function
325  !f> end interface
326  !f>
327  */
328 int elpa_index_int_value_to_strlen(elpa_index_t index, char *name);
329 
330 
331 /*
332  !f> interface
333  !f> function elpa_int_string_to_value_c(name, string, value) result(error) bind(C, name="elpa_int_string_to_value")
334  !f> import c_int, c_ptr, c_char
335  !f> character(kind=c_char), intent(in) :: name(*)
336  !f> character(kind=c_char), intent(in) :: string(*)
337  !f> integer(kind=c_int), intent(out) :: value
338  !f> integer(kind=c_int) :: error
339  !f> end function
340  !f> end interface
341  !f>
342  */
343 int elpa_int_string_to_value(char *name, char *string, int *value);
344 
345 
346 /*
347  !f> interface
348  !f> function elpa_option_cardinality_c(name) result(n) bind(C, name="elpa_option_cardinality")
349  !f> import c_int, c_char
350  !f> character(kind=c_char), intent(in) :: name(*)
351  !f> integer(kind=c_int) :: n
352  !f> end function
353  !f> end interface
354  !f>
355  */
356 int elpa_option_cardinality(char *name);
357 
358 /*
359  !f> interface
360  !f> function elpa_option_enumerate_c(name, i) result(value) bind(C, name="elpa_option_enumerate")
361  !f> import c_int, c_char
362  !f> character(kind=c_char), intent(in) :: name(*)
363  !f> integer(kind=c_int), intent(in), value :: i
364  !f> integer(kind=c_int) :: value
365  !f> end function
366  !f> end interface
367  !f>
368  */
369 int elpa_option_enumerate(char *name, int i);
370 
371 
372 /*
373  !f> interface
374  !f> function elpa_index_int_is_valid_c(index, name, new_value) result(success) &
375  !f> bind(C, name="elpa_index_int_is_valid")
376  !f> import c_int, c_ptr, c_char
377  !f> type(c_ptr), intent(in), value :: index
378  !f> character(kind=c_char), intent(in) :: name(*)
379  !f> integer(kind=c_int), intent(in), value :: new_value
380  !f> integer(kind=c_int) :: success
381  !f> end function
382  !f> end interface
383  !f>
384  */
385 int elpa_index_int_is_valid(elpa_index_t index, char *name, int new_value);
386 
387 
388 /*
389  !f> interface
390  !f> function elpa_index_autotune_cardinality_c(index, autotune_level, autotune_domain) result(n) &
391  !f> bind(C, name="elpa_index_autotune_cardinality")
392  !f> import c_int, c_ptr, c_char
393  !f> type(c_ptr), intent(in), value :: index
394  !f> integer(kind=c_int), intent(in), value :: autotune_level, autotune_domain
395  !f> integer(kind=c_int) :: n
396  !f> end function
397  !f> end interface
398  !f>
399  */
400 int elpa_index_autotune_cardinality(elpa_index_t index, int autotune_level, int autotune_domain);
401 
402 
403 /*
404  !f> interface
405  !f> function elpa_index_set_autotune_parameters_c(index, autotune_level, autotune_domain, n) result(success) &
406  !f> bind(C, name="elpa_index_set_autotune_parameters")
407  !f> import c_int, c_ptr, c_char
408  !f> type(c_ptr), intent(in), value :: index
409  !f> integer(kind=c_int), intent(in), value :: autotune_level, autotune_domain, n
410  !f> integer(kind=c_int) :: success
411  !f> end function
412  !f> end interface
413  !f>
414  */
415 int elpa_index_set_autotune_parameters(elpa_index_t index, int autotune_level, int autotune_domain, int n);
Definition: elpa_index.h:96
int elpa_index_int_value_is_set(elpa_index_t index, char *name)
int elpa_index_set_autotune_parameters(elpa_index_t index, int autotune_level, int autotune_domain, int n)
#define FOR_ALL_TYPES(X)
Definition: elpa_index.h:62
int(* elpa_index_valid_int_t)(elpa_index_t index, int n, int new_value)
Definition: elpa_index.h:79
int autotune_domain
Definition: elpa_index.h:100
elpa_index_t elpa_index_instance()
int elpa_index_value_is_set(elpa_index_t index, char *name)
int elpa_index_set_int_value(elpa_index_t index, char *name, int value)
Definition: elpa_index.h:115
elpa_index_valid_double_t valid
Definition: elpa_index.h:111
int autotune_level
Definition: elpa_index.h:99
int elpa_index_double_value_is_set(elpa_index_t index, char *name)
double * elpa_index_get_double_loc(elpa_index_t index, char *name)
int elpa_int_string_to_value(char *name, char *string, int *value)
elpa_index_to_string_int_t to_string
Definition: elpa_index.h:104
elpa_index_cardinality_t cardinality
Definition: elpa_index.h:102
double elpa_index_get_double_value(elpa_index_t index, char *name, int *success)
Definition: elpa_index.h:116
int(* elpa_index_valid_double_t)(elpa_index_t index, int n, double new_value)
Definition: elpa_index.h:80
elpa_index_entry_t base
Definition: elpa_index.h:109
int elpa_index_int_is_valid(elpa_index_t index, char *name, int new_value)
int default_value
Definition: elpa_index.h:98
int elpa_index_autotune_cardinality(elpa_index_t index, int autotune_level, int autotune_domain)
Definition: elpa_index.h:119
Definition: elpa_index.h:86
#define STRUCT_MEMBERS(TYPE,...)
Definition: elpa_index.h:120
void elpa_index_free(elpa_index_t index)
elpa_index_entry_t base
Definition: elpa_index.h:97
int(* elpa_index_enumerate_int_option_t)(int i)
Definition: elpa_index.h:76
int * elpa_index_get_int_loc(elpa_index_t index, char *name)
int(* elpa_index_cardinality_t)(void)
Definition: elpa_index.h:73
int elpa_index_get_int_value(elpa_index_t index, char *name, int *success)
struct elpa_index_struct * elpa_index_t
Definition: elpa_index.h:70
int once
Definition: elpa_index.h:91
double default_value
Definition: elpa_index.h:110
char * env_default
Definition: elpa_index.h:89
elpa_index_valid_int_t valid
Definition: elpa_index.h:101
Definition: elpa_index.h:108
int elpa_index_set_double_value(elpa_index_t index, char *name, double value)
char * env_force
Definition: elpa_index.h:90
NOTIFY_FLAGS
Definition: elpa_index.h:114
char * description
Definition: elpa_index.h:88
int readonly
Definition: elpa_index.h:92
int elpa_int_value_to_string(char *name, int value, const char **string)
elpa_index_enumerate_int_option_t enumerate
Definition: elpa_index.h:103
const char *(* elpa_index_to_string_int_t)(int n)
Definition: elpa_index.h:83
int elpa_index_int_value_to_strlen(elpa_index_t index, char *name)
char * name
Definition: elpa_index.h:87
int elpa_option_enumerate(char *name, int i)
int elpa_option_cardinality(char *name)
int elpa_int_value_to_strlen(char *name, int value)