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

#include <AtomicGPDimer.h>

Inheritance diagram for eonc::AtomicGPDimer:

Public Member Functions

 AtomicGPDimer (std::shared_ptr< Matter > matter, const Parameters &params, std::shared_ptr< Potential > pot)
 ~AtomicGPDimer ()=default
void compute (std::shared_ptr< Matter > matter, AtomMatrix initialDirection) override
double getEigenvalue () override
AtomMatrix getEigenvector () override
Matrix3d forceBox () const
Public Member Functions inherited from eonc::LowestEigenmode
 LowestEigenmode (std::shared_ptr< Potential > potPassed, const Parameters &parameters)
virtual ~LowestEigenmode ()=default

Static Public Attributes

static const char OPT_SCG [] = "scg"
static const char OPT_LBFGS [] = "lbfgs"
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"

Private Attributes

std::shared_ptr< Matter > matterCenter
AtomMatrix direction
AtomMatrix rotationalPlane
gpr::InputParameters p
atmd::AtomicDimer atomic_dimer
aux::ProblemSetUp problem_setup
gpr::AtomsConfiguration atoms_config
gpr::Observation init_observations
gpr::Observation init_middle_point
gpr::Coord orient_init
gpr::Coord R_init

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}
Protected Attributes inherited from eonc::LowestEigenmode
std::shared_ptr< Potential > pot
const Parameters & params

Detailed Description

Definition at line 26 of file AtomicGPDimer.h.

Constructor & Destructor Documentation

◆ AtomicGPDimer()

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

Definition at line 46 of file AtomicGPDimer.cpp.

50 if (!matter) {
51 throw std::invalid_argument("AtomicGPDimer: null Matter");
52 }
53 matterCenter = std::make_shared<Matter>(pot, params);
54 *matterCenter = *matter;
56 // XTBPot treats a non-zero box as periodic. Matter::computePotential sends
57 // a zero box when periodic boundaries are off; the GP force box must match.
58 const Matrix3d cell =
59 matter->getPeriodic() ? matter->getCell() : Matrix3d::Zero();
60 for (int i = 0; i < 9; i++) {
61 p.cell_dimensions.value[i] = cell.data()[i];
62 }
63}
Eigen::Matrix< double, 3, 3, eOnStorageOrder > Matrix3d
Definition Eigen.h:35
std::shared_ptr< Matter > matterCenter
gpr::InputParameters p
const Parameters & params
std::shared_ptr< Potential > pot
LowestEigenmode(std::shared_ptr< Potential > potPassed, const Parameters &parameters)
gpr::InputParameters eon_parameters_to_gpr(const Parameters &parameters)
Create a parameters object for gpr_dimer.

◆ ~AtomicGPDimer()

eonc::AtomicGPDimer::~AtomicGPDimer ( )
default

Member Function Documentation

◆ compute()

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

Implements eonc::LowestEigenmode.

Definition at line 73 of file AtomicGPDimer.cpp.

74 {
75 // Saddle search moves this Matter after the solver is constructed.
76 *matterCenter = *matter;
78 copyAtomMatrixToCoord(matter->getPositionsFree(), R_init);
79 init_middle_point.clear();
81 init_observations.clear();
82 problem_setup.activateFrozenAtoms(
83 R_init, params.gpr_dimer_options().active_radius, atoms_config);
84 AtomMatrix freeOrient(matterCenter->numberOfFreeAtoms(), 3);
85 int j = 0;
86 for (int i = 0; i < matterCenter->numberOfAtoms(); i++) {
87 if (!matterCenter->getFixed(i)) {
88 freeOrient.row(j) = initialDirectionAtomMatrix.row(i);
89 j++;
90 if (j == matterCenter->numberOfFreeAtoms()) {
91 break;
92 }
93 }
94 }
95 copyAtomMatrixToCoord(freeOrient, orient_init);
98
99 auto potential = eonc::helpers::makePotential(params);
100 pot::PotentialWrapper wrapper(
101 [&potential](long N, const double *R, const int *atomicNrs, double *F,
102 double *U, double *variance, const double *box) {
103 potential->force(N, R, atomicNrs, F, U, variance, box);
104 });
105 // Restore traps if execute throws. The saddle-search catch must not
106 // leave later force calls running with traps still masked.
107 {
108 eonc::FPEGuard fpe;
109 atomic_dimer.execute(wrapper);
110 }
111 // Forcefully set the right positions
112 matter->setPositionsFreeV(atomic_dimer.getFinalCoordOfMidPoint());
113 this->totalIterations = atomic_dimer.getIterations();
114 this->totalForceCalls = atomic_dimer.getTotalForceCalls();
115 pot->forceCallCounter = atomic_dimer.getTotalForceCalls();
116 return;
117}
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
gpr::AtomsConfiguration atoms_config
gpr::Observation init_observations
gpr::Observation init_middle_point
atmd::AtomicDimer atomic_dimer
aux::ProblemSetUp problem_setup
gpr::AtomsConfiguration eon_matter_to_atmconf(Matter *matter)
Create a configuration of atoms for gpr_dimer.
std::shared_ptr< Potential > makePotential(const Parameters &params)

