77 void virtual force(
long nAtoms,
const double *positions,
const int *atomicNrs,
78 double *forces,
double *energy,
double *variance,
79 const double *box) = 0;
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");
89 force(
static_cast<long>(atomicNrs.size()), positions.data(),
90 atomicNrs.data(), forces.data(), energy, variance, box.data());
101 std::tuple<double, AtomMatrix>
109 [[nodiscard]]
virtual double finiteCutoff() const noexcept {
return 0.0; }
113 [[nodiscard]]
virtual bool isSurrogate() const noexcept {
return false; }
126 [[nodiscard]]
virtual bool isThreadSafe() const noexcept {
return true; }
177 throw std::logic_error(
"Potential::cauchyStress is not implemented");
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) {
194 forceBatch(nSystems, nAtoms, positions, atomicNrs, forces, energies,
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++) {
205 force(nAtoms, positions[i], atomicNrs[i], forces[i], &energies[i], &var,
216std::shared_ptr<Potential>
makePotential(
const Parameters ¶ms);
218 const Parameters ¶ms);
219std::shared_ptr<Potential>
Eigen::Matrix< double, 3, 3, eOnStorageOrder > Matrix3d
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Clock::time_point TimePoint
~PotentialConstructionScope()
PotentialConstructionScope(IPotRegistry ®istry)
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 ...
std::atomic< size_t > forceCallCounter
virtual bool supportsBatchEvaluation() const noexcept
Whether this potential supports batched evaluation of N systems in a single call.
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.
Potential(PotType a_ptype, IPotRegistry ®istry)
Test seam: injected registry, no process-default get() counters.
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().
virtual std::shared_ptr< Potential > clonePotential() const
Independent instance that does not reload from disk.
PotLayout
How the pot is executed. Combine with bitwise or.
virtual bool isSharedInstanceThreadSafe() const noexcept
Conservative gate for sharing one Potential instance across threads.
virtual bool isSurrogate() const noexcept
Whether this is a surrogate (GP) potential.
virtual bool needsPerImageInstance() const noexcept
Whether NEB should create separate Potential instances per image for true parallel force evaluation.
virtual double finiteCutoff() const noexcept
Finite interaction range in position length units.
virtual Matrix3d cauchyStress() const
Cauchy stress in eV/Angstrom^3.
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)
virtual unsigned layoutFlags() const noexcept
virtual bool requiresIsolatedMoleculeLayout() const noexcept
True for molecular QM / non-PBC backends (NWChem socket, ASE ORCA/NWChem, …).
IPotRegistry::TimePoint m_created_at
virtual void setFixedMask(long nAtoms, const double *isFixed)
Optional frozen-atom mask (nAtoms*3, 1.0 = fixed).
virtual bool isThreadSafe() const noexcept
Whether this potential's force() can be called from multiple threads on the SAME instance.
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).
std::shared_ptr< Potential > makePotential(const Parameters ¶ms)
RAII resource manager for the ARTn C library with global synchronization.