32 matter{std::move(matterPassed)},
36 int natoms =
matter->numberOfAtoms();
49 matter->setPositions(AtomMatrix::Map(x.data(),
matter->numberOfAtoms(), 3));
54 return VectorXd::Map(
matter->getPositions().data(),
55 3 *
matter->numberOfAtoms());
71 VectorXd
difference(
const VectorXd &a,
const VectorXd &b)
override {
72 return matter->pbcV(a - b);
99 int atoms =
path[0].numberOfAtoms();
101 for (
size_t i = 1; i <
path.size() - 1; ++i) {
102 path[i].setPositions(AtomMatrix::Map(
103 x.segment(3 * atoms * (i - 1), 3 * atoms).data(), atoms, 3));
108 int atoms =
path[0].numberOfAtoms();
109 int n_free_images =
path.size() - 2;
110 VectorXd pos(3 * atoms * n_free_images);
112 for (
size_t i = 1; i <
path.size() - 1; ++i) {
113 pos.segment(3 * atoms * (i - 1), 3 * atoms) =
120 return 3 *
path[0].numberOfAtoms() * (
path.size() - 2);
130 VectorXd
difference(
const VectorXd &a,
const VectorXd &b)
override {
153 std::shared_ptr<Potential> zbl,
169 VectorXd grad =
idpp_obj->getGradient(fdstep);
172 int n_images =
path.size();
173 int atoms_per_image =
path[0].numberOfAtoms();
176 for (
int i = 1; i < n_images - 1; ++i) {
177 AtomMatrix forces = MatrixXd::Zero(atoms_per_image, 3);
182 path[i].getAtomicNrs().data(), forces.data(), &energy,
183 nullptr,
path[i].getCell().data());
185 int segment_start = (i - 1) * 3 * atoms_per_image;
186 VectorXd zbl_grad_vec = VectorXd::Map(forces.data(), 3 * atoms_per_image);
189 grad.segment(segment_start, 3 * atoms_per_image) -=
203 VectorXd
difference(
const VectorXd &a,
const VectorXd &b)
override {
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, eOnStorageOrder > MatrixXd
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
CollectiveIDPPObjectiveFunction(std::vector< Matter > &pathRef, const Parameters ¶msPassed)
void setPositions(const VectorXd &x) override
double getConvergence() override
int degreesOfFreedom() override
MatrixXd getIDPPForces(const Matter &m, const MatrixXd &dTarget)
CollectiveIDPPObjectiveFunction(std::vector< Matter > &pathRef, const Parameters ¶msPassed)
std::vector< Matter > & path
bool isConverged() override
VectorXd difference(const VectorXd &a, const VectorXd &b) override
VectorXd getPositions() override
MatrixXd getDistanceMatrix(const Matter &m)
double getEnergy() override
VectorXd getGradient(bool fdstep=false) override
bool isConverged() override
std::shared_ptr< Matter > matter
double getConvergence() override
VectorXd difference(const VectorXd &a, const VectorXd &b) override
VectorXd getPositions() override
VectorXd getGradient(bool fdstep=false) override
IDPPObjectiveFunction(std::shared_ptr< Matter > matterPassed, const Parameters ¶msPassed, const MatrixXd &targetDistances)
double getEnergy() override
void setPositions(const VectorXd &x) override
int degreesOfFreedom() override
ObjectiveFunction(const Parameters ¶msPassed)
const Parameters & params
double getEnergy() override
std::shared_ptr< Potential > zbl_pot
int degreesOfFreedom() override
void setPositions(const VectorXd &x) override
std::vector< Matter > & path
double getConvergence() override
std::shared_ptr< ObjectiveFunction > idpp_obj
VectorXd difference(const VectorXd &a, const VectorXd &b) override
ZBLRepulsiveIDPPObjective(std::shared_ptr< ObjectiveFunction > idpp, std::shared_ptr< Potential > zbl, std::vector< Matter > &p, const Parameters ¶ms, double weight=1.0)
bool isConverged() override
VectorXd getGradient(bool fdstep=false) override
VectorXd getPositions() override
RAII resource manager for the ARTn C library with global synchronization.