◆ forceBox()

Matrix3d eonc::AtomicGPDimer::forceBox ( ) const
nodiscard

Definition at line 65 of file AtomicGPDimer.cpp.

65 {
66 Matrix3d box = Matrix3d::Zero();
67 for (int i = 0; i < 9; ++i) {
68 box.data()[i] = p.cell_dimensions.value[i];
69 }
70 return box;
71}

◆ getEigenvalue()

double eonc::AtomicGPDimer::getEigenvalue ( )
overridevirtual

Implements eonc::LowestEigenmode.

Definition at line 119 of file AtomicGPDimer.cpp.

119 {
120 return atomic_dimer.getFinalCurvature();
121}

◆ getEigenvector()

AtomMatrix eonc::AtomicGPDimer::getEigenvector ( )
overridevirtual

Implements eonc::LowestEigenmode.

Definition at line 123 of file AtomicGPDimer.cpp.

123 {
124 const gpr::Coord &orient = atomic_dimer.getFinalOrientation();
125 const long nFree = matterCenter->numberOfFreeAtoms();
126 const long nAtoms = matterCenter->numberOfAtoms();
127 if (nFree <= 0 || orient.size() != 3 * nFree) {
128 return AtomMatrix::Zero(nAtoms, 3);
129 }
130 AtomMatrix freeMode = Eigen::Map<const AtomMatrix>(orient.data(), nFree, 3);
131 if (nFree == nAtoms) {
132 return freeMode;
133 }
134 AtomMatrix full = AtomMatrix::Zero(nAtoms, 3);
135 long k = 0;
136 for (long i = 0; i < nAtoms; ++i) {
137 if (!matterCenter->getFixed(i)) {
138 full.row(i) = freeMode.row(k++);
139 }
140 }
141 return full;
142}

Member Data Documentation

◆ atomic_dimer

atmd::AtomicDimer eonc::AtomicGPDimer::atomic_dimer
private

Definition at line 51 of file AtomicGPDimer.h.

◆ atoms_config

gpr::AtomsConfiguration eonc::AtomicGPDimer::atoms_config
private

Definition at line 53 of file AtomicGPDimer.h.

◆ direction

AtomMatrix eonc::AtomicGPDimer::direction
private

Definition at line 47 of file AtomicGPDimer.h.

◆ init_middle_point

gpr::Observation eonc::AtomicGPDimer::init_middle_point
private

Definition at line 54 of file AtomicGPDimer.h.

◆ init_observations

gpr::Observation eonc::AtomicGPDimer::init_observations
private

Definition at line 54 of file AtomicGPDimer.h.

◆ matterCenter

std::shared_ptr<Matter> eonc::AtomicGPDimer::matterCenter
private

Definition at line 46 of file AtomicGPDimer.h.

◆ OPT_LBFGS

const char eonc::AtomicGPDimer::OPT_LBFGS = "lbfgs"
static

Definition at line 31 of file AtomicGPDimer.h.

◆ OPT_SCG

const char eonc::AtomicGPDimer::OPT_SCG = "scg"
static

Definition at line 30 of file AtomicGPDimer.h.

◆ orient_init

gpr::Coord eonc::AtomicGPDimer::orient_init
private

Definition at line 55 of file AtomicGPDimer.h.

◆ p

gpr::InputParameters eonc::AtomicGPDimer::p
private

Definition at line 50 of file AtomicGPDimer.h.

◆ problem_setup

aux::ProblemSetUp eonc::AtomicGPDimer::problem_setup
private

Definition at line 52 of file AtomicGPDimer.h.

◆ R_init

gpr::Coord eonc::AtomicGPDimer::R_init
private

Definition at line 55 of file AtomicGPDimer.h.

◆ rotationalPlane

AtomMatrix eonc::AtomicGPDimer::rotationalPlane
private

Definition at line 48 of file AtomicGPDimer.h.


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