eOn 3.2.0
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
FIRE.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/FIRE.h
"
13
#include "
eon/HelperFunctions.h
"
14
15
#include <algorithm>
16
#include <format>
17
#include <stdexcept>
18
19
namespace
eonc
{
20
21
int
FIRE::step
(
double
a_maxMove) {
22
double
P = 0;
23
// Check convergence.
24
if
(
m_objf
->isConverged()) {
25
return
1;
26
}
27
28
// Velocity Verlet
29
Eigen::VectorXd f = -
m_objf
->getGradient();
30
Eigen::VectorXd x =
m_objf
->getPositions();
31
32
m_vel
+= f *
m_dt
;
33
Eigen::VectorXd dx =
m_vel
*
m_dt
;
34
35
dx =
eonc::geometry::maxAtomMotionAppliedV
(dx, a_maxMove);
36
m_objf
->setPositions(x + dx);
37
38
f = -
m_objf
->getGradient();
39
const
double
fnorm = f.norm();
40
Eigen::VectorXd f_unit = Eigen::VectorXd::Zero(f.size());
41
if
(fnorm > 0.0) {
42
f_unit = f / fnorm;
43
}
44
45
// FIRE
46
P = f.dot(
m_vel
);
47
m_vel
= (1 -
m_alpha
) *
m_vel
+
m_alpha
* f_unit *
m_vel
.norm();
48
QUILL_LOG_DEBUG(
m_log
,
49
"P: {:.4f}, v: {:.4f}, m_dt: {:.4f}, m_alpha: {:.4f}, N: {}"
,
50
P,
m_vel
.norm(),
m_dt
,
m_alpha
,
m_N
);
51
if
(P >= 0) {
52
m_N
++;
53
if
(
m_N
>
m_N_min
) {
54
m_dt
= std::min(
m_dt
*
m_f_inc
,
m_dt_max
);
55
m_alpha
=
m_alpha
*
m_f_a
;
56
}
57
}
else
{
58
m_dt
=
m_dt
*
m_f_dec
;
59
m_vel
.setZero();
60
m_alpha
=
m_alpha_start
;
61
m_N
= 0;
62
}
63
64
// add a sanity check on m_dt
65
if
(
m_dt
< 1e-6) {
66
QUILL_LOG_CRITICAL(
m_log
,
"[FIRE] [critical] m_dt is too small: {:.4f}"
,
67
m_dt
);
68
throw
std::runtime_error(
69
std::format(
"[FIRE] m_dt is too small: {:.4f}"
,
m_dt
));
70
}
71
72
m_iteration
++;
73
return
m_objf
->isConverged() ? 1 : 0;
74
}
75
76
int
FIRE::run
(
size_t
a_maxIterations,
double
a_maxMove) {
77
while
(!
m_objf
->isConverged() &&
m_iteration
< a_maxIterations) {
78
step
(a_maxMove);
79
}
80
return
m_objf
->isConverged() ? 1 : 0;
81
}
82
83
}
// namespace eonc
FIRE.h
HelperFunctions.h
eonc::FIRE::m_vel
Eigen::VectorXd m_vel
Definition
FIRE.h:38
eonc::FIRE::m_dt_max
double m_dt_max
Definition
FIRE.h:36
eonc::FIRE::m_f_inc
double m_f_inc
Definition
FIRE.h:41
eonc::FIRE::m_N_min
size_t m_N_min
Definition
FIRE.h:37
eonc::FIRE::m_alpha_start
double m_alpha_start
Definition
FIRE.h:39
eonc::FIRE::step
int step(double a_maxMove) override
Definition
FIRE.cpp:21
eonc::FIRE::m_f_a
double m_f_a
Definition
FIRE.h:43
eonc::FIRE::m_log
eonc::log::FileScoped m_log
Definition
FIRE.h:45
eonc::FIRE::m_iteration
size_t m_iteration
Definition
FIRE.h:44
eonc::FIRE::run
int run(size_t a_maxIterations, double a_maxMove) override
Definition
FIRE.cpp:76
eonc::FIRE::m_N
size_t m_N
Definition
FIRE.h:37
eonc::FIRE::m_alpha
double m_alpha
Definition
FIRE.h:40
eonc::FIRE::m_f_dec
double m_f_dec
Definition
FIRE.h:42
eonc::FIRE::m_dt
double m_dt
Definition
FIRE.h:36
eonc::Optimizer::m_objf
std::shared_ptr< ObjectiveFunction > m_objf
Definition
Optimizer.h:70
eonc::geometry::maxAtomMotionAppliedV
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)
Definition
GeometryAnalysis.cpp:319
eonc
RAII resource manager for the ARTn C library with global synchronization.
Definition
ARTnSaddleSearch.cpp:23
client
FIRE.cpp
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf