eOn client
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
NEBTangent.cpp
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
#include "
eon/NEBTangent.h
"
13
14
#include <algorithm>
15
#include <cmath>
16
17
namespace
eonc::neb
{
18
19
namespace
{
21
AtomMatrix
normalizeTangent(
AtomMatrix
tang,
const
AtomMatrix
&posDiffNext) {
22
double
norm = tang.norm();
23
if
(norm > 1e-10) {
24
tang /= norm;
25
}
else
{
26
tang = posDiffNext;
27
norm = tang.norm();
28
if
(norm > 1e-10) {
29
tang /= norm;
30
}
31
}
32
return
tang;
33
}
34
}
// namespace
35
36
AtomMatrix
SimpleTangent::compute
(
const
AtomMatrix
&posDiffNext,
37
const
AtomMatrix
&
/*posDiffPrev*/
,
38
double
/*energy*/
,
double
/*energyPrev*/
,
39
double
/*energyNext*/
)
const
{
40
return
normalizeTangent(posDiffNext, posDiffNext);
41
}
42
43
AtomMatrix
ImprovedTangent::compute
(
const
AtomMatrix
&posDiffNext,
44
const
AtomMatrix
&posDiffPrev,
45
double
energy,
double
energyPrev,
46
double
energyNext)
const
{
47
AtomMatrix
tang;
48
49
if
(energyNext > energy && energy > energyPrev) {
50
tang = posDiffNext;
51
}
else
if
(energy > energyNext && energyPrev > energy) {
52
tang = posDiffPrev;
53
}
else
{
54
// Extremum: energy-weighted combination
55
double
energyDiffPrev = energyPrev - energy;
56
double
energyDiffNext = energyNext - energy;
57
double
minDiffEnergy =
58
std::min(std::abs(energyDiffPrev), std::abs(energyDiffNext));
59
double
maxDiffEnergy =
60
std::max(std::abs(energyDiffPrev), std::abs(energyDiffNext));
61
62
if
(energyDiffPrev > energyDiffNext) {
63
tang = posDiffNext * minDiffEnergy + posDiffPrev * maxDiffEnergy;
64
}
else
{
65
tang = posDiffNext * maxDiffEnergy + posDiffPrev * minDiffEnergy;
66
}
67
}
68
69
return
normalizeTangent(tang, posDiffNext);
70
}
71
72
TangentStrategy
buildTangentStrategy
(
const
Parameters
¶ms) {
73
if
(params.
neb_options
.
climbing_image
.
use_old_tangent
) {
74
return
SimpleTangent
{};
75
}
76
return
ImprovedTangent
{};
77
}
78
79
}
// namespace eonc::neb
AtomMatrix
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition
Eigen.h:37
NEBTangent.h
eonc::Parameters
Definition
Parameters.h:28
eonc::Parameters::neb_options
struct eonc::Parameters::neb_options_t neb_options
eonc::neb
Definition
NEBForceProjection.cpp:18
eonc::neb::buildTangentStrategy
TangentStrategy buildTangentStrategy(const Parameters ¶ms)
Build the tangent strategy from parameters.
Definition
NEBTangent.cpp:72
eonc::neb::TangentStrategy
std::variant< SimpleTangent, ImprovedTangent > TangentStrategy
Definition
NEBTangent.h:38
eonc::Parameters::neb_options_t::climbing_image_options_t::use_old_tangent
bool use_old_tangent
Definition
Parameters.h:502
eonc::Parameters::neb_options_t::climbing_image
struct eonc::Parameters::neb_options_t::climbing_image_options_t climbing_image
eonc::neb::ImprovedTangent
Henkelman & Jonsson, JCP 113:9978, 2000.
Definition
NEBTangent.h:32
eonc::neb::ImprovedTangent::compute
AtomMatrix compute(const AtomMatrix &posDiffNext, const AtomMatrix &posDiffPrev, double energy, double energyPrev, double energyNext) const
Definition
NEBTangent.cpp:43
eonc::neb::SimpleTangent
Mills, Jonsson, Schenter, Surf.
Definition
NEBTangent.h:23
eonc::neb::SimpleTangent::compute
AtomMatrix compute(const AtomMatrix &posDiffNext, const AtomMatrix &posDiffPrev, double energy, double energyPrev, double energyNext) const
Definition
NEBTangent.cpp:36
client
NEBTangent.cpp
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf