ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
bfgs.h
Go to the documentation of this file.
1#ifndef BFGS_H
2#define BFGS_H
3
4#include <vector>
5#include <tuple>
6#include<algorithm>
7#include<cmath>
11
12#include "matrix_methods.h"
13
14class BFGS
15{
16public:
17 void allocate(const int _size);//initialize parameters
18 void relax_step(const ModuleBase::matrix& _force,UnitCell& ucell);//a full iteration step
19
20
21private:
22 bool sign;//check if this is the first iteration
23 double alpha;//initialize H,diagonal element is alpha
24 double maxstep;//every movement smaller than maxstep
26 int size;//number of atoms
27
28 std::vector<double> steplength;//the length of atoms displacement
29 std::vector<std::vector<double>> H;//Hessian matrix
30 std::vector<double> force0;//force in previous step
31 std::vector<ModuleBase::Vector3<double>> force;
32 std::vector<double> pos0;//atom pos in previous step(cartesian coordinates)
33 std::vector<ModuleBase::Vector3<double>> pos;
34 std::vector<double> pos_taud0;//atom pos in previous step(relative coordinates)
35 std::vector<ModuleBase::Vector3<double>> pos_taud;
36 std::vector<ModuleBase::Vector3<double>> dpos;
37
38 void PrepareStep(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<double>& steplength,std::vector<ModuleBase::Vector3<double>>& dpos,int& size,UnitCell& ucell);//calculate the atomic displacement in one iteration step
39 void IsRestrain();//check if converged
40 void CalculateLargestGrad(const ModuleBase::matrix& _force,UnitCell& ucell);
41 void GetPos(UnitCell& ucell,std::vector<ModuleBase::Vector3<double>>& pos);
43 void Update(std::vector<double>& pos, std::vector<double>& force,std::vector<std::vector<double>>& H,UnitCell& ucell);//update hessian matrix
44 void DetermineStep(std::vector<double>& steplength,std::vector<ModuleBase::Vector3<double>>& dpos,double& maxstep);//normalize large atomic displacements based on maxstep
45 void UpdatePos(UnitCell& ucell);//update ucell with the new coordinates
46
47};
48
49#endif // BFGS_H
Definition bfgs.h:15
void GetPos(UnitCell &ucell, std::vector< ModuleBase::Vector3< double > > &pos)
Definition bfgs.cpp:82
std::vector< ModuleBase::Vector3< double > > pos
Definition bfgs.h:33
double maxstep
Definition bfgs.h:24
double alpha
Definition bfgs.h:23
void DetermineStep(std::vector< double > &steplength, std::vector< ModuleBase::Vector3< double > > &dpos, double &maxstep)
Definition bfgs.cpp:251
void GetPostaud(UnitCell &ucell, std::vector< ModuleBase::Vector3< double > > &pos_taud)
Definition bfgs.cpp:98
std::vector< double > pos_taud0
Definition bfgs.h:34
void IsRestrain()
Definition bfgs.cpp:359
void allocate(const int _size)
initialize H0、H、pos0、force0、force
Definition bfgs.cpp:10
std::vector< ModuleBase::Vector3< double > > pos_taud
Definition bfgs.h:35
void CalculateLargestGrad(const ModuleBase::matrix &_force, UnitCell &ucell)
Definition bfgs.cpp:322
bool sign
Definition bfgs.h:22
std::vector< std::vector< double > > H
Definition bfgs.h:29
void relax_step(const ModuleBase::matrix &_force, UnitCell &ucell)
Definition bfgs.cpp:36
std::vector< double > steplength
Definition bfgs.h:28
std::vector< ModuleBase::Vector3< double > > dpos
Definition bfgs.h:36
std::vector< ModuleBase::Vector3< double > > force
Definition bfgs.h:31
void PrepareStep(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< double > &steplength, std::vector< ModuleBase::Vector3< double > > &dpos, int &size, UnitCell &ucell)
Definition bfgs.cpp:115
std::vector< double > pos0
Definition bfgs.h:32
void UpdatePos(UnitCell &ucell)
Definition bfgs.cpp:271
int size
Definition bfgs.h:26
void Update(std::vector< double > &pos, std::vector< double > &force, std::vector< std::vector< double > > &H, UnitCell &ucell)
Definition bfgs.cpp:175
double largest_grad
Definition bfgs.h:25
std::vector< double > force0
Definition bfgs.h:30
3 elements vector
Definition vector3.h:22
Definition matrix.h:19
Definition unitcell.h:17