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 "line_search.h"
10#include "source_base/matrix3.h"
14
19class LBFGS
20{
21public:
26 void allocate(const int _size);
27
35 void relax_step(const ModuleBase::matrix _force,
36 UnitCell& ucell,
37 const double &etot);
38
39private:
40 //LineSearch l_search;
41 double alpha;
42 double maxstep;
43 int size;
44 int memory;
45 double H0;
47 double energy;
48 double alpha_k;
49
51 std::vector<double> steplength;//the length of atoms displacement
52 std::vector<std::vector<double>> H;//Hessian matrix
53 std::vector<double> force0;//force in previous step
54 std::vector<ModuleBase::Vector3<double>> force;
55 std::vector<double> pos0;//atom pos in previous step(cartesian coordinates)
56 std::vector<ModuleBase::Vector3<double>> pos;
57 std::vector<double> pos_taud0;//atom pos in previous step(relative coordinates)
58 std::vector<ModuleBase::Vector3<double>> pos_taud;
59 std::vector<ModuleBase::Vector3<double>> dpos;
60 std::vector<std::vector<double>> s;
61 std::vector<std::vector<double>> y;
62 std::vector<double> rho;
63
68 std::vector<ModuleBase::Vector3<double>>& pos,
69 std::vector<std::vector<double>>& H,
70 std::vector<double>& pos0,
71 std::vector<double>& force0,
73 UnitCell& ucell,
74 const double &etot);
75
80 void is_restrain();
81
88 UnitCell& ucell);
89
95 void get_pos(UnitCell& ucell,
96 std::vector<ModuleBase::Vector3<double>>& pos);
97
103 void get_pos_taud(UnitCell& ucell,
105
119 void update(std::vector<ModuleBase::Vector3<double>>& pos_taud,
120 std::vector<double>& pos_taud0,
121 std::vector<double>& force,
122 std::vector<double>& force0,
123 UnitCell& ucell,
124 int iteration,
125 int memory,
126 std::vector<std::vector<double>>& s,
127 std::vector<std::vector<double>>& y,
128 std::vector<double>& rho);
129
136 void determine_step(std::vector<double>& steplength,
137 std::vector<ModuleBase::Vector3<double>>& dpos,
138 double& maxstep);
139
144 void update_pos(UnitCell& ucell);
145};
146
147#endif
Implements L-BFGS optimization algorithm for structural relaxation.
Definition lbfgs.h:20
std::vector< double > rho
Scalar products for L-BFGS update.
Definition lbfgs.h:62
std::vector< ModuleBase::Vector3< double > > pos
Definition lbfgs.h:56
std::vector< double > steplength
Definition lbfgs.h:51
std::vector< std::vector< double > > y
Force difference vectors.
Definition lbfgs.h:61
int memory
Number of previous steps to store.
Definition lbfgs.h:44
std::vector< ModuleBase::Vector3< double > > pos_taud
Definition lbfgs.h:58
void is_restrain()
Judge if the cell is restrain.
Definition lbfgs.cpp:254
void update_pos(UnitCell &ucell)
Update atomic positions in unit cell.
Definition lbfgs.cpp:240
std::vector< ModuleBase::Vector3< double > > force
Definition lbfgs.h:54
std::vector< double > pos_taud0
Definition lbfgs.h:57
ModuleESolver::ESolver * solver
Structure solver.
Definition lbfgs.h:50
std::vector< std::vector< double > > H
Definition lbfgs.h:52
double H0
Initial inverse Hessian approximation.
Definition lbfgs.h:45
void relax_step(const ModuleBase::matrix _force, UnitCell &ucell, const double &etot)
Perform one L-BFGS relaxation step.
Definition lbfgs.cpp:28
void calculate_largest_grad(const ModuleBase::matrix &_force, UnitCell &ucell)
Calculate maximum gradient component.
Definition lbfgs.cpp:259
double alpha_k
Step size parameter.
Definition lbfgs.h:48
void update(std::vector< ModuleBase::Vector3< 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:152
int iteration
Current iteration count.
Definition lbfgs.h:46
void get_pos(UnitCell &ucell, std::vector< ModuleBase::Vector3< double > > &pos)
Extract atomic positions from unit cell.
Definition lbfgs.cpp:71
void allocate(const int _size)
Initialize L-BFGS parameters.
Definition lbfgs.cpp:8
std::vector< double > force0
Definition lbfgs.h:53
std::vector< double > pos0
Definition lbfgs.h:55
void get_pos_taud(UnitCell &ucell, std::vector< ModuleBase::Vector3< double > > &pos_taud)
Get fractional positions from unit cell.
Definition lbfgs.cpp:86
std::vector< std::vector< double > > s
Position difference vectors.
Definition lbfgs.h:60
int size
Number of atoms in system.
Definition lbfgs.h:43
double maxstep
Maximum allowed step length.
Definition lbfgs.h:42
void prepare_step(std::vector< ModuleBase::Vector3< double > > &force, std::vector< ModuleBase::Vector3< double > > &pos, std::vector< std::vector< double > > &H, std::vector< double > &pos0, std::vector< double > &force0, std::vector< ModuleBase::Vector3< double > > &dpos, UnitCell &ucell, const double &etot)
Prepare optimization step parameters.
Definition lbfgs.cpp:101
double alpha
Initial Hessian diagonal element.
Definition lbfgs.h:41
std::vector< ModuleBase::Vector3< double > > dpos
Definition lbfgs.h:59
double energy
Current system energy.
Definition lbfgs.h:47
void determine_step(std::vector< double > &steplength, std::vector< ModuleBase::Vector3< double > > &dpos, double &maxstep)
Determine optimal step lengths.
Definition lbfgs.cpp:224
3 elements vector
Definition vector3.h:24
Definition matrix.h:18
Definition esolver.h:12
Definition unitcell.h:15