eOn client
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
XTBEngineLoader.cpp
Go to the documentation of this file.
1
#include "
eon/potentials/Rgpot/XTBEngineLoader.h
"
2
#include <cstdlib>
3
#include <stdexcept>
4
#include <string>
5
#include <vector>
6
#ifndef _WIN32
7
#include <dlfcn.h>
8
#endif
9
10
namespace
{
11
void
*open_lib(
const
char
*path) {
12
#ifndef _WIN32
13
return
dlopen(path, RTLD_NOW | RTLD_LOCAL);
14
#else
15
(void)path;
16
return
nullptr
;
17
#endif
18
}
19
void
close_lib(
void
*h) {
20
#ifndef _WIN32
21
if
(h)
22
dlclose(h);
23
#else
24
(void)h;
25
#endif
26
}
27
void
*load_sym(
void
*h,
const
char
*n) {
28
#ifndef _WIN32
29
return
dlsym(h, n);
30
#else
31
(void)h;
32
(void)n;
33
return
nullptr
;
34
#endif
35
}
36
}
// namespace
37
38
XTBEngineLoader::XTBEngineLoader
(
const
XTBEngineOptions
&opt) {
39
std::vector<std::string> paths;
40
if
(!opt.
engine_path
.empty())
41
paths.push_back(opt.
engine_path
);
42
if
(
const
char
*e = std::getenv(
"RGPOT_XTB_ENGINE"
))
43
if
(e && *e)
44
paths.emplace_back(e);
45
if
(
const
char
*e = std::getenv(
"XTB_ENGINE"
))
46
if
(e && *e)
47
paths.emplace_back(e);
48
paths.emplace_back(
"libxtb_engine.so"
);
49
auto
add_dirs = [&](
const
char
*env) {
50
if
(!env)
51
return
;
52
std::string s(env);
53
size_t
i = 0;
54
while
(i < s.size()) {
55
auto
j = s.find(
':'
, i);
56
if
(j == std::string::npos)
57
j = s.size();
58
if
(j > i) {
59
std::string d = s.substr(i, j - i);
60
if
(!d.empty() && d.back() !=
'/'
)
61
d +=
'/'
;
62
paths.push_back(d +
"libxtb_engine.so"
);
63
}
64
i = j + 1;
65
}
66
};
67
add_dirs(std::getenv(
"EON_POTENTIALS_PATH"
));
68
add_dirs(std::getenv(
"RGPOT_ENGINE_PATH"
));
69
70
std::string last_dlerr;
71
for
(
const
auto
&p : paths) {
72
m_lib
= open_lib(p.c_str());
73
if
(
m_lib
)
74
break
;
75
#ifndef _WIN32
76
if
(
const
char
*e = dlerror())
77
last_dlerr = e;
78
#endif
79
}
80
if
(!
m_lib
) {
81
std::string msg =
"RGPOT(xtb): libxtb_engine.so not found "
82
"(set RGPOT_XTB_ENGINE or [RgpotPot] engine_path)"
;
83
if
(!last_dlerr.empty())
84
msg += std::string(
"; last dlerror: "
) + last_dlerr;
85
throw
std::runtime_error(msg);
86
}
87
88
auto
abi =
89
reinterpret_cast<
int
(*)()
>
(load_sym(
m_lib
,
"rgpot_xtb_abi_version"
));
90
m_create
=
reinterpret_cast<
create_fn
>
(load_sym(
m_lib
,
"rgpot_xtb_create"
));
91
m_destroy
=
92
reinterpret_cast<
destroy_fn
>
(load_sym(
m_lib
,
"rgpot_xtb_destroy"
));
93
m_force
=
reinterpret_cast<
force_fn
>
(load_sym(
m_lib
,
"rgpot_xtb_force"
));
94
if
(!abi || !
m_create
|| !
m_destroy
|| !
m_force
||
95
abi() !=
RGPOT_XTB_ABI_VERSION
) {
96
close_lib(
m_lib
);
97
m_lib
=
nullptr
;
98
throw
std::runtime_error(
"RGPOT(xtb): engine C ABI missing/mismatch"
);
99
}
100
char
err[1024]{};
101
RgpotXtbConfig
cfg{};
102
cfg.
method
= opt.
method
;
103
cfg.
accuracy
= opt.
accuracy
;
104
cfg.
electronic_temperature
= opt.
electronic_temperature
;
105
cfg.
max_iterations
= opt.
max_iterations
;
106
cfg.
charge
= opt.
charge
;
107
cfg.
uhf
= opt.
uhf
;
108
m_pot
=
m_create
(&cfg, err,
sizeof
err);
109
if
(!
m_pot
) {
110
close_lib(
m_lib
);
111
m_lib
=
nullptr
;
112
throw
std::runtime_error(std::string(
"RGPOT(xtb): create failed: "
) + err);
113
}
114
}
115
116
XTBEngineLoader::~XTBEngineLoader
() {
117
if
(
m_pot
&&
m_destroy
)
118
m_destroy
(
m_pot
);
119
m_pot
=
nullptr
;
120
// Safe to close: xtb has no torch-style static teardown hazard.
121
if
(
m_lib
)
122
close_lib(
m_lib
);
123
m_lib
=
nullptr
;
124
}
125
126
void
XTBEngineLoader::force
(
long
N,
const
double
*R,
const
int
*atomicNrs,
127
double
*F,
double
*U,
double
*variance,
128
const
double
*box)
const
{
129
if
(!
m_pot
|| !
m_force
)
130
throw
std::runtime_error(
"RGPOT(xtb): engine not available"
);
131
double
var = 0.0;
132
const
int
rc =
133
m_force
(
m_pot
, N, R, atomicNrs, F, U, variance ? variance : &var, box);
134
if
(rc != 0)
135
throw
std::runtime_error(
"RGPOT(xtb): force failed"
);
136
}
XTBEngineLoader.h
XTBEngineLoader::~XTBEngineLoader
~XTBEngineLoader()
Definition
XTBEngineLoader.cpp:116
XTBEngineLoader::destroy_fn
void(*)(RgpotXtbPot *) destroy_fn
Definition
XTBEngineLoader.h:35
XTBEngineLoader::m_destroy
destroy_fn m_destroy
Definition
XTBEngineLoader.h:39
XTBEngineLoader::m_force
force_fn m_force
Definition
XTBEngineLoader.h:40
XTBEngineLoader::force
void force(long N, const double *R, const int *atomicNrs, double *F, double *U, double *variance, const double *box) const
Definition
XTBEngineLoader.cpp:126
XTBEngineLoader::m_lib
void * m_lib
Definition
XTBEngineLoader.h:32
XTBEngineLoader::create_fn
RgpotXtbPot *(*)(const RgpotXtbConfig *, char *, size_t) create_fn
Definition
XTBEngineLoader.h:34
XTBEngineLoader::m_pot
RgpotXtbPot * m_pot
Definition
XTBEngineLoader.h:33
XTBEngineLoader::m_create
create_fn m_create
Definition
XTBEngineLoader.h:38
XTBEngineLoader::XTBEngineLoader
XTBEngineLoader(const XTBEngineOptions &opt)
Definition
XTBEngineLoader.cpp:38
XTBEngineLoader::force_fn
int(*)(RgpotXtbPot *, long, const double *, const int *, double *, double *, double *, const double *) force_fn
Definition
XTBEngineLoader.h:36
RgpotXtbConfig
Definition
xtb_c_abi.h:38
RgpotXtbConfig::max_iterations
int max_iterations
Definition
xtb_c_abi.h:42
RgpotXtbConfig::accuracy
double accuracy
Definition
xtb_c_abi.h:40
RgpotXtbConfig::method
int method
RGPOT_XTB_METHOD_*.
Definition
xtb_c_abi.h:39
RgpotXtbConfig::charge
double charge
Definition
xtb_c_abi.h:43
RgpotXtbConfig::electronic_temperature
double electronic_temperature
Kelvin.
Definition
xtb_c_abi.h:41
RgpotXtbConfig::uhf
int uhf
Definition
xtb_c_abi.h:44
XTBEngineOptions
Definition
XTBEngineLoader.h:10
XTBEngineOptions::uhf
int uhf
Definition
XTBEngineLoader.h:16
XTBEngineOptions::engine_path
std::string engine_path
Definition
XTBEngineLoader.h:17
XTBEngineOptions::max_iterations
int max_iterations
Definition
XTBEngineLoader.h:14
XTBEngineOptions::charge
double charge
Definition
XTBEngineLoader.h:15
XTBEngineOptions::electronic_temperature
double electronic_temperature
Definition
XTBEngineLoader.h:13
XTBEngineOptions::method
int method
Definition
XTBEngineLoader.h:11
XTBEngineOptions::accuracy
double accuracy
Definition
XTBEngineLoader.h:12
RGPOT_XTB_ABI_VERSION
#define RGPOT_XTB_ABI_VERSION
Definition
xtb_c_abi.h:47
client
potentials
Rgpot
XTBEngineLoader.cpp
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf