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