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
17namespace eonc::neb {
18
19namespace {
21AtomMatrix 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
37 const AtomMatrix & /*posDiffPrev*/,
38 double /*energy*/, double /*energyPrev*/,
39 double /*energyNext*/) const {
40 return normalizeTangent(posDiffNext, posDiffNext);
41}
42
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
78
79} // namespace eonc::neb
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
struct eonc::Parameters::neb_options_t neb_options
TangentStrategy buildTangentStrategy(const Parameters &params)
Build the tangent strategy from parameters.
std::variant< SimpleTangent, ImprovedTangent > TangentStrategy
Definition NEBTangent.h:38
struct eonc::Parameters::neb_options_t::climbing_image_options_t climbing_image
Henkelman & Jonsson, JCP 113:9978, 2000.
Definition NEBTangent.h:32
AtomMatrix compute(const AtomMatrix &posDiffNext, const AtomMatrix &posDiffPrev, double energy, double energyPrev, double energyNext) const
Mills, Jonsson, Schenter, Surf.
Definition NEBTangent.h:23
AtomMatrix compute(const AtomMatrix &posDiffNext, const AtomMatrix &posDiffPrev, double energy, double energyPrev, double energyNext) const