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

Lowest-mode rotation through a rgsaddle minimum-mode session. More...

#include <XtsciMinMode.h>

Inheritance diagram for eonc::XtsciMinMode:

Public Member Functions

 XtsciMinMode (std::shared_ptr< Matter > matter, const Parameters &params, std::shared_ptr< Potential > pot)
 ~XtsciMinMode () override
 XtsciMinMode (const XtsciMinMode &)=delete
XtsciMinMode & operator= (const XtsciMinMode &)=delete
void compute (std::shared_ptr< Matter > matter, AtomMatrix initialDirection) override
double getEigenvalue () override
AtomMatrix getEigenvector () override
Public Member Functions inherited from eonc::LowestEigenmode
 LowestEigenmode (std::shared_ptr< Potential > potPassed, const Parameters &parameters)
virtual ~LowestEigenmode ()=default
virtual void evaluateWithProbe (const std::shared_ptr< Matter > &centre, const AtomMatrix &direction)
 Evaluates a dirty centre together with the first displaced image the next compute(centre, direction) needs, as one batch, when the potential batches (calculator groups, a batched model).

Private Attributes

double m_eigenvalue {0.0}
AtomMatrix m_eigenvector
AtomMatrix m_fixed
RgsaddleMinMode * m_session {nullptr}
long m_sessionAtoms {0}

Additional Inherited Members

Public Attributes inherited from eonc::LowestEigenmode
long totalForceCalls {0}
double statsTorque {0.0}
double statsCurvature {0.0}
double statsAngle {0.0}
long statsRotations {0}
long totalIterations {0}
Static Public Attributes inherited from eonc::LowestEigenmode
static const char MINMODE_DIMER [] = "dimer"
static const char MINMODE_GPRDIMER [] = "gprdimer"
static const char MINMODE_LANCZOS [] = "lanczos"
static const char MINMODE_DAVIDSON [] = "davidson"
static const char MINMODE_XTSCI [] = "xtsci"
Protected Attributes inherited from eonc::LowestEigenmode
std::shared_ptr< Potential > pot
const Parameters & params

Detailed Description

Lowest-mode rotation through a rgsaddle minimum-mode session.

The session is created with a zero translation cap so the climb stays in MinModeSaddleSearch.

Definition at line 23 of file XtsciMinMode.h.

Constructor & Destructor Documentation

◆ XtsciMinMode() [1/2]

eonc::XtsciMinMode::XtsciMinMode ( std::shared_ptr< Matter > matter,
const Parameters & params,
std::shared_ptr< Potential > pot )

Definition at line 84 of file XtsciMinMode.cpp.

88 if (matter) {
89 m_eigenvector = AtomMatrix::Zero(matter->numberOfAtoms(), 3);
90 }
91}
const Parameters & params
std::shared_ptr< Potential > pot
LowestEigenmode(std::shared_ptr< Potential > potPassed, const Parameters &parameters)
AtomMatrix m_eigenvector

◆ ~XtsciMinMode()

eonc::XtsciMinMode::~XtsciMinMode ( )
override

Definition at line 204 of file XtsciMinMode.cpp.

204 {
205 if (m_session != nullptr) {
206 rgsaddle_minmode_free(m_session);
207 }
208}
RgsaddleMinMode * m_session

◆ XtsciMinMode() [2/2]

eonc::XtsciMinMode::XtsciMinMode ( const XtsciMinMode & )
delete

Member Function Documentation

◆ compute()

void eonc::XtsciMinMode::compute ( std::shared_ptr< Matter > matter,
AtomMatrix initialDirection )
overridevirtual

Implements eonc::LowestEigenmode.

Definition at line 93 of file XtsciMinMode.cpp.

