Loading...
Searching...
No Matches
eonc::ZBLRepulsiveIDPPObjective Class Reference

#include <IDPPObjectiveFunction.hpp>

Inheritance diagram for eonc::ZBLRepulsiveIDPPObjective:

Public Member Functions

 ZBLRepulsiveIDPPObjective (std::shared_ptr< ObjectiveFunction > idpp, std::shared_ptr< Potential > zbl, std::vector< Matter > &p, const Parameters &params, double weight=1.0)
double getEnergy () override
VectorXd getGradient (bool fdstep=false) override
void setPositions (const VectorXd &x) override
VectorXd getPositions () override
int degreesOfFreedom () override
bool isConverged () override
double getConvergence () override
VectorXd difference (const VectorXd &a, const VectorXd &b) override
Public Member Functions inherited from eonc::ObjectiveFunction
 ObjectiveFunction (const Parameters &paramsPassed)
virtual ~ObjectiveFunction ()
virtual bool supportsFiniteDifferenceCurvature () const
virtual std::optional< double > knownCurvature () const
virtual void minimumImage (Eigen::Ref< Eigen::Vector3d >) const
virtual VectorXd getMasses () const
virtual bool getPeriodic () const

Public Attributes

std::shared_ptr< ObjectiveFunction > idpp_obj
std::shared_ptr< Potential > zbl_pot
std::vector< Matter > & path
double zbl_weight

Additional Inherited Members

Protected Attributes inherited from eonc::ObjectiveFunction
const Parameters & params

Detailed Description

Definition at line 138 of file IDPPObjectiveFunction.hpp.

Constructor & Destructor Documentation

◆ ZBLRepulsiveIDPPObjective()

eonc::ZBLRepulsiveIDPPObjective::ZBLRepulsiveIDPPObjective ( std::shared_ptr< ObjectiveFunction > idpp,
std::shared_ptr< Potential > zbl,
std::vector< Matter > & p,
const Parameters & params,
double weight = 1.0 )
inline

Definition at line 145 of file IDPPObjectiveFunction.hpp.

149 : ObjectiveFunction(params), idpp_obj(idpp), zbl_pot(zbl), path(p),
150 zbl_weight(weight) {}
ObjectiveFunction(const Parameters &paramsPassed)
const Parameters & params
std::shared_ptr< Potential > zbl_pot
std::shared_ptr< ObjectiveFunction > idpp_obj

Member Function Documentation

◆ degreesOfFreedom()

int eonc::ZBLRepulsiveIDPPObjective::degreesOfFreedom ( )
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 193 of file IDPPObjectiveFunction.hpp.

193{ return idpp_obj->degreesOfFreedom(); }

◆ difference()

VectorXd eonc::ZBLRepulsiveIDPPObjective::difference ( const VectorXd & a,
const VectorXd & b )
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 197 of file IDPPObjectiveFunction.hpp.

197 {
198 return idpp_obj->difference(a, b);
199 }

◆ getConvergence()

double eonc::ZBLRepulsiveIDPPObjective::getConvergence ( )
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 195 of file IDPPObjectiveFunction.hpp.

195{ return idpp_obj->getConvergence(); }

◆ getEnergy()

double eonc::ZBLRepulsiveIDPPObjective::getEnergy ( )
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 152 of file IDPPObjectiveFunction.hpp.

152 {
153 // IDPP "Energy" (Residual) + ZBL Energy
154 return idpp_obj->getEnergy();
155 }

◆ getGradient()

VectorXd eonc::ZBLRepulsiveIDPPObjective::getGradient ( bool fdstep = false)
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 157 of file IDPPObjectiveFunction.hpp.

157 {
158 // 1. Get IDPP Gradient (forces atoms towards interpolated distances)
159 VectorXd grad = idpp_obj->getGradient(fdstep);
160
161 // 2. Calculate ZBL Forces for every image
162 int n_images = path.size();
163 int atoms_per_image = path[0].numberOfAtoms();
164
165 const int nfree = static_cast<int>(path[0].numberOfFreeAtoms());
166 const int seg = 3 * nfree;
167 for (int i = 1; i < n_images - 1; ++i) {
168 AtomMatrix forces = MatrixXd::Zero(atoms_per_image, 3);
169 double energy = 0;
170
171 zbl_pot->force(atoms_per_image, path[i].getPositions().data(),
172 path[i].getAtomicNrs().data(), forces.data(), &energy,
173 nullptr, path[i].getCell().data());
174
175 VectorXd zbl_free(seg);
176 long k = 0;
177 for (int a = 0; a < atoms_per_image; ++a) {
178 if (!path[i].getFixed(a)) {
179 zbl_free[k++] = forces(a, 0);
180 zbl_free[k++] = forces(a, 1);
181 zbl_free[k++] = forces(a, 2);
182 }
183 }
184 grad.segment((i - 1) * seg, seg) -= (zbl_free * zbl_weight);
185 }
186
187 return grad;
188 }
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37

◆ getPositions()

VectorXd eonc::ZBLRepulsiveIDPPObjective::getPositions ( )
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 192 of file IDPPObjectiveFunction.hpp.

192{ return idpp_obj->getPositions(); }

◆ isConverged()

bool eonc::ZBLRepulsiveIDPPObjective::isConverged ( )
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 194 of file IDPPObjectiveFunction.hpp.

194{ return idpp_obj->isConverged(); }

◆ setPositions()

void eonc::ZBLRepulsiveIDPPObjective::setPositions ( const VectorXd & x)
inlineoverridevirtual

Implements eonc::ObjectiveFunction.

Definition at line 191 of file IDPPObjectiveFunction.hpp.

191{ idpp_obj->setPositions(x); }

Member Data Documentation

◆ idpp_obj

std::shared_ptr<ObjectiveFunction> eonc::ZBLRepulsiveIDPPObjective::idpp_obj

Definition at line 140 of file IDPPObjectiveFunction.hpp.

◆ path

std::vector<Matter>& eonc::ZBLRepulsiveIDPPObjective::path

Definition at line 142 of file IDPPObjectiveFunction.hpp.

◆ zbl_pot

std::shared_ptr<Potential> eonc::ZBLRepulsiveIDPPObjective::zbl_pot

Definition at line 141 of file IDPPObjectiveFunction.hpp.

◆ zbl_weight

double eonc::ZBLRepulsiveIDPPObjective::zbl_weight

Definition at line 143 of file IDPPObjectiveFunction.hpp.


The documentation for this class was generated from the following file: