eOn client
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
void
updateForces
(
bool
ci_active);
61
void
updateForces
(
void
) {
updateForces
(
ci_enabled_
); }
62
void
setCIEnabled
(
bool
enabled) {
ci_enabled_
= enabled; }
63
double
convergenceForce
(
void
);
64
void
findExtrema
(
void
);
65
void
printImageData
(
bool
writeToFile =
false
,
size_t
idx = 0);
66
69
[[nodiscard]] std::vector<readcon::ConFrame>
70
pathFrames
(std::optional<size_t> bandIndex = std::nullopt);
71
72
std::vector<std::shared_ptr<EigenmodeStrategy>>
eigenmode_solvers
;
73
74
int
atoms
{0};
75
long
numImages
{0},
climbingImage
{0},
numExtrema
{0};
76
std::vector<std::shared_ptr<Matter>>
path
;
// NEB images
77
std::vector<std::shared_ptr<AtomMatrix>>
tangent
;
78
std::vector<std::shared_ptr<AtomMatrix>>
projectedForce
;
79
std::vector<double>
extremumEnergy
;
80
std::vector<double>
extremumPosition
;
81
std::vector<double>
extremumCurvature
;
82
83
std::size_t
maxEnergyImage
{0};
84
bool
movedAfterForceCall
{
false
};
85
bool
perImagePotentials_
{
86
false
};
87
double
ksp
{0.0};
88
double
k_u
{0.0};
// Upper-bound value for the spring constant
89
double
k_l
{0.0};
// Lower-bound value for the spring constant
90
double
E_ref
;
// Reference energy chosen to be equal to the max energy of the
91
// reactant or product energy minimum
92
93
private
:
94
bool
ci_enabled_
{
false
};
// runtime CI state, set by compute()
95
double
baseline_force
{-1.0};
96
Parameters
params
;
97
std::shared_ptr<Potential>
pot
;
98
NEBStatus
status
;
99
eonc::log::Scoped
log
;
100
101
// Cached strategies (constant across iterations)
102
neb::TangentStrategy
tangentStrat_
;
103
neb::ProjectionStrategy
projectionStrat_
;
104
};
105
106
class
NEBObjectiveFunction
:
public
ObjectiveFunction
{
107
public
:
108
NEBObjectiveFunction
(
NudgedElasticBand
*nebPassed,
109
const
Parameters
¶metersPassed)
110
:
ObjectiveFunction
(parametersPassed),
111
neb
{nebPassed} {}
112
// This is the odd one out, doesn't take a Matter so we null it
113
114
~NEBObjectiveFunction
(
void
) {};
115
116
VectorXd
getGradient
(
bool
fdstep =
false
);
117
double
getEnergy
();
118
void
setPositions
(
const
VectorXd &x);
119
VectorXd
getPositions
();
120
int
degreesOfFreedom
();
121
bool
isConverged
();
122
bool
isUncertain
();
123
double
getConvergence
();
124
VectorXd
difference
(
const
VectorXd &a,
const
VectorXd &b);
125
NudgedElasticBand::NEBStatus
status
;
126
127
private
:
128
NudgedElasticBand
*
neb
;
129
};
130
131
}
// namespace eonc
132
133
using
eonc::NEBObjectiveFunction
;
134
using
eonc::NudgedElasticBand
;
Eigen.h
EigenmodeStrategy.h
EonLogger.h
HelperFunctions.h
Matter.h
NEBProjection.h
NEBTangent.h
ObjectiveFunction.h
Parameters.h
eonc::NEBObjectiveFunction
Definition
NudgedElasticBand.h:106
eonc::NEBObjectiveFunction::getGradient
VectorXd getGradient(bool fdstep=false)
Definition
NEBObjectiveFunction.cpp:16
eonc::NEBObjectiveFunction::getPositions
VectorXd getPositions()
Definition
NEBObjectiveFunction.cpp:46
eonc::NEBObjectiveFunction::~NEBObjectiveFunction
~NEBObjectiveFunction(void)
Definition
NudgedElasticBand.h:114
eonc::NEBObjectiveFunction::status
NudgedElasticBand::NEBStatus status
Definition
NudgedElasticBand.h:125
eonc::NEBObjectiveFunction::getConvergence
double getConvergence()
Definition
NEBObjectiveFunction.cpp:81
eonc::NEBObjectiveFunction::getEnergy
double getEnergy()
Definition
NEBObjectiveFunction.cpp:29
eonc::NEBObjectiveFunction::neb
NudgedElasticBand * neb
Definition
NudgedElasticBand.h:128
eonc::NEBObjectiveFunction::difference
VectorXd difference(const VectorXd &a, const VectorXd &b)
Definition
NEBObjectiveFunction.cpp:85
eonc::NEBObjectiveFunction::isConverged
bool isConverged()
Definition
NEBObjectiveFunction.cpp:76
eonc::NEBObjectiveFunction::degreesOfFreedom
int degreesOfFreedom()
Definition
NEBObjectiveFunction.cpp:56
eonc::NEBObjectiveFunction::isUncertain
bool isUncertain()
Definition
NEBObjectiveFunction.cpp:60
eonc::NEBObjectiveFunction::NEBObjectiveFunction
NEBObjectiveFunction(NudgedElasticBand *nebPassed, const Parameters ¶metersPassed)
Definition
NudgedElasticBand.h:108
eonc::NEBObjectiveFunction::setPositions
void setPositions(const VectorXd &x)
Definition
NEBObjectiveFunction.cpp:37
eonc::NudgedElasticBand
Definition
NudgedElasticBand.h:38
eonc::NudgedElasticBand::extremumEnergy
std::vector< double > extremumEnergy
Definition
NudgedElasticBand.h:79
eonc::NudgedElasticBand::printImageData
void printImageData(bool writeToFile=false, size_t idx=0)
Definition
NudgedElasticBand.cpp:650
eonc::NudgedElasticBand::maxEnergyImage
std::size_t maxEnergyImage
Definition
NudgedElasticBand.h:83
eonc::NudgedElasticBand::tangent
std::vector< std::shared_ptr< AtomMatrix > > tangent
Definition
NudgedElasticBand.h:77
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:665
eonc::NudgedElasticBand::log
eonc::log::Scoped log
Definition
NudgedElasticBand.h:99
eonc::NudgedElasticBand::path
std::vector< std::shared_ptr< Matter > > path
Definition
NudgedElasticBand.h:76
eonc::NudgedElasticBand::perImagePotentials_
bool perImagePotentials_
Whether per-image potential instances exist.
Definition
NudgedElasticBand.h:85
eonc::NudgedElasticBand::ksp
double ksp
Definition
NudgedElasticBand.h:87
eonc::NudgedElasticBand::atoms
int atoms
Definition
NudgedElasticBand.h:74
eonc::NudgedElasticBand::extremumPosition
std::vector< double > extremumPosition
Definition
NudgedElasticBand.h:80
eonc::NudgedElasticBand::eigenmode_solvers
std::vector< std::shared_ptr< EigenmodeStrategy > > eigenmode_solvers
Definition
NudgedElasticBand.h:72
eonc::NudgedElasticBand::k_l
double k_l
Definition
NudgedElasticBand.h:89
eonc::NudgedElasticBand::params
Parameters params
Definition
NudgedElasticBand.h:96
eonc::NudgedElasticBand::numImages
long numImages
Definition
NudgedElasticBand.h:75
eonc::NudgedElasticBand::movedAfterForceCall
bool movedAfterForceCall
Definition
NudgedElasticBand.h:84
eonc::NudgedElasticBand::compute
NudgedElasticBand::NEBStatus compute(void)
Definition
NudgedElasticBand.cpp:204
eonc::NudgedElasticBand::convergenceForce
double convergenceForce(void)
Definition
NudgedElasticBand.cpp:433
eonc::NudgedElasticBand::baseline_force
double baseline_force
Definition
NudgedElasticBand.h:95
eonc::NudgedElasticBand::findExtrema
void findExtrema(void)
Definition
NudgedElasticBand.cpp:656
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:35
eonc::NudgedElasticBand::E_ref
double E_ref
Definition
NudgedElasticBand.h:90
eonc::NudgedElasticBand::tangentStrat_
neb::TangentStrategy tangentStrat_
Definition
NudgedElasticBand.h:102
eonc::NudgedElasticBand::projectedForce
std::vector< std::shared_ptr< AtomMatrix > > projectedForce
Definition
NudgedElasticBand.h:78
eonc::NudgedElasticBand::setCIEnabled
void setCIEnabled(bool enabled)
Definition
NudgedElasticBand.h:62
eonc::NudgedElasticBand::~NudgedElasticBand
~NudgedElasticBand()=default
eonc::NudgedElasticBand::status
NEBStatus status
Definition
NudgedElasticBand.h:98
eonc::NudgedElasticBand::pot
std::shared_ptr< Potential > pot
Definition
NudgedElasticBand.h:97
eonc::NudgedElasticBand::getStatus
NudgedElasticBand::NEBStatus getStatus()
Definition
NudgedElasticBand.h:59
eonc::NudgedElasticBand::ci_enabled_
bool ci_enabled_
Definition
NudgedElasticBand.h:94
eonc::NudgedElasticBand::projectionStrat_
neb::ProjectionStrategy projectionStrat_
Definition
NudgedElasticBand.h:103
eonc::NudgedElasticBand::k_u
double k_u
Definition
NudgedElasticBand.h:88
eonc::NudgedElasticBand::extremumCurvature
std::vector< double > extremumCurvature
Definition
NudgedElasticBand.h:81
eonc::NudgedElasticBand::numExtrema
long numExtrema
Definition
NudgedElasticBand.h:75
eonc::NudgedElasticBand::updateForces
void updateForces(void)
Definition
NudgedElasticBand.h:61
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::climbingImage
long climbingImage
Definition
NudgedElasticBand.h:75
eonc::ObjectiveFunction::ObjectiveFunction
ObjectiveFunction(const Parameters ¶msPassed)
Definition
ObjectiveFunction.h:23
eonc::Parameters
Definition
Parameters.h:28
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:49
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:19
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