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
19namespace eonc {
20
21int 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);
56 }
57 } else {
58 m_dt = m_dt * m_f_dec;
59 m_vel.setZero();
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
73 return m_objf->isConverged() ? 1 : 0;
74}
75
76int 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
Eigen::VectorXd m_vel
Definition FIRE.h:38
double m_dt_max
Definition FIRE.h:36
double m_f_inc
Definition FIRE.h:41
size_t m_N_min
Definition FIRE.h:37
double m_alpha_start
Definition FIRE.h:39
int step(double a_maxMove) override
Definition FIRE.cpp:21
double m_f_a
Definition FIRE.h:43
eonc::log::FileScoped m_log
Definition FIRE.h:45
size_t m_iteration
Definition FIRE.h:44
int run(size_t a_maxIterations, double a_maxMove) override
Definition FIRE.cpp:76
size_t m_N
Definition FIRE.h:37
double m_alpha
Definition FIRE.h:40
double m_f_dec
Definition FIRE.h:42
double m_dt
Definition FIRE.h:36
std::shared_ptr< ObjectiveFunction > m_objf
Definition Optimizer.h:70
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)
RAII resource manager for the ARTn C library with global synchronization.