Loading...
Searching...
No Matches
MinModeObjectiveFunction Class Reference
Inheritance diagram for MinModeObjectiveFunction:

Public Member Functions

 MinModeObjectiveFunction (std::shared_ptr< Matter > matterPassed, std::shared_ptr< EigenmodeStrategy > minModeMethodPassed, AtomMatrix modePassed, const Parameters &paramsPassed)
 ~MinModeObjectiveFunction () override=default
VectorXd getGradient (bool fdstep=false)
double getEnergy ()
void setPositions (const VectorXd &x)
VectorXd getPositions ()
int degreesOfFreedom ()
bool isConverged ()
double getConvergence ()
VectorXd difference (const VectorXd &a, const VectorXd &b)
Public Member Functions inherited from eonc::ObjectiveFunction
 ObjectiveFunction (const Parameters &paramsPassed)
virtual ~ObjectiveFunction ()

Private Attributes

std::shared_ptr< Mattermatter
AtomMatrix eigenvector
std::shared_ptr< EigenmodeStrategyminModeMethod
int iteration {0}

Additional Inherited Members

Protected Attributes inherited from eonc::ObjectiveFunction
const Parametersparams

Detailed Description

Definition at line 32 of file MinModeSaddleSearch.cpp.

Constructor & Destructor Documentation

◆ MinModeObjectiveFunction()

MinModeObjectiveFunction::MinModeObjectiveFunction ( std::shared_ptr< Matter > matterPassed,
std::shared_ptr< EigenmodeStrategy > minModeMethodPassed,
AtomMatrix modePassed,
const Parameters & paramsPassed )
inline

Definition at line 40 of file MinModeSaddleSearch.cpp.

44 : ObjectiveFunction(paramsPassed),
45 matter{std::move(matterPassed)},
46 minModeMethod{minModeMethodPassed},
47 eigenvector{std::move(modePassed)} {}
std::shared_ptr< Matter > matter
std::shared_ptr< EigenmodeStrategy > minModeMethod
ObjectiveFunction(const Parameters &paramsPassed)

◆ ~MinModeObjectiveFunction()

MinModeObjectiveFunction::~MinModeObjectiveFunction ( )
overridedefault

Member Function Documentation

◆ degreesOfFreedom()

int MinModeObjectiveFunction::degreesOfFreedom ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 145 of file MinModeSaddleSearch.cpp.

145{ return 3 * matter->numberOfAtoms(); }

◆ difference()

VectorXd MinModeObjectiveFunction::difference ( const VectorXd & a,
const VectorXd & b )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 166 of file MinModeSaddleSearch.cpp.

166 {
167 return matter->pbcV(a - b);
168 }

◆ getConvergence()

double MinModeObjectiveFunction::getConvergence ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 150 of file MinModeSaddleSearch.cpp.

150 {
151 if (params.optimizer_options.convergence_metric == "norm") {
152 return matter->getForcesFreeV().norm();
153 } else if (params.optimizer_options.convergence_metric == "max_atom") {
154 return matter->maxForce();
155 } else if (params.optimizer_options.convergence_metric == "max_component") {
156 return matter->getForces().maxCoeff();
157 } else {
158 EONC_LOG_CRITICAL("[MinModeSaddleSearch] unknown convergence metric: {}",
159 params.optimizer_options.convergence_metric);
160 throw std::invalid_argument(
161 std::format("[MinModeSaddleSearch] unknown convergence_metric: {}",
162 params.optimizer_options.convergence_metric));
163 }
164 }
#define EONC_LOG_CRITICAL(...)
Definition EonLogger.h:268
const Parameters & params

◆ getEnergy()

double MinModeObjectiveFunction::getEnergy ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 142 of file MinModeSaddleSearch.cpp.

142{ return matter->getPotentialEnergy(); }

◆ getGradient()

VectorXd MinModeObjectiveFunction::getGradient ( bool fdstep = false)
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 51 of file MinModeSaddleSearch.cpp.

