Loading...
Searching...
No Matches
Potential.h
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5**
6** Copyright (c) 2010--present, eOn Development Team
7** All rights reserved.
8**
9** Repo:
10** https://github.com/TheochemUI/eOn
11*/
12#pragma once
13#include "EonLogger.h"
14
15#include "Eigen.h"
16#include "PotRegistry.h"
17#include <atomic>
18#include <memory>
19#include <span>
20#include <stdexcept>
21
22namespace eonc {
23
24class Parameters;
25class Runtime;
26
41
42class Potential {
43protected:
45
46private:
48 uint64_t m_registry_id;
50 bool force_serial_{false};
51
52public:
53 std::atomic<size_t> forceCallCounter;
54
56 explicit Potential(PotType a_ptype);
57
59 Potential(PotType a_ptype, IPotRegistry &registry)
60 : ptype{a_ptype}, registry_{registry},
61 m_registry_id{registry.on_created(a_ptype)},
62 m_created_at{IPotRegistry::Clock::now()}, forceCallCounter{0} {}
63
64 // Out-of-line in eoncbase (PotentialParams.cpp) so shared plugins
65 // that link only eoncbase get the symbols. This header only
66 // forward-declares Parameters (header-surface contract).
67 Potential(PotType a_ptype, const Parameters &p);
68 explicit Potential(const Parameters &a_params);
69
70 virtual ~Potential() {
73 }
74
75 // Does not take into account the fixed / free atoms
76 // Variance here is null when not needed and that's OK
77 void virtual force(long nAtoms, const double *positions, const int *atomicNrs,
78 double *forces, double *energy, double *variance,
79 const double *box) = 0;
80
82 void force(std::span<const double> positions, std::span<const int> atomicNrs,
83 std::span<double> forces, double *energy, double *variance,
84 std::span<const double> box) {
85 if (positions.size() % 3 != 0 || positions.size() / 3 != atomicNrs.size() ||
86 forces.size() != positions.size() || box.size() != 9) {
87 throw std::invalid_argument("Potential::force span size mismatch");
88 }
89 force(static_cast<long>(atomicNrs.size()), positions.data(),
90 atomicNrs.data(), forces.data(), energy, variance, box.data());
91 }
92
96 virtual void setFixedMask(long nAtoms, const double *isFixed) {
97 (void)nAtoms;
98 (void)isFixed;
99 }
100
101 std::tuple<double, AtomMatrix>
102 get_ef(const AtomMatrix &pos, const VectorXi &atmnrs, const Matrix3d &box);
103
104 [[nodiscard]] PotType getType() const { return this->ptype; }
105
109 [[nodiscard]] virtual double finiteCutoff() const noexcept { return 0.0; }
110
113 [[nodiscard]] virtual bool isSurrogate() const noexcept { return false; }
114
117 [[nodiscard]] virtual bool requiresIsolatedMoleculeLayout() const noexcept {
118 return false;
119 }
120
126 [[nodiscard]] virtual bool isThreadSafe() const noexcept { return true; }
127
129 enum class PotLayout : unsigned {
130 InProcess = 1u << 0,
132 Subprocess = 1u << 2,
133 };
134 [[nodiscard]] virtual unsigned layoutFlags() const noexcept {
135 return static_cast<unsigned>(PotLayout::InProcess);
136 }
137
142 [[nodiscard]] virtual bool isSharedInstanceThreadSafe() const noexcept {
143 if (force_serial_)
144 return false;
145 return isThreadSafe();
146 }
147
153 [[nodiscard]] virtual bool needsPerImageInstance() const noexcept {
154 return false;
155 }
156
159 [[nodiscard]] virtual std::shared_ptr<Potential> clonePotential() const {
160 return nullptr;
161 }
162
166 [[nodiscard]] virtual bool supportsBatchEvaluation() const noexcept {
167 return false;
168 }
169
172 [[nodiscard]] virtual bool computesStress() const noexcept { return false; }
173
176 [[nodiscard]] virtual Matrix3d cauchyStress() const {
177 throw std::logic_error("Potential::cauchyStress is not implemented");
178 }
179
187 virtual void forceBatchOwned(long nSystems, long nAtoms,
188 const double *const *positions,
189 const int *const *atomicNrs,
190 double *const *forces, double *energies,
191 double *variances, const double *const *boxes,
192 const long *owners) {
193 (void)owners;
194 forceBatch(nSystems, nAtoms, positions, atomicNrs, forces, energies,
195 variances, boxes);
196 }
197
198 virtual void forceBatch(long nSystems, long nAtoms,
199 const double *const *positions,
200 const int *const *atomicNrs, double *const *forces,
201 double *energies, double *variances,
202 const double *const *boxes) {
203 for (long i = 0; i < nSystems; i++) {
204 double var = 0;
205 force(nAtoms, positions[i], atomicNrs[i], forces[i], &energies[i], &var,
206 boxes[i]);
207 if (variances)
208 variances[i] = var;
210 registry_.on_force_call(ptype);
211 }
212 }
213};
214
215namespace helpers {
216std::shared_ptr<Potential> makePotential(const Parameters &params);
217std::shared_ptr<Potential> makePotential(PotType ptype,
218 const Parameters &params);
219std::shared_ptr<Potential>
220makePotential(PotType ptype, const Parameters &params, Runtime &runtime);
221} // namespace helpers
222
223} // namespace eonc
Eigen::Matrix< double, 3, 3, eOnStorageOrder > Matrix3d
Definition Eigen.h:35
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
Clock::time_point TimePoint
Definition PotRegistry.h:30
PotentialConstructionScope(IPotRegistry &registry)
PotentialConstructionScope & operator=(const PotentialConstructionScope &)=delete
PotentialConstructionScope(const PotentialConstructionScope &)=delete
virtual bool computesStress() const noexcept
True when force() leaves a Cauchy stress that cauchyStress() can read until the next force() on this ...
Definition Potential.h:172
std::atomic< size_t > forceCallCounter
Definition Potential.h:53
virtual bool supportsBatchEvaluation() const noexcept
Whether this potential supports batched evaluation of N systems in a single call.
Definition Potential.h:166
virtual void forceBatchOwned(long nSystems, long nAtoms, const double *const *positions, const int *const *atomicNrs, double *const *forces, double *energies, double *variances, const double *const *boxes, const long *owners)
Evaluate forces for N systems in a single call.
Definition Potential.h:187
Potential(PotType a_ptype, IPotRegistry &registry)
Test seam: injected registry, no process-default get() counters.
Definition Potential.h:59
PotType getType() const
Definition Potential.h:104
virtual void force(long nAtoms, const double *positions, const int *atomicNrs, double *forces, double *energy, double *variance, const double *box)=0
void force(std::span< const double > positions, std::span< const int > atomicNrs, std::span< double > forces, double *energy, double *variance, std::span< const double > box)
C++ call site: size-checked view over the raw FFI force().
Definition Potential.h:82
virtual ~Potential()
Definition Potential.h:70
virtual std::shared_ptr< Potential > clonePotential() const
Independent instance that does not reload from disk.
Definition Potential.h:159
PotLayout
How the pot is executed. Combine with bitwise or.
Definition Potential.h:129
virtual bool isSharedInstanceThreadSafe() const noexcept
Conservative gate for sharing one Potential instance across threads.
Definition Potential.h:142
virtual bool isSurrogate() const noexcept
Whether this is a surrogate (GP) potential.
Definition Potential.h:113
uint64_t m_registry_id
Definition Potential.h:48
virtual bool needsPerImageInstance() const noexcept
Whether NEB should create separate Potential instances per image for true parallel force evaluation.
Definition Potential.h:153
virtual double finiteCutoff() const noexcept
Finite interaction range in position length units.
Definition Potential.h:109
virtual Matrix3d cauchyStress() const
Cauchy stress in eV/Angstrom^3.
Definition Potential.h:176
std::tuple< double, AtomMatrix > get_ef(const AtomMatrix &pos, const VectorXi &atmnrs, const Matrix3d &box)
virtual void forceBatch(long nSystems, long nAtoms, const double *const *positions, const int *const *atomicNrs, double *const *forces, double *energies, double *variances, const double *const *boxes)
Definition Potential.h:198
IPotRegistry & registry_
Definition Potential.h:47
virtual unsigned layoutFlags() const noexcept
Definition Potential.h:134
PotType ptype
Definition Potential.h:44
virtual bool requiresIsolatedMoleculeLayout() const noexcept
True for molecular QM / non-PBC backends (NWChem socket, ASE ORCA/NWChem, …).
Definition Potential.h:117
IPotRegistry::TimePoint m_created_at
Definition Potential.h:49
virtual void setFixedMask(long nAtoms, const double *isFixed)
Optional frozen-atom mask (nAtoms*3, 1.0 = fixed).
Definition Potential.h:96
virtual bool isThreadSafe() const noexcept
Whether this potential's force() can be called from multiple threads on the SAME instance.
Definition Potential.h:126
Potential(PotType a_ptype)
Production default: construction-scope registry, else PotRegistry::get().
Move-only composition root for process resources (dlopen loaders and the potential registry).
Definition Runtime.h:27
std::shared_ptr< Potential > makePotential(const Parameters &params)
RAII resource manager for the ARTn C library with global synchronization.