94 {
95 if (!matter) {
96 throw std::runtime_error("xtsci min-mode requires a geometry");
97 }
98 rgsaddle_version_t stamp{};
99 checkStatus(rgsaddle_abi_stamp(&stamp), "rgsaddle_abi_stamp");
100 if (stamp.major != RGSADDLE_ABI_MAJOR) {
101 throw std::runtime_error("incompatible rgsaddle ABI");
102 }
103 const auto nAtoms = matter->numberOfAtoms();
104 if (initialDirection.rows() != nAtoms || initialDirection.cols() != 3) {
105 throw std::runtime_error("xtsci min-mode direction shape");
106 }
107 // A direction without a norm names no mode. The host dimer normalizes it
108 // to zero and reports a zero curvature along it; rgsaddle refuses such a
109 // mode, so the estimate is the same here without a session call.
110 if (!(initialDirection.norm() > 1.0e-14)) {
111 m_eigenvector = AtomMatrix::Zero(nAtoms, 3);
112 m_eigenvalue = 0.0;
113 statsCurvature = 0.0;
114 statsRotations = 0;
115 totalIterations += 1;
116 return;
117 }
118 const AtomMatrix saved = matter->getPositions();
119 m_fixed = saved;
120 const auto &dim = params.dimer_options();
121 rgsaddle_minmode_config_t config{};
122 config.version = RGSADDLE_VERSION_INIT;
123 config.flags = 0;
124 // Dimer rotation. Lanczos is the same session with kind Lanczos.
125 const bool lanczos = params.saddle_search_options().minmode_method ==
127 config.kind = lanczos ? RGSADDLE_MINMODE_LANCZOS : RGSADDLE_MINMODE_DIMER;
128 config.method = params.optimizer_options().xtsci.method == "lbfgs"
129 ? RGSADDLE_METHOD_LBFGS
130 : RGSADDLE_METHOD_FIRE;
131 // dr is the finite-difference length in Angstrom, the separation the
132 // host dimer and Lanczos use; rotation_angle is a rotation trial angle
133 // in radians and does not belong here.
134 const double fd = params.main_options().finiteDifference;
135 config.dr = fd > 0.0 ? fd : 1.0e-3;
136 config.rotation_tol = dim.torque_min;
137 config.max_rotations = std::max<long>(1, dim.rotations_max);
138 config.krylov_dim = 12;
139 config.force_tol = 0.0;
140 // Zero cap: rotation only. The climb uses the host optimizer.
141 config.max_move = 0.0;
142#if RGSADDLE_ABI_MINOR >= 5
143 config.rotation_angle_tol = eonc::helpers::pi * dim.converged_angle / 180.0;
144 config.difference =
145 parseFdScheme(params.hessian_options().fd_scheme) == FdScheme::OneSided
146 ? RGSADDLE_DIFFERENCE_FORWARD
147 : RGSADDLE_DIFFERENCE_CENTRAL;
148#endif
149
150 Matter probe(*matter);
151 MinModeUser ctx{matter.get(), &probe, &m_fixed};
152 const size_t callsBefore = matter->getPotentialCalls();
153 rgsaddle_report_t report{};
154 std::vector<double> mode(static_cast<size_t>(3 * nAtoms), 0.0);
155#if RGSADDLE_ABI_MINOR >= 5
156 // One session for the whole search: the refreshed mode seeds the next
157 // estimate, and the host's gradient at the centre is handed over so the
158 // session does not evaluate the centre again.
159 if (m_session != nullptr && m_sessionAtoms != nAtoms) {
160 rgsaddle_minmode_free(m_session);
161 m_session = nullptr;
162 }
163 if (m_session == nullptr) {
164 m_session = rgsaddle_minmode_create(&config, nAtoms, saved.data(),
165 initialDirection.data());
166 if (m_session == nullptr) {
167 throw std::runtime_error("rgsaddle_minmode_create failed");
168 }
169 m_sessionAtoms = nAtoms;
170 } else if (initialDirection != m_eigenvector) {
171 checkStatus(rgsaddle_minmode_set_mode(m_session, initialDirection.data()),
172 "rgsaddle_minmode_set_mode");
173 }
174 const AtomMatrix gradient = -matter->getForces();
175 checkStatus(
176 rgsaddle_minmode_set_position(m_session, saved.data(), gradient.data()),
177 "rgsaddle_minmode_set_position");
178 const int rc =
179 xts_minmode_estimate(m_session, surfaceCallback, &ctx, &report);
180 checkStatus(rc, "rgsaddle_minmode_estimate");
181 checkStatus(rgsaddle_minmode_mode(m_session, mode.data()),
182 "rgsaddle_minmode_mode");
183#else
184 RgsaddleMinMode *session = rgsaddle_minmode_create(
185 &config, nAtoms, saved.data(), initialDirection.data());
186 if (session == nullptr) {
187 throw std::runtime_error("rgsaddle_minmode_create failed");
188 }
189 const int rc = rgsaddle_minmode_step(session, surfaceCallback, &ctx, &report);
190 const int modeRc = rgsaddle_minmode_mode(session, mode.data());
191 rgsaddle_minmode_free(session);
192 checkStatus(rc, "rgsaddle_minmode_step");
193 checkStatus(modeRc, "rgsaddle_minmode_mode");
194#endif
195 m_eigenvector = AtomMatrix::Map(mode.data(), nAtoms, 3);
196 m_eigenvalue = report.curvature;
197 statsCurvature = report.curvature;
198 statsRotations = report.rotations;
199 totalIterations += 1;
201 static_cast<long>(matter->getPotentialCalls() - callsBefore);
202}
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
static const char MINMODE_LANCZOS[]
constexpr double pi
FdScheme parseFdScheme(std::string_view scheme)

◆ getEigenvalue()

double eonc::XtsciMinMode::getEigenvalue ( )
overridevirtual

Implements eonc::LowestEigenmode.

Definition at line 210 of file XtsciMinMode.cpp.

210{ return m_eigenvalue; }

◆ getEigenvector()

AtomMatrix eonc::XtsciMinMode::getEigenvector ( )
overridevirtual

Implements eonc::LowestEigenmode.

Definition at line 212 of file XtsciMinMode.cpp.

212{ return m_eigenvector; }

◆ operator=()

XtsciMinMode & eonc::XtsciMinMode::operator= ( const XtsciMinMode & )
delete

Member Data Documentation

◆ m_eigenvalue

double eonc::XtsciMinMode::m_eigenvalue {0.0}
private

Definition at line 37 of file XtsciMinMode.h.

37{0.0};

◆ m_eigenvector

AtomMatrix eonc::XtsciMinMode::m_eigenvector
private

Definition at line 38 of file XtsciMinMode.h.

◆ m_fixed

AtomMatrix eonc::XtsciMinMode::m_fixed
private

Definition at line 39 of file XtsciMinMode.h.

◆ m_session

RgsaddleMinMode* eonc::XtsciMinMode::m_session {nullptr}
private

Definition at line 41 of file XtsciMinMode.h.

41{nullptr};

◆ m_sessionAtoms

long eonc::XtsciMinMode::m_sessionAtoms {0}
private

Definition at line 42 of file XtsciMinMode.h.

42{0};

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