ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
lbfgs.h
Go to the documentation of this file.
1#ifndef LBFGS_H
2#define LBFGS_H
3
4#include <vector>
5#include <tuple>
6#include <algorithm>
7#include <cmath>
8#include "matrix_methods.h"
9//#include "line_search.h"
10#include "source_base/matrix.h"
11#include "source_base/matrix3.h"
15
20class LBFGS
21{
22public:
27 void allocate(const int _size);
28
36 void relax_step(const ModuleBase::matrix _force,
37 UnitCell& ucell,
38 const double &etot);
39
40private:
41 //LineSearch l_search;
42 double alpha;
43 double maxstep;
44 int size;
45 int memory;
46 double H0;
48 double energy;
49 double alpha_k;
50
52 std::vector<std::vector<double>> H;
53 std::vector<double> force0;
54 std::vector<std::vector<double>> force;
55 std::vector<double> pos0;
56 std::vector<std::vector<double>> pos;
57 std::vector<double> pos_taud0;
58 std::vector<std::vector<double>> pos_taud;
59 std::vector<std::vector<double>> dpos;
60 std::vector<std::vector<double>> s;
61 std::vector<std::vector<double>> y;
62 std::vector<double> rho;
63 std::vector<double> steplength;
64
68 void prepare_step(std::vector<std::vector<double>>& force,
69 std::vector<std::vector<double>>& pos,
70 std::vector<std::vector<double>>& H,
71 std::vector<double>& pos0,
72 std::vector<double>& force0,
73 std::vector<std::vector<double>>& dpos,
74 UnitCell& ucell,
75 const double &etot);
76
81 void is_restrain(std::vector<std::vector<double>>& dpos);
82
89 UnitCell& ucell);
90
96 void get_pos(UnitCell& ucell,
97 std::vector<std::vector<double>>& pos);
98
104 void get_pos_taud(UnitCell& ucell,
105 std::vector<std::vector<double>>& pos_taud);
106
120 void update(std::vector<std::vector<double>>& pos_taud,
121 std::vector<double>& pos_taud0,
122 std::vector<double>& force,
123 std::vector<double>& force0,
124 UnitCell& ucell,
125 int iteration,
126 int memory,
127 std::vector<std::vector<double>>& s,
128 std::vector<std::vector<double>>& y,
129 std::vector<double>& rho);
130
137 void determine_step(std::vector<double>& steplength,
138 std::vector<std::vector<double>>& dpos,
139 double& maxstep);
140
145 void update_pos(UnitCell& ucell);
146};
147
148#endif
Implements L-BFGS optimization algorithm for structural relaxation.
Definition lbfgs.h:21
std::vector< double > rho
Scalar products for L-BFGS update.
Definition lbfgs.h:62
std::vector< double > steplength
Step lengths for each atom.
Definition lbfgs.h:63
void prepare_step(std::vector< std::vector< double > > &force, std::vector< std::vector< double > > &pos, std::vector< std::vector< double > > &H, std::vector< double > &pos0, std::vector< double > &force0, std::vector< std::vector< double > > &dpos, UnitCell &ucell, const double &etot)
Prepare optimization step parameters.
Definition lbfgs.cpp:102
std::vector< std::vector< double > > y
Force difference vectors.
Definition lbfgs.h:61
int memory
Number of previous steps to store.
Definition lbfgs.h:45
void update_pos(UnitCell &ucell)
Update atomic positions in unit cell.
Definition lbfgs.cpp:241
void update(std::vector< std::vector< double > > &pos_taud, std::vector< double > &pos_taud0, std::vector< double > &force, std::vector< double > &force0, UnitCell &ucell, int iteration, int memory, std::vector< std::vector< double > > &s, std::vector< std::vector< double > > &y, std::vector< double > &rho)
Update L-BFGS history buffers.
Definition lbfgs.cpp:153
std::vector< std::vector< double > > force
Force history.
Definition lbfgs.h:54
std::vector< double > pos_taud0
Previous fractional positions.
Definition lbfgs.h:57
void get_pos(UnitCell &ucell, std::vector< std::vector< double > > &pos)
Extract atomic positions from unit cell.
Definition lbfgs.cpp:72
ModuleESolver::ESolver * solver
Structure solver.
Definition lbfgs.h:51
std::vector< std::vector< double > > H
Inverse Hessian approximation.
Definition lbfgs.h:52
std::vector< std::vector< double > > dpos
Position displacements.
Definition lbfgs.h:59
double H0
Initial inverse Hessian approximation.
Definition lbfgs.h:46
void relax_step(const ModuleBase::matrix _force, UnitCell &ucell, const double &etot)
Perform one L-BFGS relaxation step.
Definition lbfgs.cpp:29
void calculate_largest_grad(const ModuleBase::matrix &_force, UnitCell &ucell)
Calculate maximum gradient component.
Definition lbfgs.cpp:260
double alpha_k
Step size parameter.
Definition lbfgs.h:49
int iteration
Current iteration count.
Definition lbfgs.h:47
void allocate(const int _size)
Initialize L-BFGS parameters.
Definition lbfgs.cpp:9
std::vector< std::vector< double > > pos
Position history.
Definition lbfgs.h:56
std::vector< double > force0
Previous step forces.
Definition lbfgs.h:53
std::vector< double > pos0
Previous positions.
Definition lbfgs.h:55
std::vector< std::vector< double > > s
Position difference vectors.
Definition lbfgs.h:60
void determine_step(std::vector< double > &steplength, std::vector< std::vector< double > > &dpos, double &maxstep)
Determine optimal step lengths.
Definition lbfgs.cpp:225
int size
Number of atoms in system.
Definition lbfgs.h:44
double maxstep
Maximum allowed step length.
Definition lbfgs.h:43
double alpha
Initial Hessian diagonal element.
Definition lbfgs.h:42
void get_pos_taud(UnitCell &ucell, std::vector< std::vector< double > > &pos_taud)
Get fractional positions from unit cell.
Definition lbfgs.cpp:87
std::vector< std::vector< double > > pos_taud
Fractional position history.
Definition lbfgs.h:58
double energy
Current system energy.
Definition lbfgs.h:48
void is_restrain(std::vector< std::vector< double > > &dpos)
Judge if the cell is restrain.
Definition lbfgs.cpp:255
Definition matrix.h:19
Definition esolver.h:11
Definition unitcell.h:16