51 {
52 AtomMatrix force = matter->getForces();
53
54 if (!fdstep || iteration == 0) {
56 // Check if ImprovedDimer lost the mode
58 if (dimer && !dimer->rotationDidConverge) {
59 if (dimer->getEigenvalue() < 0.0) {
62 "[MinMode] Dimer restored to best state with C_tau={:.4f}",
63 dimer->getEigenvalue());
64 throw eonc::DimerModeRestoredException();
65 } else {
66 throw eonc::DimerModeLostException();
67 }
68 }
69 iteration++;
70 }
71
73 double eigenvalue = eonc::eigenmodeGetEigenvalue(*minModeMethod);
74
75 AtomMatrix proj = matDot(force, eigenvector) *
76 eonc::safemath::safe_normalized(eigenvector);
77
78 if (eigenvalue > 0.0) {
79 if (params.saddle_search_options.perp_force_ratio > 0.0) {
80 double d = params.saddle_search_options.perp_force_ratio;
81 force = d * force - (1.0 + d) * proj;
82 } else if (params.saddle_search_options.confine_positive.enabled) {
83 if (params.saddle_search_options.confine_positive.bowl_breakout) {
84 AtomMatrix forceTemp = matter->getForces();
85 int nBowlActive =
86 params.saddle_search_options.confine_positive.bowl_active;
87 std::vector<int> indices_max(nBowlActive);
88
89 // Find the nBowlActive atoms with largest forces
90 for (int j = 0; j < nBowlActive; j++) {
91 double f_max = forceTemp.row(0).norm();
92 int i_max = 0;
93 for (long i = 0; i < matter->numberOfAtoms(); i++) {
94 if (f_max < forceTemp.row(i).norm()) {
95 f_max = forceTemp.row(i).norm();
96 i_max = static_cast<int>(i);
97 }
98 }
99 forceTemp.row(i_max).setZero();
100 indices_max[j] = i_max;
101 }
102 forceTemp.setZero();
103 for (int j = 0; j < nBowlActive; j++) {
104 forceTemp.row(indices_max[j]) = -proj.row(indices_max[j]);
105 }
106 force = forceTemp;
107 } else {
108 int sufficientForce = 0;
109 double minForce =
110 params.saddle_search_options.confine_positive.min_force;
111 while (sufficientForce <
112 params.saddle_search_options.confine_positive.min_active) {
113 sufficientForce = 0;
114 force = matter->getForces();
115 for (long i = 0; i < matter->numberOfAtoms(); i++) {
116 for (int k = 0; k < 3; k++) {
117 if (std::abs(force(i, k)) < minForce) {
118 force(i, k) = 0;
119 } else {
120 sufficientForce++;
121 force(i, k) =
122 -params.saddle_search_options.confine_positive.boost *
123 proj(i, k);
124 }
125 }
126 }
127 minForce *=
128 params.saddle_search_options.confine_positive.scale_ratio;
129 }
130 }
131 } else {
132 force = -proj;
133 }
134 } else {
135 force += -2.0 * proj;
136 }
137
138 VectorXd forceV = VectorXd::Map(force.data(), 3 * matter->numberOfAtoms());
139 return -forceV;
140 }
double matDot(const AtomMatrix &a, const AtomMatrix &b)
SIMD-optimized dot product for contiguous Eigen matrices.
Definition Eigen.h:50
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
#define EONC_LOG_DEBUG(...)
Definition EonLogger.h:244
AtomMatrix eigenmodeGetEigenvector(EigenmodeStrategy &s)
Dispatch getEigenvector() to the active variant.
ImprovedDimer * asImprovedDimer(EigenmodeStrategy &s)
Access ImprovedDimer-specific features.
void eigenmodeCompute(EigenmodeStrategy &s, std::shared_ptr< Matter > matter, AtomMatrix direction)
Dispatch compute() to the active variant.
double eigenmodeGetEigenvalue(EigenmodeStrategy &s)
Dispatch getEigenvalue() to the active variant.

◆ getPositions()

VectorXd MinModeObjectiveFunction::getPositions ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 144 of file MinModeSaddleSearch.cpp.

144{ return matter->getPositionsV(); }

◆ isConverged()

bool MinModeObjectiveFunction::isConverged ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 146 of file MinModeSaddleSearch.cpp.

146 {
147 return getConvergence() < params.saddle_search_options.converged_force;
148 }

◆ setPositions()

void MinModeObjectiveFunction::setPositions ( const VectorXd & x)
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 143 of file MinModeSaddleSearch.cpp.

143{ matter->setPositionsV(x); }

Member Data Documentation

◆ eigenvector

AtomMatrix MinModeObjectiveFunction::eigenvector
private

Definition at line 35 of file MinModeSaddleSearch.cpp.

◆ iteration

int MinModeObjectiveFunction::iteration {0}
private

Definition at line 37 of file MinModeSaddleSearch.cpp.

37{0};

◆ matter

std::shared_ptr<Matter> MinModeObjectiveFunction::matter
private

Definition at line 34 of file MinModeSaddleSearch.cpp.

◆ minModeMethod

std::shared_ptr<EigenmodeStrategy> MinModeObjectiveFunction::minModeMethod
private

Definition at line 36 of file MinModeSaddleSearch.cpp.


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