ergo
functionals.h
Go to the documentation of this file.
1/* Ergo, version 3.8.2, a program for linear scaling electronic structure
2 * calculations.
3 * Copyright (C) 2023 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
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 */
119typedef 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 */
130typedef 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
159typedef 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
220typedef 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
361typedef struct Functional_ Functional;
362
364EXTERN_C enum FunError fun_select_by_name(const char *conf_string);
366extern int (*fun_printf)(const char *fmt, ...);
367extern void (*fun_set_hf_weight)(real w);
368extern real (*fun_get_hf_weight)(void);
369extern void (*fun_set_cam_param)(real w, real b);
370int 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*/
375typedef 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 :-) */
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*/
386typedef int (*IsGGAFunc)(void);
387typedef int (*ReadInputFunc)(const char* conf_string);
388typedef void (*ReportFunc)(void);
389typedef real (*EnergyFunc)(const FunDensProp* dens_prop);
390typedef void (*FirstOrderFun)(FunFirstFuncDrv *ds, real factor,
391 const FunDensProp* dns_prp);
392
393typedef void (*SecondOrderFun)(FunSecondFuncDrv *ds, real factor,
394 const FunDensProp* dens_prop);
395
396typedef void (*ThirdOrderFun)(FunThirdFuncDrv *ds, real factor,
397 const FunDensProp* dens_prop);
398typedef void (*FourthOrderFun)(FunFourthFuncDrv *ds, real factor,
399 const FunDensProp *dens_prop);
400
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
416EXTERN_C void drv1_clear(FunFirstFuncDrv* gga); /* set all components to 0 */
417EXTERN_C void drv2_clear(FunSecondFuncDrv* gga); /* set all components to 0 */
418EXTERN_C void drv3_clear(FunThirdFuncDrv* gga); /* set all components to 0 */
419EXTERN_C void drv4_clear(FunFourthFuncDrv* gga); /* set all components to 0 */
420
421/* The list of functionals */
422/* sorted list of generic functionals */
443
444/* sorted list of mixed functionals */
469
470/* the list of the functionals */
472
473extern int fun_true(void);
474extern int fun_false(void);
475/* fortran (and not only) functional stub routines */
476EXTERN_C void dftlistfuncs_(void);
478int dft_isgga_(void);
479int dft_isgga__(void);
480
481EXTERN_C void dftreport_(void);
482EXTERN_C int fun_get_cam_param(real *alpha, real *beta, real *mu);
483
484#endif /* _FUNCTIONALS_H_ */
ergo_real real
Definition test.cc:46
void(* FourthOrderFun)(FunFourthFuncDrv *ds, real factor, const FunDensProp *dens_prop)
Definition functionals.h:398
Functional SlaterFunctional
Definition fun-slater.c:57
EXTERN_C void dftlistfuncs_(void)
Definition functionals.c:173
Functional OPTXFunctional
Definition fun-optx.c:60
void(* fun_set_cam_param)(real w, real b)
Definition functionals.c:110
real(* EnergyFunc)(const FunDensProp *dens_prop)
Definition functionals.h:389
Functional * selected_func
Definition functionals.c:106
Functional P86cFunctional
Definition fun-p86c.c:89
Functional CombineFunctional
Definition fun-gga.c:106
Functional BLYPFunctional
Definition fun-gga.c:103
void(* fun_set_hf_weight)(real w)
Definition functionals.c:108
Functional GGAKeyFunctional
Definition fun-gga.c:107
Functional Pw91xFunctional
Definition fun-pw91x.c:96
Functional * available_functionals[]
Definition functionals.c:45
int(* ReadInputFunc)(const char *conf_string)
Definition functionals.h:387
int dft_get_cam_param(real *alpha, real *beta, real *mu)
EXTERN_C void drv4_clear(FunFourthFuncDrv *gga)
Definition functionals.c:148
int(* fun_printf)(const char *fmt,...)
Definition functionals.c:107
Functional SVWN5Functional
Definition fun-gga.c:94
Functional KT3Functional
Definition fun-gga.c:110
EXTERN_C int fun_get_cam_param(real *alpha, real *beta, real *mu)
Definition fun-cam.c:1367
Functional VWNFunctional
Definition fun-vwn.c:92
Functional VWN5Functional
Definition fun-vwn.c:79
void(* ReportFunc)(void)
Definition functionals.h:388
Functional BP86Functional
Definition fun-gga.c:104
Functional PW92cFunctional
Definition fun-pw92c.c:131
void(* SecondOrderFun)(FunSecondFuncDrv *ds, real factor, const FunDensProp *dens_prop)
Definition functionals.h:393
Functional PbecFunctional
Definition fun-pbec.c:119
int(* IsGGAFunc)(void)
Definition functionals.h:386
Functional PW86xFunctional
Definition fun-pw86x.c:50
Functional KTFunctional
Definition fun-kt.c:68
Functional BPW91Functional
Definition fun-gga.c:105
Functional KT1Functional
Definition fun-gga.c:108
void(* ThirdOrderFun)(FunThirdFuncDrv *ds, real factor, const FunDensProp *dens_prop)
Definition functionals.h:396
Functional HseFunctional
Definition fun-cam.c:119
real(* fun_get_hf_weight)(void)
Definition functionals.c:109
void(* FirstOrderFun)(FunFirstFuncDrv *ds, real factor, const FunDensProp *dns_prp)
Definition functionals.h:390
Functional VWN3Functional
Definition fun-vwn.c:68
Functional LDAFunctional
Definition fun-gga.c:92
Functional B3LYPFunctional
Definition fun-gga.c:96
Functional XAlphaFunctional
Definition fun-gga.c:91
EXTERN_C enum FunError fun_select_by_name(const char *conf_string)
Definition functionals.c:114
EXTERN_C void dftlistfuncs_using_printf_(void)
Definition functionals.c:182
Functional Camb3lypFunctional
Definition fun-cam.c:95
Functional VWNIFunctional
Definition fun-vwn.c:110
Functional B3P86Functional
Definition fun-gga.c:98
ergo_real real
Definition functionals.h:62
EXTERN_C void drv3_clear(FunThirdFuncDrv *gga)
Definition functionals.c:143
Functional VWN3IFunctional
Definition fun-vwn.c:127
EXTERN_C void dftreport_(void)
dftreport: report the selected functional and its configuration.
Definition functionals.c:164
Functional Pw91cFunctional
Definition fun-pw91c.c:109
Functional B3PW91Functional
Definition fun-gga.c:100
struct FunDensProp_ FunDensProp
#define EXTERN_C
Definition functionals.h:59
int dft_isgga__(void)
Definition functionals.c:196
Functional LYPFunctional
Definition fun-lyp.c:53
Functional OLYPFunctional
Definition fun-gga.c:111
Functional CamFunctional
Definition fun-cam.c:107
EXTERN_C void drv1_clear(FunFirstFuncDrv *gga)
Definition functionals.c:131
Functional PZ81Functional
Definition fun-pz81.c:49
EXTERN_C void drv2_clear(FunSecondFuncDrv *gga)
Definition functionals.c:137
Functional BeckeFunctional
Definition fun-becke.c:62
Functional PBE0Functional
Definition fun-gga.c:112
int fun_true(void)
Definition functionals.c:153
Functional B3LYPGaussFunctional
Definition fun-gga.c:97
Functional KT2Functional
Definition fun-gga.c:109
Functional PbexFunctional
Definition fun-pbex.c:81
Functional B3P86GFunctional
Definition fun-gga.c:99
Functional PBEFunctional
Definition fun-gga.c:113
FunError
Definition functionals.h:363
@ FUN_CONF_ERROR
Definition functionals.h:363
@ FUN_UNKNOWN
Definition functionals.h:363
@ FUN_OK
Definition functionals.h:363
int dft_isgga_(void)
Definition functionals.c:192
Functional BHandHLYPFunctional
Definition fun-gga.c:102
Functional SVWN3Functional
Definition fun-gga.c:95
int fun_false(void)
Definition functionals.c:154
Functional LB94Functional
Definition fun-lb94.c:64
Functional BHandHFunctional
Definition fun-gga.c:101
Definition of the main floating-point datatype used; the ergo_real type.
double ergo_real
Definition realtype.h:69
Definition functionals.h:375
real rhob
Definition functionals.h:376
real gradab
Definition functionals.h:378
real rhoa
Definition functionals.h:376
real gradb
Definition functionals.h:377
real grada
Definition functionals.h:377
Definition functionals.h:119
real df0010
Definition functionals.h:122
real df0100
Definition functionals.h:121
real df00001
Definition functionals.h:124
real df0001
Definition functionals.h:123
real df1000
Definition functionals.h:120
Definition functionals.h:220
real df1110
Definition functionals.h:256
real df11101
Definition functionals.h:309
real df03001
Definition functionals.h:326
real df01102
Definition functionals.h:338
real df1300
Definition functionals.h:303
real df11011
Definition functionals.h:311
real df1030
Definition functionals.h:313
real df1002
Definition functionals.h:262
real df2011
Definition functionals.h:298
real df20002
Definition functionals.h:302
real df0003
Definition functionals.h:281
real df00021
Definition functionals.h:282
real df00002
Definition functionals.h:246
real df0400
Definition functionals.h:323
real df0220
Definition functionals.h:327
real df0040
Definition functionals.h:343
real df1010
Definition functionals.h:234
real df00121
Definition functionals.h:350
real df02001
Definition functionals.h:268
real df1020
Definition functionals.h:259
real df00111
Definition functionals.h:279
real df01111
Definition functionals.h:337
real df10102
Definition functionals.h:318
real df2020
Definition functionals.h:297
real df0031
Definition functionals.h:344
real df0110
Definition functionals.h:238
real df0201
Definition functionals.h:267
real df3001
Definition functionals.h:291
real df0022
Definition functionals.h:346
real df1003
Definition functionals.h:319
real df30001
Definition functionals.h:292
real df00031
Definition functionals.h:354
real df0202
Definition functionals.h:330
real df0210
Definition functionals.h:266
real df2100
Definition functionals.h:251
real df3000
Definition functionals.h:250
real df00022
Definition functionals.h:355
real df1120
Definition functionals.h:307
real df00001
Definition functionals.h:228
real df4000
Definition functionals.h:288
real df0013
Definition functionals.h:349
real df11002
Definition functionals.h:312
real df00013
Definition functionals.h:356
real df0021
Definition functionals.h:276
real df12001
Definition functionals.h:306
real df10003
Definition functionals.h:322
real df1012
Definition functionals.h:316
real df00003
Definition functionals.h:284
real df0301
Definition functionals.h:325
real df00102
Definition functionals.h:280
real df0101
Definition functionals.h:239
real df10012
Definition functionals.h:321
real df02002
Definition functionals.h:332
real df0010
Definition functionals.h:226
real df01201
Definition functionals.h:335
real df00011
Definition functionals.h:245
real df0012
Definition functionals.h:278
real df0020
Definition functionals.h:241
real df0111
Definition functionals.h:270
real df1101
Definition functionals.h:257
real df00004
Definition functionals.h:357
real df2200
Definition functionals.h:293
real df10101
Definition functionals.h:261
real df20001
Definition functionals.h:254
real df0130
Definition functionals.h:333
real df01003
Definition functionals.h:342
real df10201
Definition functionals.h:315
real df2000
Definition functionals.h:232
real df1001
Definition functionals.h:235
real df0030
Definition functionals.h:275
real df1100
Definition functionals.h:233
real df3010
Definition functionals.h:290
real df10011
Definition functionals.h:263
real df1210
Definition functionals.h:304
real df21001
Definition functionals.h:296
real df00202
Definition functionals.h:348
real df01001
Definition functionals.h:240
real df1201
Definition functionals.h:305
real df1021
Definition functionals.h:314
real df01101
Definition functionals.h:271
real df0112
Definition functionals.h:336
real df00101
Definition functionals.h:243
real df02101
Definition functionals.h:329
real df0002
Definition functionals.h:244
real df00211
Definition functionals.h:347
real df01012
Definition functionals.h:341
real df0100
Definition functionals.h:225
real df11001
Definition functionals.h:258
real df0211
Definition functionals.h:328
real df00301
Definition functionals.h:345
real df10021
Definition functionals.h:320
real df10111
Definition functionals.h:317
real df1200
Definition functionals.h:255
real df0300
Definition functionals.h:265
real df0121
Definition functionals.h:334
real df00103
Definition functionals.h:352
real df01011
Definition functionals.h:273
real df1011
Definition functionals.h:260
real df0310
Definition functionals.h:324
real df2110
Definition functionals.h:294
real df01021
Definition functionals.h:340
real df02011
Definition functionals.h:331
real df20101
Definition functionals.h:299
real df2101
Definition functionals.h:295
real df0120
Definition functionals.h:269
real df1102
Definition functionals.h:310
real df1000
Definition functionals.h:224
real df10001
Definition functionals.h:236
real df00201
Definition functionals.h:277
real df10002
Definition functionals.h:264
real df0004
Definition functionals.h:353
real df2001
Definition functionals.h:253
real df00112
Definition functionals.h:351
real df1111
Definition functionals.h:308
real df0102
Definition functionals.h:272
real df20011
Definition functionals.h:301
real df2010
Definition functionals.h:252
real df3100
Definition functionals.h:289
real df01002
Definition functionals.h:274
real df0001
Definition functionals.h:227
real df2002
Definition functionals.h:300
real df0103
Definition functionals.h:339
real df00012
Definition functionals.h:283
real df0200
Definition functionals.h:237
real df0011
Definition functionals.h:242
Definition functionals.h:130
real df1100
Definition functionals.h:137
real df0010
Definition functionals.h:133
real df1001
Definition functionals.h:139
real df0001
Definition functionals.h:134
real df0110
Definition functionals.h:142
real df2000
Definition functionals.h:136
real df0020
Definition functionals.h:145
real df0011
Definition functionals.h:146
real df1000
Definition functionals.h:131
real df0002
Definition functionals.h:148
real df0200
Definition functionals.h:141
real df01001
Definition functionals.h:144
real df00101
Definition functionals.h:147
real df10001
Definition functionals.h:140
real df00002
Definition functionals.h:150
real df1010
Definition functionals.h:138
real df00001
Definition functionals.h:135
real df0101
Definition functionals.h:143
real df00011
Definition functionals.h:149
real df0100
Definition functionals.h:132
Definition functionals.h:159
real df00201
Definition functionals.h:209
real df0021
Definition functionals.h:208
real df0120
Definition functionals.h:201
real df2010
Definition functionals.h:184
real df0111
Definition functionals.h:202
real df0101
Definition functionals.h:173
real df1001
Definition functionals.h:169
real df01001
Definition functionals.h:174
real df01101
Definition functionals.h:203
real df00011
Definition functionals.h:179
real df0200
Definition functionals.h:171
real df1000
Definition functionals.h:160
real df1002
Definition functionals.h:194
real df02001
Definition functionals.h:200
real df0012
Definition functionals.h:210
real df00111
Definition functionals.h:211
real df10001
Definition functionals.h:170
real df1101
Definition functionals.h:189
real df0030
Definition functionals.h:207
real df10101
Definition functionals.h:193
real df00101
Definition functionals.h:177
real df0110
Definition functionals.h:172
real df2001
Definition functionals.h:185
real df0100
Definition functionals.h:161
real df0001
Definition functionals.h:163
real df00012
Definition functionals.h:215
real df3000
Definition functionals.h:182
real df1100
Definition functionals.h:167
real df00102
Definition functionals.h:212
real df01011
Definition functionals.h:205
real df10002
Definition functionals.h:196
real df2000
Definition functionals.h:166
real df1010
Definition functionals.h:168
real df0011
Definition functionals.h:176
real df01002
Definition functionals.h:206
real df00003
Definition functionals.h:216
real df1020
Definition functionals.h:191
real df00021
Definition functionals.h:214
real df0102
Definition functionals.h:204
real df2100
Definition functionals.h:183
real df1011
Definition functionals.h:192
real df0002
Definition functionals.h:178
real df0210
Definition functionals.h:198
real df00002
Definition functionals.h:180
real df0201
Definition functionals.h:199
real df0003
Definition functionals.h:213
real df0020
Definition functionals.h:175
real df1110
Definition functionals.h:188
real df0010
Definition functionals.h:162
real df11001
Definition functionals.h:190
real df20001
Definition functionals.h:186
real df00001
Definition functionals.h:164
real df10011
Definition functionals.h:195
real df0300
Definition functionals.h:197
real df1200
Definition functionals.h:187
Definition functionals.h:401
FirstOrderFun first
Definition functionals.h:410
EnergyFunc func
Definition functionals.h:409
ReadInputFunc read
Definition functionals.h:404
SecondOrderFun second
Definition functionals.h:411
const char * name
Definition functionals.h:402
IsGGAFunc is_gga
Definition functionals.h:403
FourthOrderFun fourth
Definition functionals.h:413
ThirdOrderFun third
Definition functionals.h:412
ReportFunc report
Definition functionals.h:405