52 std::vector<std::vector<double>>
H;
54 std::vector<std::vector<double>>
force;
56 std::vector<std::vector<double>>
pos;
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;
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,
97 std::vector<std::vector<double>>&
pos);
105 std::vector<std::vector<double>>&
pos_taud);
122 std::vector<double>&
force,
123 std::vector<double>&
force0,
127 std::vector<std::vector<double>>&
s,
128 std::vector<std::vector<double>>&
y,
129 std::vector<double>&
rho);
138 std::vector<std::vector<double>>&
dpos,
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