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