Loading...
Searching...
No Matches
Quickmin.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/Quickmin.h"
13#include "eon/HelperFunctions.h"
14
15#include <cmath>
16
17namespace eonc {
18
19int Quickmin::step(double a_maxMove) {
20 Eigen::VectorXd force = -m_objf->getGradient();
21 const double fn = force.norm();
22 if (!(fn > 0.0) || !std::isfinite(fn)) {
24 return 1;
25 }
26 if (m_optConfig.opts.quickmin.steepest_descent) {
27 m_vel.setZero();
28 } else {
29 if (m_vel.dot(force) < 0) {
30 m_vel.setZero();
31 } else {
32 const Eigen::VectorXd f_unit = force / fn;
33 m_vel = m_vel.dot(f_unit) * f_unit;
34 }
35 }
36
37 m_vel += force * m_dt;
38 Eigen::VectorXd dr = eonc::geometry::maxAtomMotionAppliedV(
39 m_vel * m_dt,
40 a_maxMove); // used to be m_optConfig.opts.max_time_step
41 QUILL_LOG_INFO(m_log, "{} M_Vel.norm() is {}", m_iteration, m_vel.norm());
42 m_objf->setPositions(m_objf->getPositions() + dr);
44 return m_objf->isConverged() ? 1 : 0;
45}
46
47int Quickmin::run(size_t a_maxSteps, double a_maxMove) {
48 while (!m_objf->isConverged() && m_iteration < a_maxSteps) {
49 step(a_maxMove);
50 }
51 return m_objf->isConverged() ? 1 : 0;
52}
53
54} // namespace eonc
const OptimizerConfig m_optConfig
Definition Optimizer.h:69
std::shared_ptr< ObjectiveFunction > m_objf
Definition Optimizer.h:70
double m_dt
Definition Quickmin.h:40
Eigen::VectorXd m_vel
Definition Quickmin.h:41
eonc::log::FileScoped m_log
Definition Quickmin.h:43
int run(size_t a_maxIterations, double a_maxMove) override
Definition Quickmin.cpp:47
size_t m_iteration
Definition Quickmin.h:42
int step(double a_maxMove) override
Definition Quickmin.cpp:19
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)
RAII resource manager for the ARTn C library with global synchronization.