eOn client
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
MetatomicEngineLoader.cpp
Go to the documentation of this file.
1
#include "
eon/potentials/Rgpot/MetatomicEngineLoader.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_GLOBAL);
14
#else
15
return
nullptr
;
16
#endif
17
}
18
void
close_lib(
void
*h) {
19
#ifndef _WIN32
20
if
(h)
21
dlclose(h);
22
#endif
23
}
24
void
*load_sym(
void
*h,
const
char
*n) {
25
#ifndef _WIN32
26
return
dlsym(h, n);
27
#else
28
return
nullptr
;
29
#endif
30
}
31
}
// namespace
32
33
MetatomicEngineLoader::MetatomicEngineLoader
(
34
const
MetatomicEngineOptions
&opt) {
35
std::vector<std::string> paths;
36
if
(!opt.
engine_path
.empty())
37
paths.push_back(opt.
engine_path
);
38
if
(
const
char
*e = std::getenv(
"RGPOT_METATOMIC_ENGINE"
))
39
if
(e && *e)
40
paths.emplace_back(e);
41
if
(
const
char
*e = std::getenv(
"METATOMIC_ENGINE"
))
42
if
(e && *e)
43
paths.emplace_back(e);
44
paths.emplace_back(
"libmetatomic_engine.so"
);
45
auto
add_dirs = [&](
const
char
*env) {
46
if
(!env)
47
return
;
48
std::string s(env);
49
size_t
i = 0;
50
while
(i < s.size()) {
51
auto
j = s.find(
':'
, i);
52
if
(j == std::string::npos)
53
j = s.size();
54
if
(j > i) {
55
std::string d = s.substr(i, j - i);
56
if
(!d.empty() && d.back() !=
'/'
)
57
d +=
'/'
;
58
paths.push_back(d +
"libmetatomic_engine.so"
);
59
}
60
i = j + 1;
61
}
62
};
63
add_dirs(std::getenv(
"EON_POTENTIALS_PATH"
));
64
add_dirs(std::getenv(
"RGPOT_ENGINE_PATH"
));
65
66
std::string last_dlerr;
67
for
(
const
auto
&p : paths) {
68
m_lib
= open_lib(p.c_str());
69
if
(
m_lib
)
70
break
;
71
#ifndef _WIN32
72
if
(
const
char
*e = dlerror())
73
last_dlerr = e;
74
#endif
75
}
76
if
(!
m_lib
) {
77
std::string msg =
"RGPOT(metatomic): libmetatomic_engine.so not found "
78
"(set RGPOT_METATOMIC_ENGINE or EON_POTENTIALS_PATH)"
;
79
if
(!last_dlerr.empty())
80
msg += std::string(
"; last dlerror: "
) + last_dlerr;
81
throw
std::runtime_error(msg);
82
}
83
84
auto
abi =
85
reinterpret_cast<
int
(*)()
>
(load_sym(
m_lib
,
"rgpot_mta_abi_version"
));
86
m_create
=
reinterpret_cast<
create_fn
>
(load_sym(
m_lib
,
"rgpot_mta_create"
));
87
m_destroy
=
88
reinterpret_cast<
destroy_fn
>
(load_sym(
m_lib
,
"rgpot_mta_destroy"
));
89
m_force
=
reinterpret_cast<
force_fn
>
(load_sym(
m_lib
,
"rgpot_mta_force"
));
90
if
(!abi || !
m_create
|| !
m_destroy
|| !
m_force
||
91
abi() !=
RGPOT_MTA_ABI_VERSION
) {
92
close_lib(
m_lib
);
93
m_lib
=
nullptr
;
94
throw
std::runtime_error(
"RGPOT(metatomic): engine C ABI missing/mismatch"
);
95
}
96
char
err[1024]{};
97
RgpotMtaConfig
cfg{};
98
cfg.
model_path
= opt.
model_path
.c_str();
99
cfg.
device
= opt.
device
.c_str();
100
cfg.
length_unit
= opt.
length_unit
.c_str();
101
cfg.
extensions_directory
= opt.
extensions_directory
.c_str();
102
cfg.
check_consistency
= opt.
check_consistency
? 1 : 0;
103
cfg.
uncertainty_threshold
= opt.
uncertainty_threshold
;
104
cfg.
torch_determinism_strict
= opt.
torch_determinism_strict
? 1 : 0;
105
m_pot
=
m_create
(&cfg, err,
sizeof
err);
106
if
(!
m_pot
) {
107
close_lib(
m_lib
);
108
m_lib
=
nullptr
;
109
throw
std::runtime_error(std::string(
"RGPOT(metatomic): create failed: "
) +
110
err);
111
}
112
}
113
114
MetatomicEngineLoader::~MetatomicEngineLoader
() {
115
// Destroy the pot while the engine is still mapped. Do not dlclose
116
// libmetatomic_engine.so: torch/metatomic static teardown after dlclose
117
// routinely SEGV on process exit.
118
if
(
m_pot
&&
m_destroy
)
119
m_destroy
(
m_pot
);
120
m_pot
=
nullptr
;
121
m_lib
=
nullptr
;
122
}
123
124
void
MetatomicEngineLoader::force
(
long
N,
const
double
*R,
const
int
*atomicNrs,
125
double
*F,
double
*U,
double
*variance,
126
const
double
*box)
const
{
127
if
(!
m_pot
|| !
m_force
)
128
throw
std::runtime_error(
"RGPOT(metatomic): engine not available"
);
129
double
var = 0.0;
130
const
int
rc =
131
m_force
(
m_pot
, N, R, atomicNrs, F, U, variance ? variance : &var, box);
132
if
(rc != 0)
133
throw
std::runtime_error(
"RGPOT(metatomic): force failed"
);
134
}
MetatomicEngineLoader.h
RGPOT_MTA_ABI_VERSION
#define RGPOT_MTA_ABI_VERSION
Definition
metatomic_c_abi.h:43
MetatomicEngineLoader::m_destroy
destroy_fn m_destroy
Definition
MetatomicEngineLoader.h:39
MetatomicEngineLoader::destroy_fn
void(*)(RgpotMtaPot *) destroy_fn
Definition
MetatomicEngineLoader.h:35
MetatomicEngineLoader::create_fn
RgpotMtaPot *(*)(const RgpotMtaConfig *, char *, size_t) create_fn
Definition
MetatomicEngineLoader.h:34
MetatomicEngineLoader::m_lib
void * m_lib
Definition
MetatomicEngineLoader.h:32
MetatomicEngineLoader::m_create
create_fn m_create
Definition
MetatomicEngineLoader.h:38
MetatomicEngineLoader::force
void force(long N, const double *R, const int *atomicNrs, double *F, double *U, double *variance, const double *box) const
Definition
MetatomicEngineLoader.cpp:124
MetatomicEngineLoader::force_fn
int(*)(RgpotMtaPot *, long, const double *, const int *, double *, double *, double *, const double *) force_fn
Definition
MetatomicEngineLoader.h:36
MetatomicEngineLoader::m_force
force_fn m_force
Definition
MetatomicEngineLoader.h:40
MetatomicEngineLoader::~MetatomicEngineLoader
~MetatomicEngineLoader()
Definition
MetatomicEngineLoader.cpp:114
MetatomicEngineLoader::m_pot
RgpotMtaPot * m_pot
Definition
MetatomicEngineLoader.h:33
MetatomicEngineLoader::MetatomicEngineLoader
MetatomicEngineLoader(const MetatomicEngineOptions &opt)
Definition
MetatomicEngineLoader.cpp:33
MetatomicEngineOptions
Definition
MetatomicEngineLoader.h:9
MetatomicEngineOptions::uncertainty_threshold
double uncertainty_threshold
Definition
MetatomicEngineLoader.h:15
MetatomicEngineOptions::check_consistency
bool check_consistency
Definition
MetatomicEngineLoader.h:14
MetatomicEngineOptions::length_unit
std::string length_unit
Definition
MetatomicEngineLoader.h:12
MetatomicEngineOptions::extensions_directory
std::string extensions_directory
Definition
MetatomicEngineLoader.h:13
MetatomicEngineOptions::device
std::string device
Definition
MetatomicEngineLoader.h:11
MetatomicEngineOptions::torch_determinism_strict
bool torch_determinism_strict
Definition
MetatomicEngineLoader.h:17
MetatomicEngineOptions::engine_path
std::string engine_path
Definition
MetatomicEngineLoader.h:16
MetatomicEngineOptions::model_path
std::string model_path
Definition
MetatomicEngineLoader.h:10
RgpotMtaConfig
Flat config (subset of MetatomicConfig).
Definition
metatomic_c_abi.h:29
RgpotMtaConfig::extensions_directory
const char * extensions_directory
Definition
metatomic_c_abi.h:33
RgpotMtaConfig::uncertainty_threshold
double uncertainty_threshold
Definition
metatomic_c_abi.h:35
RgpotMtaConfig::device
const char * device
Definition
metatomic_c_abi.h:31
RgpotMtaConfig::model_path
const char * model_path
Definition
metatomic_c_abi.h:30
RgpotMtaConfig::check_consistency
int check_consistency
Definition
metatomic_c_abi.h:34
RgpotMtaConfig::length_unit
const char * length_unit
Definition
metatomic_c_abi.h:32
RgpotMtaConfig::torch_determinism_strict
int torch_determinism_strict
0=Fast, 1=Strict
Definition
metatomic_c_abi.h:40
client
potentials
Rgpot
MetatomicEngineLoader.cpp
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf