ergo
functionals.h
Go to the documentation of this file.
1 /* Ergo, version 3.7, a program for linear scaling electronic structure
2  * calculations.
3  * Copyright (C) 2018 Elias Rudberg, Emanuel H. Rubensson, Pawel Salek,
4  * and Anastasia Kruchinina.
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  *
19  * Primary academic reference:
20  * Ergo: An open-source program for linear-scaling electronic structure
21  * calculations,
22  * Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, and Anastasia
23  * Kruchinina,
24  * SoftwareX 7, 107 (2018),
25  * <http://dx.doi.org/10.1016/j.softx.2018.03.005>
26  *
27  * For further information about Ergo, see <http://www.ergoscf.org>.
28  */
29 
30 /*-*-mode: C; c-indentation-style: "bsd"; c-basic-offset: 4; -*-*/
44 #ifndef _FUNCTIONALS_H_
45 #define _FUNCTIONALS_H_
46 
47 /* We need to include config.h to get macro PRECISION_QUAD_FLT128 */
48 #include "config.h"
49 
50 #ifdef PRECISION_QUAD_FLT128
51 #include <quadmath.h>
52 #endif
53 
54 #include "realtype.h"
55 
56 #ifdef __cplusplus
57 #define EXTERN_C extern "C"
58 #else
59 #define EXTERN_C
60 #endif
61 
62 typedef ergo_real real;
63 
64 #if defined(FUNC_PRECISION) && FUNC_PRECISION == 1
65 
66 /* Use single-precision math functions */
67 #define ASINH asinhf
68 #define ATAN atanf
69 #define ERF erff
70 #define EXP expf
71 #define FABS fabsf
72 #define LOG logf
73 #define POW powf
74 #define SQRT sqrtf
75 
76 #elif defined(FUNC_PRECISION) && FUNC_PRECISION == 2
77 
78 /* Use double-precision math functions */
79 #define ASINH asinh
80 #define ATAN atan
81 #define ERF erf
82 #define EXP exp
83 #define FABS fabs
84 #define LOG log
85 #define POW pow
86 #define SQRT sqrt
87 
88 #else
89 
90 #ifdef PRECISION_QUAD_FLT128
91 /* Use quad-precision math functions */
92 #define ASINH asinhq
93 #define ATAN atanq
94 #define ERF erfq
95 #define EXP expq
96 #define FABS fabsq
97 #define LOG logq
98 #define POW powq
99 #define SQRT sqrtq
100 #else
101 /* Use "long double"-precision math functions */
102 #define ASINH asinhl
103 #define ATAN atanl
104 #define ERF erfl
105 #define EXP expl
106 #define FABS fabsl
107 #define LOG logl
108 #define POW powl
109 #define SQRT sqrtl
110 #endif
111 
112 #endif
113 
114 /* FirstDrv: matrix of first order derivatives with respect to two
115  * parameters: density rho and SQUARE of the gradient of density grho.
116  * zeta_i = |\nabla\rho_i|²
117  * mu = |\nabla\rho_\alpha||\nabla\rho_\beta|
118  */
119 typedef struct {
120  real df1000; /* d/drho F */
122  real df0010; /* d/zeta F */
126 
127 /* SecondFuncDrv: this structure is used by functional derivative
128  * evaluation procedures. Do not include "triplet" transformation.
129  */
130 typedef struct {
131  real df1000; /* d/drho_alpha F */
132  real df0100; /* d/drho_beta F */
133  real df0010; /* d/|zeta_alpha| F */
134  real df0001; /* d/|zeta_beta| F */
136  real df2000; /* d/drho_alpha^2 F */
137  real df1100; /* d/(drho_alpha drho_beta) F */
138  real df1010; /* d/drho_alpha d/dzeta_alpha F */
139  real df1001; /* d/drho_alpha d/dzeta_beta F */
141  real df0200; /* d/drho_beta^2 F */
142  real df0110; /* d/drho_beta d/dzeta_alpha F */
143  real df0101; /* d/drho_beta d/dzeta_beta F */
145  real df0020; /* d/dzeta_alpha^2 F */
146  real df0011; /* d2/dzeta_a zeta_b F */
148  real df0002; /* d/dzeta_beta^2 F */
152 
153 
154 /* ThirdFuncDrv: matrix of third derivatives with respect to five
155  parameters: density rho_alpha and SQUARE of the density gradient
156  zeta. and mu.
157 */
158 
159 typedef struct {
160  real df1000; /* d/drho F */
162  real df0010; /* d/|zeta| F */
165 
166  real df2000; /* d/drho_alpha^2 F */
167  real df1100; /* d/(drho_alpha drho_beta) F */
168  real df1010; /* d/drho_alpha d/dzeta_alpha F */
169  real df1001; /* d/drho_alpha d/dzeta_beta F */
171  real df0200; /* d/drho_beta^2 F */
172  real df0110; /* d/drho_beta d/dzeta_alpha F */
173  real df0101; /* d/drho_beta d/dzeta_beta F */
175  real df0020; /* d/dzeta_alpha^2 F */
176  real df0011; /* d2/dzeta_a zeta_b F */
178  real df0002; /* d/dzeta_beta^2 F */
181 
218 
219 
220 typedef struct {
221 
222  /* First order derivatives with respect to all 5 variables */
223 
229 
230  /* Second order mixed derivatives with respect to all 5 variables */
231 
247 
248  /* Third order mixed derivatives with respect to all 5 variables */
249 
285 
286  /* Fourth order mixed derivatives with respect to all 5 variables */
287 
359 
360 
361 typedef struct Functional_ Functional;
362 
364 EXTERN_C enum FunError fun_select_by_name(const char *conf_string);
365 extern Functional *selected_func;
366 extern int (*fun_printf)(const char *fmt, ...);
367 extern void (*fun_set_hf_weight)(real w);
368 extern real (*fun_get_hf_weight)(void);
369 extern void (*fun_set_cam_param)(real w, real b);
370 int dft_get_cam_param(real *alpha, real *beta, real *mu);
371 
372 /* FunDensProp structure contains properties of the density that are
373  needed for functional evaluation and possibly other purposes.
374 */
375 typedef struct FunDensProp_ {
377  real grada, gradb; /* norms of the density gradient, not squares */
378  real gradab; /* scalar product of grada and gradb */
379  /* real current[3] or something may come in the future :-) */
380 } FunDensProp;
381 
382 /* EnergyFunc: the function returning the energy for given densities
383  and gradients. Note that some functionals(like LYP) depend explicitely
384  on separately alpha and beta densities
385 */
386 typedef int (*IsGGAFunc)(void);
387 typedef int (*ReadInputFunc)(const char* conf_string);
388 typedef void (*ReportFunc)(void);
389 typedef real (*EnergyFunc)(const FunDensProp* dens_prop);
390 typedef void (*FirstOrderFun)(FunFirstFuncDrv *ds, real factor,
391  const FunDensProp* dns_prp);
392 
393 typedef void (*SecondOrderFun)(FunSecondFuncDrv *ds, real factor,
394  const FunDensProp* dens_prop);
395 
396 typedef void (*ThirdOrderFun)(FunThirdFuncDrv *ds, real factor,
397  const FunDensProp* dens_prop);
398 typedef void (*FourthOrderFun)(FunFourthFuncDrv *ds, real factor,
399  const FunDensProp *dens_prop);
400 
401 struct Functional_ {
402  const char* name; /* descriptive functional name (usually 5 characters) */
406  /* Only unrestricted implementations are needed. A benchmark for
407  * a CO molecule with 28 basis function reveals a 4% time difference.
408  * This difference will only decrease for larger systems. */
414 };
415 
416 EXTERN_C void drv1_clear(FunFirstFuncDrv* gga); /* set all components to 0 */
417 EXTERN_C void drv2_clear(FunSecondFuncDrv* gga); /* set all components to 0 */
418 EXTERN_C void drv3_clear(FunThirdFuncDrv* gga); /* set all components to 0 */
419 EXTERN_C void drv4_clear(FunFourthFuncDrv* gga); /* set all components to 0 */
420 
421 /* The list of functionals */
422 /* sorted list of generic functionals */
424 extern Functional KTFunctional;
443 
444 /* sorted list of mixed functionals */
469 
470 /* the list of the functionals */
472 
473 extern int fun_true(void);
474 extern int fun_false(void);
475 /* fortran (and not only) functional stub routines */
476 EXTERN_C void dftlistfuncs_(void);
478 int dft_isgga_(void);
479 int dft_isgga__(void);
480 
481 EXTERN_C void dftreport_(void);
482 EXTERN_C int fun_get_cam_param(real *alpha, real *beta, real *mu);
483 
484 #endif /* _FUNCTIONALS_H_ */
real df0001
Definition: functionals.h:134
real df00004
Definition: functionals.h:357
Functional HseFunctional
Definition: fun-cam.c:119
Functional * available_functionals[]
Definition: functionals.c:45
real df0030
Definition: functionals.h:275
real df0010
Definition: functionals.h:133
int(* IsGGAFunc)(void)
Definition: functionals.h:386
Functional OLYPFunctional
Definition: fun-gga.c:111
real rhob
Definition: functionals.h:376
Functional BHandHFunctional
Definition: fun-gga.c:101
real df1110
Definition: functionals.h:188
Definition: functionals.h:363
real df10002
Definition: functionals.h:196
double ergo_real
Definition: realtype.h:69
real df00001
Definition: functionals.h:228
real df1001
Definition: functionals.h:139
real df0011
Definition: functionals.h:146
real df0201
Definition: functionals.h:267
Functional CamFunctional
Definition: fun-cam.c:107
real df1201
Definition: functionals.h:305
real df10011
Definition: functionals.h:195
real df01001
Definition: functionals.h:174
real df0020
Definition: functionals.h:175
real df2001
Definition: functionals.h:185
real df11002
Definition: functionals.h:312
EXTERN_C void dftreport_(void)
dftreport: report the selected functional and its configuration.
Definition: functionals.c:164
real df01011
Definition: functionals.h:205
real df0300
Definition: functionals.h:265
real df0001
Definition: functionals.h:123
int dft_get_cam_param(real *alpha, real *beta, real *mu)
Functional GGAKeyFunctional
Definition: fun-gga.c:107
real df00001
Definition: functionals.h:124
real df0102
Definition: functionals.h:204
real df2000
Definition: functionals.h:166
FirstOrderFun first
Definition: functionals.h:410
real df00201
Definition: functionals.h:209
real df0201
Definition: functionals.h:199
real df1200
Definition: functionals.h:255
EXTERN_C void drv3_clear(FunThirdFuncDrv *gga)
Definition: functionals.c:143
ThirdOrderFun third
Definition: functionals.h:412
real df00012
Definition: functionals.h:215
real df1210
Definition: functionals.h:304
real df0103
Definition: functionals.h:339
real df1100
Definition: functionals.h:233
Functional VWNFunctional
Definition: fun-vwn.c:92
Functional B3LYPFunctional
Definition: fun-gga.c:96
Definition: functionals.h:375
real df0020
Definition: functionals.h:145
SecondOrderFun second
Definition: functionals.h:411
void(* SecondOrderFun)(FunSecondFuncDrv *ds, real factor, const FunDensProp *dens_prop)
Definition: functionals.h:393
real df01111
Definition: functionals.h:337
Functional BLYPFunctional
Definition: fun-gga.c:103
int fun_true(void)
Definition: functionals.c:153
real df20011
Definition: functionals.h:301
real df2101
Definition: functionals.h:295
real df0030
Definition: functionals.h:207
real df0301
Definition: functionals.h:325
real df01102
Definition: functionals.h:338
Functional LDAFunctional
Definition: fun-gga.c:92
real df01001
Definition: functionals.h:144
real df1003
Definition: functionals.h:319
real df00022
Definition: functionals.h:355
real df1000
Definition: functionals.h:131
real df1010
Definition: functionals.h:234
real df10101
Definition: functionals.h:193
Definition: functionals.h:363
real df00211
Definition: functionals.h:347
real df01001
Definition: functionals.h:240
real df01012
Definition: functionals.h:341
real df02002
Definition: functionals.h:332
Functional PbecFunctional
Definition: fun-pbec.c:119
real df00003
Definition: functionals.h:284
Functional VWNIFunctional
Definition: fun-vwn.c:110
real df4000
Definition: functionals.h:288
Definition: functionals.h:119
real df0110
Definition: functionals.h:142
real df10001
Definition: functionals.h:170
real df00201
Definition: functionals.h:277
EXTERN_C void dftlistfuncs_(void)
Definition: functionals.c:173
Functional PbexFunctional
Definition: fun-pbex.c:81
real df01003
Definition: functionals.h:342
Functional PZ81Functional
Definition: fun-pz81.c:49
Functional VWN3Functional
Definition: fun-vwn.c:68
real df30001
Definition: functionals.h:292
const char * name
Definition: functionals.h:402
real df0300
Definition: functionals.h:197
real df00101
Definition: functionals.h:177
real df1001
Definition: functionals.h:169
real df0130
Definition: functionals.h:333
Functional XAlphaFunctional
Definition: fun-gga.c:91
real df00013
Definition: functionals.h:356
real df02101
Definition: functionals.h:329
real(* EnergyFunc)(const FunDensProp *dens_prop)
Definition: functionals.h:389
real df1200
Definition: functionals.h:187
real df2020
Definition: functionals.h:297
Functional LYPFunctional
Definition: fun-lyp.c:53
real df01101
Definition: functionals.h:203
Functional SVWN5Functional
Definition: fun-gga.c:94
real df0021
Definition: functionals.h:208
real df1300
Definition: functionals.h:303
Functional KT1Functional
Definition: fun-gga.c:108
real df00001
Definition: functionals.h:135
real df10201
Definition: functionals.h:315
real gradab
Definition: functionals.h:378
real df03001
Definition: functionals.h:326
real df1101
Definition: functionals.h:189
real df10111
Definition: functionals.h:317
ergo_real real
Definition: test.cc:46
real df00021
Definition: functionals.h:282
real df0003
Definition: functionals.h:213
EXTERN_C void drv2_clear(FunSecondFuncDrv *gga)
Definition: functionals.c:137
real df3000
Definition: functionals.h:250
Functional PW92cFunctional
Definition: fun-pw92c.c:131
Functional B3P86Functional
Definition: fun-gga.c:98
real df00101
Definition: functionals.h:147
real df20001
Definition: functionals.h:254
Functional Pw91cFunctional
Definition: fun-pw91c.c:109
real df01011
Definition: functionals.h:273
real(* fun_get_hf_weight)(void)
Definition: functionals.c:109
void(* FourthOrderFun)(FunFourthFuncDrv *ds, real factor, const FunDensProp *dens_prop)
Definition: functionals.h:398
Functional CombineFunctional
Definition: fun-gga.c:106
real df2100
Definition: functionals.h:183
struct FunDensProp_ FunDensProp
real df10003
Definition: functionals.h:322
Functional BPW91Functional
Definition: fun-gga.c:105
EnergyFunc func
Definition: functionals.h:409
real df0100
Definition: functionals.h:161
real df00002
Definition: functionals.h:246
real df10002
Definition: functionals.h:264
real df0002
Definition: functionals.h:148
real df0111
Definition: functionals.h:270
Functional * selected_func
Definition: functionals.c:106
real df0200
Definition: functionals.h:141
Definition of the main floating-point datatype used; the ergo_real type.
real df00111
Definition: functionals.h:211
real df02011
Definition: functionals.h:331
ReportFunc report
Definition: functionals.h:405
real df1102
Definition: functionals.h:310
real df01021
Definition: functionals.h:340
void(* ThirdOrderFun)(FunThirdFuncDrv *ds, real factor, const FunDensProp *dens_prop)
Definition: functionals.h:396
Functional BHandHLYPFunctional
Definition: fun-gga.c:102
real df0001
Definition: functionals.h:163
real df1012
Definition: functionals.h:316
real df2010
Definition: functionals.h:184
Functional BeckeFunctional
Definition: fun-becke.c:62
real df00012
Definition: functionals.h:283
Functional B3P86GFunctional
Definition: fun-gga.c:99
real df00101
Definition: functionals.h:243
real df0101
Definition: functionals.h:143
Functional SlaterFunctional
Definition: fun-slater.c:57
real df0013
Definition: functionals.h:349
real df3100
Definition: functionals.h:289
real df00102
Definition: functionals.h:212
real df2011
Definition: functionals.h:298
real df0210
Definition: functionals.h:198
real df00102
Definition: functionals.h:280
real df00301
Definition: functionals.h:345
real df1021
Definition: functionals.h:314
real grada
Definition: functionals.h:377
real df0100
Definition: functionals.h:132
real df0121
Definition: functionals.h:334
real df0110
Definition: functionals.h:238
real rhoa
Definition: functionals.h:376
Functional OPTXFunctional
Definition: fun-optx.c:60
real df1001
Definition: functionals.h:235
Functional Pw91xFunctional
Definition: fun-pw91x.c:96
FourthOrderFun fourth
Definition: functionals.h:413
real df2000
Definition: functionals.h:232
real df21001
Definition: functionals.h:296
void(* ReportFunc)(void)
Definition: functionals.h:388
int(* ReadInputFunc)(const char *conf_string)
Definition: functionals.h:387
real df0040
Definition: functionals.h:343
IsGGAFunc is_gga
Definition: functionals.h:403
real df00011
Definition: functionals.h:245
real df0021
Definition: functionals.h:276
real gradb
Definition: functionals.h:377
real df0012
Definition: functionals.h:278
real df1010
Definition: functionals.h:138
real df0202
Definition: functionals.h:330
Functional VWN3IFunctional
Definition: fun-vwn.c:127
ReadInputFunc read
Definition: functionals.h:404
int dft_isgga__(void)
Definition: functionals.c:196
real df0002
Definition: functionals.h:244
real df0022
Definition: functionals.h:346
real df0120
Definition: functionals.h:269
real df1011
Definition: functionals.h:260
real df0100
Definition: functionals.h:225
EXTERN_C void drv1_clear(FunFirstFuncDrv *gga)
Definition: functionals.c:131
real df0001
Definition: functionals.h:227
real df11011
Definition: functionals.h:311
real df0012
Definition: functionals.h:210
real df0031
Definition: functionals.h:344
real df11101
Definition: functionals.h:309
real df1030
Definition: functionals.h:313
real df01201
Definition: functionals.h:335
real df3001
Definition: functionals.h:291
real df00121
Definition: functionals.h:350
real df1111
Definition: functionals.h:308
real df3000
Definition: functionals.h:182
real df3010
Definition: functionals.h:290
real df00031
Definition: functionals.h:354
real df00021
Definition: functionals.h:214
real df1000
Definition: functionals.h:160
real df2110
Definition: functionals.h:294
void(* fun_set_hf_weight)(real w)
Definition: functionals.c:108
void(* FirstOrderFun)(FunFirstFuncDrv *ds, real factor, const FunDensProp *dns_prp)
Definition: functionals.h:390
real df0003
Definition: functionals.h:281
#define EXTERN_C
Definition: functionals.h:59
real df11001
Definition: functionals.h:190
real df1000
Definition: functionals.h:120
Functional KT2Functional
Definition: fun-gga.c:109
Definition: functionals.h:159
real df00002
Definition: functionals.h:180
real df2002
Definition: functionals.h:300
real df0220
Definition: functionals.h:327
Functional VWN5Functional
Definition: fun-vwn.c:79
real df10102
Definition: functionals.h:318
real df00112
Definition: functionals.h:351
real df0200
Definition: functionals.h:237
Functional P86cFunctional
Definition: fun-p86c.c:89
int fun_false(void)
Definition: functionals.c:154
real df1100
Definition: functionals.h:137
real df0211
Definition: functionals.h:328
real df2100
Definition: functionals.h:251
EXTERN_C void dftlistfuncs_using_printf_(void)
Definition: functionals.c:182
Functional Camb3lypFunctional
Definition: fun-cam.c:95
real df02001
Definition: functionals.h:200
real df2000
Definition: functionals.h:136
real df20001
Definition: functionals.h:186
EXTERN_C int fun_get_cam_param(real *alpha, real *beta, real *mu)
Definition: fun-cam.c:1367
real df00103
Definition: functionals.h:352
real df0100
Definition: functionals.h:121
Functional B3LYPGaussFunctional
Definition: fun-gga.c:97
real df1002
Definition: functionals.h:194
real df0010
Definition: functionals.h:226
real df2010
Definition: functionals.h:252
real df20101
Definition: functionals.h:299
Functional LB94Functional
Definition: fun-lb94.c:64
real df0010
Definition: functionals.h:162
Functional PW86xFunctional
Definition: fun-pw86x.c:50
Functional SVWN3Functional
Definition: fun-gga.c:95
real df00002
Definition: functionals.h:150
real df12001
Definition: functionals.h:306
real df1020
Definition: functionals.h:259
real df1011
Definition: functionals.h:192
real df10101
Definition: functionals.h:261
real df1020
Definition: functionals.h:191
real df00011
Definition: functionals.h:149
Functional BP86Functional
Definition: fun-gga.c:104
EXTERN_C enum FunError fun_select_by_name(const char *conf_string)
Definition: functionals.c:114
real df2200
Definition: functionals.h:293
real df2001
Definition: functionals.h:253
real df10012
Definition: functionals.h:321
real df1002
Definition: functionals.h:262
real df0101
Definition: functionals.h:239
real df00001
Definition: functionals.h:164
real df0004
Definition: functionals.h:353
real df0210
Definition: functionals.h:266
real df01002
Definition: functionals.h:274
Functional KTFunctional
Definition: fun-kt.c:68
real df0011
Definition: functionals.h:176
ergo_real real
Definition: functionals.h:62
real df1010
Definition: functionals.h:168
Functional PBEFunctional
Definition: fun-gga.c:113
Definition: functionals.h:363
real df10001
Definition: functionals.h:236
real df0011
Definition: functionals.h:242
real df0200
Definition: functionals.h:171
Functional B3PW91Functional
Definition: fun-gga.c:100
real df00011
Definition: functionals.h:179
real df0310
Definition: functionals.h:324
real df1110
Definition: functionals.h:256
real df1000
Definition: functionals.h:224
real df0101
Definition: functionals.h:173
Functional PBE0Functional
Definition: fun-gga.c:112
Definition: functionals.h:401
real df10021
Definition: functionals.h:320
real df0120
Definition: functionals.h:201
EXTERN_C void drv4_clear(FunFourthFuncDrv *gga)
Definition: functionals.c:148
Functional KT3Functional
Definition: fun-gga.c:110
int dft_isgga_(void)
Definition: functionals.c:192
real df01101
Definition: functionals.h:271
real df0010
Definition: functionals.h:122
real df0110
Definition: functionals.h:172
real df1100
Definition: functionals.h:167
real df01002
Definition: functionals.h:206
real df0002
Definition: functionals.h:178
real df20002
Definition: functionals.h:302
real df0112
Definition: functionals.h:336
real df1101
Definition: functionals.h:257
real df00003
Definition: functionals.h:216
Definition: functionals.h:130
Definition: functionals.h:220
real df10011
Definition: functionals.h:263
real df0111
Definition: functionals.h:202
real df02001
Definition: functionals.h:268
int(* fun_printf)(const char *fmt,...)
Definition: functionals.c:107
real df10001
Definition: functionals.h:140
void(* fun_set_cam_param)(real w, real b)
Definition: functionals.c:110
real df0020
Definition: functionals.h:241
real df0400
Definition: functionals.h:323
real df00202
Definition: functionals.h:348
FunError
Definition: functionals.h:363
real df0102
Definition: functionals.h:272
real df00111
Definition: functionals.h:279
real df11001
Definition: functionals.h:258
real df1120
Definition: functionals.h:307