eOn 3.2.0
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
NudgedElasticBand.h
Go to the documentation of this file.
1
/*
2
** This file is part of eOn.
3
**
4
** SPDX-License-Identifier: BSD-3-Clause
5
**
6
** Copyright (c) 2010--present, eOn Development Team
7
** All rights reserved.
8
**
9
** Repo:
10
** https://github.com/TheochemUI/eOn
11
*/
12
#pragma once
13
14
#include <filesystem>
15
16
#include "
Eigen.h
"
17
#include "
EonLogger.h
"
18
19
#include "
EigenmodeStrategy.h
"
20
#include "
HelperFunctions.h
"
21
#include "
Matter.h
"
22
#include "
NEBProjection.h
"
23
#include "
NEBTangent.h
"
24
#include "
ObjectiveFunction.h
"
25
#include "
Parameters.h
"
26
27
#include <optional>
28
#include <readcon-core.hpp>
29
#include <vector>
30
31
namespace
eonc::neb
{
32
class
OCINEBController
;
33
}
34
35
namespace
eonc
{
36
37
// NEB method for determining a minimum energy path between two matter objects
38
class
NudgedElasticBand
{
39
friend
class
eonc::neb::OCINEBController
;
40
41
public
:
42
enum class
NEBStatus
{
43
GOOD
= 0,
44
INIT
= 1,
45
BAD_MAX_ITERATIONS
= 2,
46
RUNNING
,
47
MAX_UNCERTAINTY
48
};
49
NudgedElasticBand
(std::shared_ptr<Matter> initialPassed,
50
std::shared_ptr<Matter> finalPassed,
51
const
Parameters
¶metersPassed,
52
std::shared_ptr<Potential> potPassed);
53
NudgedElasticBand
(std::vector<Matter> initPath,
54
const
Parameters
¶metersPassed,
55
std::shared_ptr<Potential> potPassed);
56
~NudgedElasticBand
() =
default
;
57
58
NudgedElasticBand::NEBStatus
compute
(
void
);
59
NudgedElasticBand::NEBStatus
getStatus
() {
return
this->
status
; };
60
[[nodiscard]]
bool
solidState
() const noexcept {
return
solidState_
; }
61
[[nodiscard]]
double
solidJacobian
() const noexcept {
return
solidJacobian_
; }
62
[[nodiscard]]
const
Matrix3d
&
cellForce
(
long
image)
const
{
63
return
projectedCellForce
.at(
static_cast<
size_t
>
(image));
64
}
65
void
updateForces
(
bool
ci_active);
66
void
updateForces
(
void
) {
updateForces
(
ci_enabled_
); }
67
void
setCIEnabled
(
bool
enabled) {
ci_enabled_
= enabled; }
68
double
convergenceForce
(
void
);
69
void
findExtrema
(
void
);
70
void
printImageData
(
bool
writeToFile =
false
,
size_t
idx = 0);
71
74
[[nodiscard]] std::vector<readcon::ConFrame>
75
pathFrames
(std::optional<size_t> bandIndex = std::nullopt);
76
77
std::vector<std::shared_ptr<EigenmodeStrategy>>
eigenmode_solvers
;
78
79
int
atoms
{0};
80
long
numImages
{0},
climbingImage
{0},
numExtrema
{0};
81
// Reactant energy at construction. Zoom moves path[0] to the start of its
82
// window, so reported energies are measured from this value instead.
83
double
reactantEnergy
{0.0};
84
std::vector<std::shared_ptr<Matter>>
path
;
// NEB images
85
std::vector<std::shared_ptr<AtomMatrix>>
tangent
;
86
std::vector<std::shared_ptr<AtomMatrix>>
projectedForce
;
87
std::vector<double>
extremumEnergy
;
88
std::vector<double>
extremumPosition
;
89
std::vector<double>
extremumCurvature
;
90
91
std::size_t
maxEnergyImage
{0};
92
bool
movedAfterForceCall
{
false
};
93
bool
perImagePotentials_
{
94
false
};
95
double
ksp
{0.0};
96
double
k_u
{0.0};
// Upper-bound value for the spring constant
97
double
k_l
{0.0};
// Lower-bound value for the spring constant
98
double
E_ref
;
// Reference energy chosen to be equal to the max energy of the
99
// reactant or product energy minimum
100
101
private
:
102
bool
ci_enabled_
{
false
};
// runtime CI state, set by compute()
103
double
baseline_force
{-1.0};
104
Parameters
params
;
105
std::shared_ptr<Potential>
pot
;
106
NEBStatus
status
;
107
eonc::log::Scoped
log
;
108
109
// Cached strategies (constant across iterations)
110
neb::TangentStrategy
tangentStrat_
;
111
neb::ProjectionStrategy
projectionStrat_
;
112
bool
solidState_
{
false
};
113
double
solidJacobian_
{1.0};
114
std::vector<Matrix3d>
projectedCellForce
;
115
void
prepareSolidState
();
116
void
projectSolidState
(
bool
ci_active);
117
};
118
119
class
NEBObjectiveFunction
:
public
ObjectiveFunction
{
120
public
:
121
NEBObjectiveFunction
(
NudgedElasticBand
*nebPassed,
122
const
Parameters
¶metersPassed)
123
:
ObjectiveFunction
(parametersPassed),
neb
{nebPassed} {}
124
// This is the odd one out, doesn't take a Matter so we null it
125
126
~NEBObjectiveFunction
(
void
) {};
127
128
VectorXd
getGradient
(
bool
fdstep =
false
);
129
double
getEnergy
();
130
void
setPositions
(
const
VectorXd &x);
131
VectorXd
getPositions
();
132
int
degreesOfFreedom
();
133
bool
isConverged
();
134
bool
isUncertain
();
135
double
getConvergence
();
136
VectorXd
difference
(
const
VectorXd &a,
const
VectorXd &b);
137
// The band residual rotates with its tangent and is not a PES gradient.
138
bool
supportsFiniteDifferenceCurvature
()
const override
{
return
false
; }
139
NudgedElasticBand::NEBStatus
status
;
140
141
private
:
142
NudgedElasticBand
*
neb
;
143
};
144
145
}
// namespace eonc
Eigen.h
Matrix3d
Eigen::Matrix< double, 3, 3, eOnStorageOrder > Matrix3d
Definition
Eigen.h:35
EigenmodeStrategy.h
EonLogger.h
HelperFunctions.h
Matter.h
NEBProjection.h
NEBTangent.h
ObjectiveFunction.h
Parameters.h
eonc::NEBObjectiveFunction::getGradient
VectorXd getGradient(bool fdstep=false)
Definition
NEBObjectiveFunction.cpp:24
eonc::NEBObjectiveFunction::getPositions
VectorXd getPositions()
Definition
NEBObjectiveFunction.cpp:77
eonc::NEBObjectiveFunction::~NEBObjectiveFunction
~NEBObjectiveFunction(void)
Definition
NudgedElasticBand.h:126
eonc::NEBObjectiveFunction::status
NudgedElasticBand::NEBStatus status
Definition
NudgedElasticBand.h:139
eonc::NEBObjectiveFunction::getConvergence
double getConvergence()
Definition
NEBObjectiveFunction.cpp:118
eonc::NEBObjectiveFunction::getEnergy
double getEnergy()
Definition
NEBObjectiveFunction.cpp:47
eonc::NEBObjectiveFunction::supportsFiniteDifferenceCurvature
bool supportsFiniteDifferenceCurvature() const override
Definition
NudgedElasticBand.h:138
eonc::NEBObjectiveFunction::neb
NudgedElasticBand * neb
Definition
NudgedElasticBand.h:142
eonc::NEBObjectiveFunction::difference
VectorXd difference(const VectorXd &a, const VectorXd &b)
Definition
NEBObjectiveFunction.cpp:122
eonc::NEBObjectiveFunction::isConverged
bool isConverged()
Definition
NEBObjectiveFunction.cpp:113
eonc::NEBObjectiveFunction::degreesOfFreedom
int degreesOfFreedom()
Definition
NEBObjectiveFunction.cpp:93
eonc::NEBObjectiveFunction::isUncertain
bool isUncertain()
Definition
NEBObjectiveFunction.cpp:97
eonc::NEBObjectiveFunction::NEBObjectiveFunction
NEBObjectiveFunction(NudgedElasticBand *nebPassed, const Parameters ¶metersPassed)
Definition
NudgedElasticBand.h:121
eonc::NEBObjectiveFunction::setPositions
void setPositions(const VectorXd &x)
Definition
NEBObjectiveFunction.cpp:59
eonc::NudgedElasticBand
Definition
NudgedElasticBand.h:38
eonc::NudgedElasticBand::compute
NudgedElasticBand::NEBStatus compute(void)
Definition
NudgedElasticBand.cpp:280
eonc::NudgedElasticBand::NudgedElasticBand
NudgedElasticBand(std::shared_ptr< Matter > initialPassed, std::shared_ptr< Matter > finalPassed, const Parameters ¶metersPassed, std::shared_ptr< Potential > potPassed)
Definition
NudgedElasticBand.cpp:50
eonc::NudgedElasticBand::prepareSolidState
void prepareSolidState()
Definition
NudgedElasticBand.cpp:914
eonc::NudgedElasticBand::extremumEnergy
std::vector< double > extremumEnergy
Definition
NudgedElasticBand.h:87
eonc::NudgedElasticBand::solidState_
bool solidState_
Definition
NudgedElasticBand.h:112
eonc::NudgedElasticBand::maxEnergyImage
std::size_t maxEnergyImage
Definition
NudgedElasticBand.h:91
eonc::NudgedElasticBand::tangent
std::vector< std::shared_ptr< AtomMatrix > > tangent
Definition
NudgedElasticBand.h:85
eonc::NudgedElasticBand::solidJacobian_
double solidJacobian_
Definition
NudgedElasticBand.h:113
eonc::NudgedElasticBand::log
eonc::log::Scoped log
Definition
NudgedElasticBand.h:107
eonc::NudgedElasticBand::printImageData
void printImageData(bool writeToFile=false, size_t idx=0)
Definition
NudgedElasticBand.cpp:832
eonc::NudgedElasticBand::path
std::vector< std::shared_ptr< Matter > > path
Definition
NudgedElasticBand.h:84
eonc::NudgedElasticBand::perImagePotentials_
bool perImagePotentials_
Whether per-image potential instances exist.
Definition
NudgedElasticBand.h:93
eonc::NudgedElasticBand::findExtrema
void findExtrema(void)
Definition
NudgedElasticBand.cpp:838
eonc::NudgedElasticBand::solidJacobian
double solidJacobian() const noexcept
Definition
NudgedElasticBand.h:61
eonc::NudgedElasticBand::ksp
double ksp
Definition
NudgedElasticBand.h:95
eonc::NudgedElasticBand::reactantEnergy
double reactantEnergy
Definition
NudgedElasticBand.h:83
eonc::NudgedElasticBand::atoms
int atoms
Definition
NudgedElasticBand.h:79
eonc::NudgedElasticBand::extremumPosition
std::vector< double > extremumPosition
Definition
NudgedElasticBand.h:88
eonc::NudgedElasticBand::eigenmode_solvers
std::vector< std::shared_ptr< EigenmodeStrategy > > eigenmode_solvers
Definition
NudgedElasticBand.h:77
eonc::NudgedElasticBand::k_l
double k_l
Definition
NudgedElasticBand.h:97
eonc::NudgedElasticBand::params
Parameters params
Definition
NudgedElasticBand.h:104
eonc::NudgedElasticBand::numImages
long numImages
Definition
NudgedElasticBand.h:80
eonc::NudgedElasticBand::movedAfterForceCall
bool movedAfterForceCall
Definition
NudgedElasticBand.h:92
eonc::NudgedElasticBand::projectSolidState
void projectSolidState(bool ci_active)
Definition
NudgedElasticBand.cpp:938
eonc::NudgedElasticBand::baseline_force
double baseline_force
Definition
NudgedElasticBand.h:103
eonc::NudgedElasticBand::pathFrames
std::vector< readcon::ConFrame > pathFrames(std::optional< size_t > bandIndex=std::nullopt)
In-memory ConFrames with the same NEB stamps as writePathCon / neb.con.
Definition
NudgedElasticBand.cpp:847
eonc::NudgedElasticBand::cellForce
const Matrix3d & cellForce(long image) const
Definition
NudgedElasticBand.h:62
eonc::NudgedElasticBand::E_ref
double E_ref
Definition
NudgedElasticBand.h:98
eonc::NudgedElasticBand::convergenceForce
double convergenceForce(void)
Definition
NudgedElasticBand.cpp:573
eonc::NudgedElasticBand::tangentStrat_
neb::TangentStrategy tangentStrat_
Definition
NudgedElasticBand.h:110
eonc::NudgedElasticBand::projectedForce
std::vector< std::shared_ptr< AtomMatrix > > projectedForce
Definition
NudgedElasticBand.h:86
eonc::NudgedElasticBand::setCIEnabled
void setCIEnabled(bool enabled)
Definition
NudgedElasticBand.h:67
eonc::NudgedElasticBand::~NudgedElasticBand
~NudgedElasticBand()=default
eonc::NudgedElasticBand::status
NEBStatus status
Definition
NudgedElasticBand.h:106
eonc::NudgedElasticBand::pot
std::shared_ptr< Potential > pot
Definition
NudgedElasticBand.h:105
eonc::NudgedElasticBand::getStatus
NudgedElasticBand::NEBStatus getStatus()
Definition
NudgedElasticBand.h:59
eonc::NudgedElasticBand::ci_enabled_
bool ci_enabled_
Definition
NudgedElasticBand.h:102
eonc::NudgedElasticBand::projectionStrat_
neb::ProjectionStrategy projectionStrat_
Definition
NudgedElasticBand.h:111
eonc::NudgedElasticBand::k_u
double k_u
Definition
NudgedElasticBand.h:96
eonc::NudgedElasticBand::extremumCurvature
std::vector< double > extremumCurvature
Definition
NudgedElasticBand.h:89
eonc::NudgedElasticBand::solidState
bool solidState() const noexcept
Definition
NudgedElasticBand.h:60
eonc::NudgedElasticBand::numExtrema
long numExtrema
Definition
NudgedElasticBand.h:80
eonc::NudgedElasticBand::updateForces
void updateForces(void)
Definition
NudgedElasticBand.h:66
eonc::NudgedElasticBand::NEBStatus
NEBStatus
Definition
NudgedElasticBand.h:42
eonc::NudgedElasticBand::NEBStatus::RUNNING
@ RUNNING
Definition
NudgedElasticBand.h:46
eonc::NudgedElasticBand::NEBStatus::GOOD
@ GOOD
Definition
NudgedElasticBand.h:43
eonc::NudgedElasticBand::NEBStatus::MAX_UNCERTAINTY
@ MAX_UNCERTAINTY
Definition
NudgedElasticBand.h:47
eonc::NudgedElasticBand::NEBStatus::BAD_MAX_ITERATIONS
@ BAD_MAX_ITERATIONS
Definition
NudgedElasticBand.h:45
eonc::NudgedElasticBand::NEBStatus::INIT
@ INIT
Definition
NudgedElasticBand.h:44
eonc::NudgedElasticBand::projectedCellForce
std::vector< Matrix3d > projectedCellForce
Definition
NudgedElasticBand.h:114
eonc::NudgedElasticBand::climbingImage
long climbingImage
Definition
NudgedElasticBand.h:80
eonc::ObjectiveFunction::ObjectiveFunction
ObjectiveFunction(const Parameters ¶msPassed)
Definition
ObjectiveFunction.h:25
eonc::Parameters
Definition
Parameters.h:35
eonc::neb::OCINEBController
Goswami (in prep).
Definition
NEBOcinebController.h:26
eonc::neb
Definition
NEBForceProjection.cpp:18
eonc::neb::ProjectionStrategy
std::variant< PlainEB, NEB_Projection, DNEB_Projection > ProjectionStrategy
Definition
NEBProjection.h:50
eonc::neb::TangentStrategy
std::variant< SimpleTangent, ImprovedTangent > TangentStrategy
Definition
NEBTangent.h:38
eonc
RAII resource manager for the ARTn C library with global synchronization.
Definition
ARTnSaddleSearch.cpp:23
eonc::log::Scoped
RAII helper for class-scoped logging.
Definition
EonLogger.h:171
include
eon
NudgedElasticBand.h
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf