00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00044 #ifndef _FUNCTIONALS_H_
00045 #define _FUNCTIONALS_H_
00046
00047
00048 #include "config.h"
00049
00050 #ifdef PRECISION_QUAD_FLT128
00051 #include <quadmath.h>
00052 #endif
00053
00054 #include "realtype.h"
00055
00056 #ifdef __cplusplus
00057 #define EXTERN_C extern "C"
00058 #else
00059 #define EXTERN_C
00060 #endif
00061
00062 typedef ergo_real real;
00063
00064 #if defined(FUNC_PRECISION) && FUNC_PRECISION == 1
00065
00066
00067 #define ASINH asinhf
00068 #define ATAN atanf
00069 #define ERF erff
00070 #define EXP expf
00071 #define FABS fabsf
00072 #define LOG logf
00073 #define POW powf
00074 #define SQRT sqrtf
00075
00076 #elif defined(FUNC_PRECISION) && FUNC_PRECISION == 2
00077
00078
00079 #define ASINH asinh
00080 #define ATAN atan
00081 #define ERF erf
00082 #define EXP exp
00083 #define FABS fabs
00084 #define LOG log
00085 #define POW pow
00086 #define SQRT sqrt
00087
00088 #else
00089
00090 #ifdef PRECISION_QUAD_FLT128
00091
00092 #define ASINH asinhq
00093 #define ATAN atanq
00094 #define ERF erfq
00095 #define EXP expq
00096 #define FABS fabsq
00097 #define LOG logq
00098 #define POW powq
00099 #define SQRT sqrtq
00100 #else
00101
00102 #define ASINH asinhl
00103 #define ATAN atanl
00104 #define ERF erfl
00105 #define EXP expl
00106 #define FABS fabsl
00107 #define LOG logl
00108 #define POW powl
00109 #define SQRT sqrtl
00110 #endif
00111
00112 #endif
00113
00114
00115
00116
00117
00118
00119 typedef struct {
00120 real df1000;
00121 real df0100;
00122 real df0010;
00123 real df0001;
00124 real df00001;
00125 } FunFirstFuncDrv;
00126
00127
00128
00129
00130 typedef struct {
00131 real df1000;
00132 real df0100;
00133 real df0010;
00134 real df0001;
00135 real df00001;
00136 real df2000;
00137 real df1100;
00138 real df1010;
00139 real df1001;
00140 real df10001;
00141 real df0200;
00142 real df0110;
00143 real df0101;
00144 real df01001;
00145 real df0020;
00146 real df0011;
00147 real df00101;
00148 real df0002;
00149 real df00011;
00150 real df00002;
00151 } FunSecondFuncDrv;
00152
00153
00154
00155
00156
00157
00158
00159 typedef struct {
00160 real df1000;
00161 real df0100;
00162 real df0010;
00163 real df0001;
00164 real df00001;
00165
00166 real df2000;
00167 real df1100;
00168 real df1010;
00169 real df1001;
00170 real df10001;
00171 real df0200;
00172 real df0110;
00173 real df0101;
00174 real df01001;
00175 real df0020;
00176 real df0011;
00177 real df00101;
00178 real df0002;
00179 real df00011;
00180 real df00002;
00181
00182 real df3000;
00183 real df2100;
00184 real df2010;
00185 real df2001;
00186 real df20001;
00187 real df1200;
00188 real df1110;
00189 real df1101;
00190 real df11001;
00191 real df1020;
00192 real df1011;
00193 real df10101;
00194 real df1002;
00195 real df10011;
00196 real df10002;
00197 real df0300;
00198 real df0210;
00199 real df0201;
00200 real df02001;
00201 real df0120;
00202 real df0111;
00203 real df01101;
00204 real df0102;
00205 real df01011;
00206 real df01002;
00207 real df0030;
00208 real df0021;
00209 real df00201;
00210 real df0012;
00211 real df00111;
00212 real df00102;
00213 real df0003;
00214 real df00021;
00215 real df00012;
00216 real df00003;
00217 } FunThirdFuncDrv;
00218
00219
00220 typedef struct {
00221
00222
00223
00224 real df1000;
00225 real df0100;
00226 real df0010;
00227 real df0001;
00228 real df00001;
00229
00230
00231
00232 real df2000;
00233 real df1100;
00234 real df1010;
00235 real df1001;
00236 real df10001;
00237 real df0200;
00238 real df0110;
00239 real df0101;
00240 real df01001;
00241 real df0020;
00242 real df0011;
00243 real df00101;
00244 real df0002;
00245 real df00011;
00246 real df00002;
00247
00248
00249
00250 real df3000;
00251 real df2100;
00252 real df2010;
00253 real df2001;
00254 real df20001;
00255 real df1200;
00256 real df1110;
00257 real df1101;
00258 real df11001;
00259 real df1020;
00260 real df1011;
00261 real df10101;
00262 real df1002;
00263 real df10011;
00264 real df10002;
00265 real df0300;
00266 real df0210;
00267 real df0201;
00268 real df02001;
00269 real df0120;
00270 real df0111;
00271 real df01101;
00272 real df0102;
00273 real df01011;
00274 real df01002;
00275 real df0030;
00276 real df0021;
00277 real df00201;
00278 real df0012;
00279 real df00111;
00280 real df00102;
00281 real df0003;
00282 real df00021;
00283 real df00012;
00284 real df00003;
00285
00286
00287
00288 real df4000;
00289 real df3100;
00290 real df3010;
00291 real df3001;
00292 real df30001;
00293 real df2200;
00294 real df2110;
00295 real df2101;
00296 real df21001;
00297 real df2020;
00298 real df2011;
00299 real df20101;
00300 real df2002;
00301 real df20011;
00302 real df20002;
00303 real df1300;
00304 real df1210;
00305 real df1201;
00306 real df12001;
00307 real df1120;
00308 real df1111;
00309 real df11101;
00310 real df1102;
00311 real df11011;
00312 real df11002;
00313 real df1030;
00314 real df1021;
00315 real df10201;
00316 real df1012;
00317 real df10111;
00318 real df10102;
00319 real df1003;
00320 real df10021;
00321 real df10012;
00322 real df10003;
00323 real df0400;
00324 real df0310;
00325 real df0301;
00326 real df03001;
00327 real df0220;
00328 real df0211;
00329 real df02101;
00330 real df0202;
00331 real df02011;
00332 real df02002;
00333 real df0130;
00334 real df0121;
00335 real df01201;
00336 real df0112;
00337 real df01111;
00338 real df01102;
00339 real df0103;
00340 real df01021;
00341 real df01012;
00342 real df01003;
00343 real df0040;
00344 real df0031;
00345 real df00301;
00346 real df0022;
00347 real df00211;
00348 real df00202;
00349 real df0013;
00350 real df00121;
00351 real df00112;
00352 real df00103;
00353 real df0004;
00354 real df00031;
00355 real df00022;
00356 real df00013;
00357 real df00004;
00358 } FunFourthFuncDrv;
00359
00360
00361 typedef struct Functional_ Functional;
00362
00363 enum FunError { FUN_OK, FUN_UNKNOWN, FUN_CONF_ERROR };
00364 EXTERN_C enum FunError fun_select_by_name(const char *conf_string);
00365 extern Functional *selected_func;
00366 extern int (*fun_printf)(const char *fmt, ...);
00367 extern void (*fun_set_hf_weight)(real w);
00368 extern real (*fun_get_hf_weight)(void);
00369 extern void (*fun_set_cam_param)(real w, real b);
00370 int dft_get_cam_param(real *alpha, real *beta, real *mu);
00371
00372
00373
00374
00375 typedef struct FunDensProp_ {
00376 real rhoa, rhob;
00377 real grada, gradb;
00378 real gradab;
00379
00380 } FunDensProp;
00381
00382
00383
00384
00385
00386 typedef int (*IsGGAFunc)(void);
00387 typedef int (*ReadInputFunc)(const char* conf_string);
00388 typedef void (*ReportFunc)(void);
00389 typedef real (*EnergyFunc)(const FunDensProp* dens_prop);
00390 typedef void (*FirstOrderFun)(FunFirstFuncDrv *ds, real factor,
00391 const FunDensProp* dns_prp);
00392
00393 typedef void (*SecondOrderFun)(FunSecondFuncDrv *ds, real factor,
00394 const FunDensProp* dens_prop);
00395
00396 typedef void (*ThirdOrderFun)(FunThirdFuncDrv *ds, real factor,
00397 const FunDensProp* dens_prop);
00398 typedef void (*FourthOrderFun)(FunFourthFuncDrv *ds, real factor,
00399 const FunDensProp *dens_prop);
00400
00401 struct Functional_ {
00402 const char* name;
00403 IsGGAFunc is_gga;
00404 ReadInputFunc read;
00405 ReportFunc report;
00406
00407
00408
00409 EnergyFunc func;
00410 FirstOrderFun first;
00411 SecondOrderFun second;
00412 ThirdOrderFun third;
00413 FourthOrderFun fourth;
00414 };
00415
00416 EXTERN_C void drv1_clear(FunFirstFuncDrv* gga);
00417 EXTERN_C void drv2_clear(FunSecondFuncDrv* gga);
00418 EXTERN_C void drv3_clear(FunThirdFuncDrv* gga);
00419 EXTERN_C void drv4_clear(FunFourthFuncDrv* gga);
00420
00421
00422
00423 extern Functional BeckeFunctional;
00424 extern Functional KTFunctional;
00425 extern Functional LB94Functional;
00426 extern Functional LYPFunctional;
00427 extern Functional OPTXFunctional;
00428 extern Functional P86cFunctional;
00429 extern Functional PW86xFunctional;
00430 extern Functional Pw91xFunctional;
00431 extern Functional Pw91cFunctional;
00432 extern Functional PW92cFunctional;
00433 extern Functional PZ81Functional;
00434 extern Functional PbecFunctional;
00435 extern Functional PbexFunctional;
00436 extern Functional SlaterFunctional;
00437 extern Functional VWN3Functional;
00438 extern Functional VWN5Functional;
00439 extern Functional VWNIFunctional;
00440 extern Functional VWN3IFunctional;
00441 extern Functional VWNFunctional;
00442 extern Functional XAlphaFunctional;
00443
00444
00445 extern Functional B3LYPFunctional;
00446 extern Functional B3LYPGaussFunctional;
00447 extern Functional B3P86Functional;
00448 extern Functional B3P86GFunctional;
00449 extern Functional B3PW91Functional;
00450 extern Functional BHandHFunctional;
00451 extern Functional BHandHLYPFunctional;
00452 extern Functional BLYPFunctional;
00453 extern Functional BP86Functional;
00454 extern Functional BPW91Functional;
00455 extern Functional Camb3lypFunctional;
00456 extern Functional CamFunctional;
00457 extern Functional CombineFunctional;
00458 extern Functional GGAKeyFunctional;
00459 extern Functional HseFunctional;
00460 extern Functional KT1Functional;
00461 extern Functional KT2Functional;
00462 extern Functional KT3Functional;
00463 extern Functional LDAFunctional;
00464 extern Functional OLYPFunctional;
00465 extern Functional PBE0Functional;
00466 extern Functional PBEFunctional;
00467 extern Functional SVWN3Functional;
00468 extern Functional SVWN5Functional;
00469
00470
00471 extern Functional* available_functionals[];
00472
00473 extern int fun_true(void);
00474 extern int fun_false(void);
00475
00476 EXTERN_C void dftlistfuncs_(void);
00477 EXTERN_C void dftlistfuncs_using_printf_(void);
00478 int dft_isgga_(void);
00479 int dft_isgga__(void);
00480
00481 EXTERN_C void dftreport_(void);
00482 EXTERN_C int fun_get_cam_param(real *alpha, real *beta, real *mu);
00483
00484 #endif