eOn client
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
int
FIRE::step
(
double
a_maxMove) {
20
double
P = 0;
21
// Check convergence.
22
if
(
m_objf
->isConverged()) {
23
return
1;
24
}
25
26
// Velocity Verlet
27
Eigen::VectorXd f = -
m_objf
->getGradient();
28
Eigen::VectorXd x =
m_objf
->getPositions();
29
30
m_vel
+= f *
m_dt
;
31
Eigen::VectorXd dx =
m_vel
*
m_dt
;
32
33
dx =
eonc::helpers::maxAtomMotionAppliedV
(dx,
m_max_move
);
34
m_objf
->setPositions(x + dx);
35
36
f = -
m_objf
->getGradient();
37
Eigen::VectorXd f_unit = f / f.norm();
38
39
// FIRE
40
P = f.dot(
m_vel
);
41
m_vel
= (1 -
m_alpha
) *
m_vel
+
m_alpha
* f_unit *
m_vel
.norm();
42
QUILL_LOG_DEBUG(
m_log
,
43
"P: {:.4f}, v: {:.4f}, m_dt: {:.4f}, m_alpha: {:.4f}, N: {}"
,
44
P,
m_vel
.norm(),
m_dt
,
m_alpha
,
m_N
);
45
if
(P >= 0) {
46
m_N
++;
47
if
(
m_N
>
m_N_min
) {
48
m_dt
= std::min(
m_dt
*
m_f_inc
,
m_dt_max
);
49
m_alpha
=
m_alpha
*
m_f_a
;
50
}
51
}
else
{
52
m_dt
=
m_dt
*
m_f_dec
;
53
m_vel
.setZero();
54
m_alpha
=
m_alpha_start
;
55
m_N
= 0;
56
}
57
58
// add a sanity check on m_dt
59
if
(
m_dt
< 1e-6) {
60
QUILL_LOG_CRITICAL(
m_log
,
"[FIRE] [critical] m_dt is too small: {:.4f}"
,
61
m_dt
);
62
throw
std::runtime_error(
63
std::format(
"[FIRE] m_dt is too small: {:.4f}"
,
m_dt
));
64
}
65
66
m_iteration
++;
67
return
m_objf
->isConverged() ? 1 : 0;
68
}
69
70
int
FIRE::run
(
size_t
a_maxIterations,
double
a_maxMove) {
71
while
(!
m_objf
->isConverged() &&
m_iteration
< a_maxIterations) {
72
step
(a_maxMove);
73
}
74
return
m_objf
->isConverged() ? 1 : 0;
75
}
FIRE.h
HelperFunctions.h
FIRE::step
int step(double a_maxMove) override
Definition
FIRE.cpp:19
eonc::FIRE::step
int step(double a_maxMove) override
Definition
FIRE.cpp:19
eonc::FIRE::m_vel
Eigen::VectorXd m_vel
Definition
FIRE.h:44
eonc::FIRE::m_dt_max
double m_dt_max
Definition
FIRE.h:42
eonc::FIRE::m_f_inc
double m_f_inc
Definition
FIRE.h:47
eonc::FIRE::m_N_min
size_t m_N_min
Definition
FIRE.h:43
eonc::FIRE::m_alpha_start
double m_alpha_start
Definition
FIRE.h:45
eonc::FIRE::m_f_a
double m_f_a
Definition
FIRE.h:49
eonc::FIRE::run
int run(size_t a_maxIterations, double a_maxMove) override
Definition
FIRE.cpp:70
eonc::FIRE::m_max_move
double m_max_move
Definition
FIRE.h:42
eonc::FIRE::m_log
eonc::log::FileScoped m_log
Definition
FIRE.h:51
eonc::FIRE::m_iteration
size_t m_iteration
Definition
FIRE.h:50
eonc::FIRE::m_N
size_t m_N
Definition
FIRE.h:43
eonc::FIRE::m_alpha
double m_alpha
Definition
FIRE.h:46
eonc::FIRE::m_f_dec
double m_f_dec
Definition
FIRE.h:48
eonc::FIRE::m_dt
double m_dt
Definition
FIRE.h:42
eonc::Optimizer::m_objf
std::shared_ptr< ObjectiveFunction > m_objf
Definition
Optimizer.h:68
eonc::helpers::maxAtomMotionAppliedV
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)
Definition
GeometryAnalysis.cpp:319
client
FIRE.cpp
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf