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
15int Quickmin::step(double a_maxMove) {
16 Eigen::VectorXd force = -m_objf->getGradient();
17 if (m_optConfig.opts.quickmin.steepest_descent) {
18 m_vel.setZero();
19 } else {
20 if (m_vel.dot(force) < 0) {
21 m_vel.setZero();
22 } else {
23 Eigen::VectorXd f_unit = force.normalized();
24 m_vel = m_vel.dot(f_unit) * f_unit;
25 }
26 }
27
28 m_vel += force * m_dt;
29 Eigen::VectorXd dr = eonc::helpers::maxAtomMotionAppliedV(
30 m_vel * m_dt,
31 a_maxMove); // used to be m_optConfig.opts.max_time_step
32 QUILL_LOG_INFO(m_log, "{} M_Vel.norm() is {}", m_iteration, m_vel.norm());
33 m_objf->setPositions(m_objf->getPositions() + dr);
35 return m_objf->isConverged() ? 1 : 0;
36}
37
38int Quickmin::run(size_t a_maxSteps, double a_maxMove) {
39 while (!m_objf->isConverged() && m_iteration < a_maxSteps) {
40 step(a_maxMove);
41 }
42 return m_objf->isConverged() ? 1 : 0;
43}
int step(double a_maxMove) override
Definition Quickmin.cpp:15
const OptimizerConfig m_optConfig
Definition Optimizer.h:67
std::shared_ptr< ObjectiveFunction > m_objf
Definition Optimizer.h:68
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 step(double a_maxMove) override
Definition Quickmin.cpp:15
size_t m_iteration
Definition Quickmin.h:42
int run(size_t a_maxIterations, double a_maxMove) override
Definition Quickmin.cpp:38
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)