Loading...
Searching...
No Matches
MetatomicDynPot.cpp
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5*/
7#include "eon/Parameters.h"
9
10#include <array>
11#include <stdexcept>
12#include <string>
13
14namespace eonc {
15
17 const auto &o = params.metatomic_options();
18 EonMtaConfig c{};
19 c.model_path = o.model_path.c_str();
20 c.device = o.device.c_str();
21 c.length_unit = o.length_unit.c_str();
22 c.extensions_directory = o.extensions_directory.c_str();
23 c.check_consistency = o.check_consistency ? 1 : 0;
24 c.uncertainty_threshold = o.uncertainty_threshold;
25 c.energy_output = o.energy_output.c_str();
26 c.energy_uncertainty_output = o.energy_uncertainty_output.c_str();
27 c.force_output = o.force_output.c_str();
28 c.non_conservative = o.non_conservative ? 1 : 0;
29 c.random_rotation = o.random_rotation ? 1 : 0;
30 c.n_symmetry_rotations = o.n_symmetry_rotations;
31 c.deterministic = o.deterministic ? 1 : 0;
32 c.deterministic_strict = o.deterministic_strict ? 1 : 0;
33 c.variant_base = o.variant.base.c_str();
34 c.variant_energy = o.variant.energy.c_str();
35 c.variant_energy_uncertainty = o.variant.energy_uncertainty.c_str();
36 c.variant_force = o.variant.force.c_str();
37 return c;
38}
39
42
44 IMetatomicLoader &loader)
46 loader_{loader} {
47 loader_.require_loaded();
48 std::array<char, 1024> err{};
49 auto cfg = config_from_params(params);
50 m_handle = loader_.create(&cfg, err.data(), err.size());
51 if (!m_handle) {
52 throw std::runtime_error(std::string("MetatomicDynPot: create failed: ") +
53 err.data());
54 }
55}
56
58 if (m_handle) {
59 loader_.destroy(m_handle);
60 m_handle = nullptr;
61 }
62}
63
64void MetatomicDynPot::force(long nAtoms, const double *positions,
65 const int *atomicNrs, double *forces,
66 double *energy, double *variance,
67 const double *box) {
68 const int rc = loader_.force(m_handle, nAtoms, positions, atomicNrs, forces,
69 energy, variance, box);
70 if (rc != 0) {
71 throw std::runtime_error("MetatomicDynPot: eon_mta_pot_force failed rc=" +
72 std::to_string(rc));
73 }
74}
75
76} // namespace eonc
void force(long nAtoms, const double *positions, const int *atomicNrs, double *forces, double *energy, double *variance, const double *box) override
IMetatomicLoader & loader_
MetatomicDynPot(const eonc::Parameters &params)
Production: process-default MetatomicLoader::instance().
const metatomic_options_t & metatomic_options() const
Potential(PotType a_ptype)
Production default: construction-scope registry, else PotRegistry::get().
RAII resource manager for the ARTn C library with global synchronization.
static EonMtaConfig config_from_params(const Parameters &params)
Flat config for create (mirrors eonc::Parameters::metatomic_options_t).
const char * device
const char * extensions_directory
const char * variant_force
const char * model_path
const char * length_unit
long n_symmetry_rotations
const char * energy_output
const char * force_output
const char * variant_base
const char * energy_uncertainty_output
const char * variant_energy
const char * variant_energy_uncertainty
double uncertainty_threshold