ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
ModuleESolver::ESolver_OF Class Reference

#include <opt_test_tools.h>

Inheritance diagram for ModuleESolver::ESolver_OF:
Collaboration diagram for ModuleESolver::ESolver_OF:

Public Member Functions

 ESolver_OF ()
 
 ~ESolver_OF ()
 
double func (double *x)
 
void dfuncdx (double *x, double *gradient)
 
double dfuncdstp (double *x, double *p)
 
 ESolver_OF ()
 
 ~ESolver_OF ()
 
virtual void before_all_runners (UnitCell &ucell, const Input_para &inp) override
 Initialize of the first-principels energy solver.
 
virtual void runner (UnitCell &ucell, const int istep) override
 run energy solver
 
virtual void after_all_runners (UnitCell &ucell) override
 Output the FINAL_ETOT.
 
virtual double cal_energy () override
 Calculate the total energy. NOTE THIS FUNCTION SHOULD BE CALLEDD AFTER POTENTIAL HAS BEEN UPDATED.
 
virtual void cal_force (UnitCell &ucell, ModuleBase::matrix &force) override
 Calculate the force.
 
virtual void cal_stress (UnitCell &ucell, ModuleBase::matrix &stress) override
 Calculate the stress.
 
- Public Member Functions inherited from ModuleESolver::ESolver_FP
 ESolver_FP ()
 Constructor.
 
virtual ~ESolver_FP ()
 Deconstructor.
 
- Public Member Functions inherited from ModuleESolver::ESolver
 ESolver ()
 
virtual ~ESolver ()
 
virtual void others (UnitCell &ucell, const int istep)
 

Public Attributes

double * x
 
- Public Attributes inherited from ModuleESolver::ESolver
bool conv_esolver = true
 
std::string classname
 

Private Member Functions

void before_opt (const int istep, UnitCell &ucell)
 Prepare to optimize the charge density, update elecstate, kedf, and opts if needed calculate ewald energy, initialize the rho, phi, theta.
 
void update_potential (UnitCell &ucell)
 Get dL/dphi = dL/drho * drho/dphi = (dE/drho - mu) * 2 * phi, as well as normdLdphi = sqrt{<dL/dphi|dL/dphi>}.
 
void optimize (UnitCell &ucell)
 Get the optimization direction (this->pdirection_) and the step length (this->theta)
 
void update_rho ()
 Update the charge density and "wavefunction" (phi) after one step of optimization phi = cos(theta) * phi + sin(theta) * direction, rho = phi^2.
 
bool check_exit (bool &conv_esolver)
 Check convergence, return ture if converge or iter >= max_iter_, and print the necessary information.
 
void after_opt (const int istep, UnitCell &ucell, const bool conv_esolver)
 After optimization, output the charge density, effective potential, ..., if needed.
 
void init_elecstate (UnitCell &ucell)
 Initialize this->pelec, as well as this->pelec->pot.
 
void allocate_array ()
 Allocate the arrays, as well as this->psi_ and this->ptemp_rho_.
 
void cal_potential_wrapper (double *ptemp_phi, double *rdLdphi)
 
void cal_potential (double *ptemp_phi, double *rdLdphi, UnitCell &ucell)
 Get dL/dphi = dL/drho * drho/dphi = (dE/drho - mu) * 2 * ptemp_phi and store it in rdLdphi.
 
void cal_dEdtheta (double **ptemp_phi, Charge *temp_rho, UnitCell &ucell, double *ptheta, double *rdEdtheta)
 Calculate dE/dTheta and store it in rdEdtheta. dE/dTheta = <dE / dtemp_phi | dtemp_phi / dTheta> = <dE / dtemp_phi | - sin(theta) * phi + cos(theta) * direction>
 
double cal_mu (double *pphi, double *pdEdphi, double nelec)
 Calculate the chemical potential mu. mu = <dE/dphi|phi> / (2 * nelec)
 
void adjust_direction ()
 Rotate and renormalize the direction |d>, make it orthogonal to phi (<d|phi> = 0), and <d|d> = nelec.
 
void check_direction (double *dEdtheta, double **ptemp_phi, UnitCell &ucell)
 Make sure that dEdtheta<0 at theta = 0, preparing to call the line search.
 
void test_direction (double *dEdtheta, double **ptemp_phi, UnitCell &ucell)
 ONLY used for test. Check the validity of KEDF.
 
void print_info (const bool conv_esolver)
 Print nessecary information to the screen, and write the components of the total energy into running_log.
 
double inner_product (double *pa, double *pb, int length, double dV=1)
 
void init_opt ()
 [Interface to opt] Initialize the opts
 
void get_direction (UnitCell &ucell)
 [Interface to opt] Call optimization methods to get the optimization direction
 
void get_step_length (double *dEdtheta, double **ptemp_phi, UnitCell &ucell)
 [Interface to opt] Call line search to find the best step length
 

Private Attributes

KEDF_Managerkedf_manager_ = nullptr
 
ModuleBase::Opt_CGopt_cg_ = nullptr
 
ModuleBase::Opt_TNopt_tn_ = nullptr
 
ModuleBase::Opt_DCsrchopt_dcsrch_ = nullptr
 
ModuleBase::Opt_CGopt_cg_mag_ = nullptr
 
std::string of_kinetic_ = "wt"
 
std::string of_method_ = "tn"
 
std::string of_conv_ = "energy"
 
double of_tole_ = 2e-6
 
double of_tolp_ = 1e-5
 
int max_iter_ = 50
 
double dV_ = 0
 
double * nelec_ = nullptr
 
int iter_ = 0
 
double ** pdirect_ = nullptr
 
std::complex< double > ** precip_dir_ = nullptr
 
double * theta_ = nullptr
 
double ** pdEdphi_ = nullptr
 
double ** pdLdphi_ = nullptr
 
double ** pphi_ = nullptr
 
char * task_ = nullptr
 
int tn_spin_flag_ = -1
 
int max_dcsrch_ = 200
 
int flag_ = -1
 
Chargeptemp_rho_ = nullptr
 
psi::Psi< double > * psi_ = nullptr
 
double energy_llast_ = 0
 
double energy_last_ = 0
 
double energy_current_ = 0
 
double normdLdphi_llast_ = 100
 
double normdLdphi_last_ = 100
 
double normdLdphi_ = 100.
 
std::function< void(double *, double *)> bound_cal_potential_
 

Additional Inherited Members

- Protected Member Functions inherited from ModuleESolver::ESolver_FP
virtual void before_scf (UnitCell &ucell, const int istep)
 Something to do before SCF iterations.
 
virtual void after_scf (UnitCell &ucell, const int istep, const bool conv_esolver)
 Something to do after SCF iterations when SCF is converged or comes to the max iter step.
 
virtual void iter_finish (UnitCell &ucell, const int istep, int &iter, bool &conv_esolver)
 Something to do after hamilt2rho function in each iter loop.
 
- Protected Attributes inherited from ModuleESolver::ESolver_FP
elecstate::ElecStatepelec = nullptr
 Electronic states.
 
K_Vectors kv
 K points in Brillouin zone.
 
Charge chr
 Electorn charge density.
 
ModulePW::PW_Basispw_rho
 
ModulePW::PW_Basispw_rhod
 
ModulePW::PW_Basis_Bigpw_big
 dense grid for USPP
 
Parallel_Grid Pgrid
 parallel for rho grid
 
Structure_Factor sf
 Structure factors that used with plane-wave basis set.
 
pseudopot_cell_vl locpp
 local pseudopotentials
 
Charge_Extra CE
 charge extrapolation method
 
surchem solvent
 solvent model
 
int pw_rho_flag = false
 flag for pw_rho, 0: not initialized, 1: initialized
 
double iter_time
 the start time of scf iteration
 

Constructor & Destructor Documentation

◆ ESolver_OF() [1/2]

ModuleESolver::ESolver_OF::ESolver_OF ( )
inline

◆ ~ESolver_OF() [1/2]

ModuleESolver::ESolver_OF::~ESolver_OF ( )
inline

◆ ESolver_OF() [2/2]

ModuleESolver::ESolver_OF::ESolver_OF ( )

◆ ~ESolver_OF() [2/2]

ModuleESolver::ESolver_OF::~ESolver_OF ( )

Member Function Documentation

◆ adjust_direction()

void ModuleESolver::ESolver_OF::adjust_direction ( )
private

Rotate and renormalize the direction |d>, make it orthogonal to phi (<d|phi> = 0), and <d|d> = nelec.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ after_all_runners()

void ModuleESolver::ESolver_OF::after_all_runners ( UnitCell ucell)
overridevirtual

Output the FINAL_ETOT.

Reimplemented from ModuleESolver::ESolver_FP.

Here is the call graph for this function:

◆ after_opt()

void ModuleESolver::ESolver_OF::after_opt ( const int  istep,
UnitCell ucell,
const bool  conv_esolver 
)
private

After optimization, output the charge density, effective potential, ..., if needed.

Parameters
istep
ucell
Here is the call graph for this function:
Here is the caller graph for this function:

◆ allocate_array()

void ModuleESolver::ESolver_OF::allocate_array ( )
private

Allocate the arrays, as well as this->psi_ and this->ptemp_rho_.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ before_all_runners()

void ModuleESolver::ESolver_OF::before_all_runners ( UnitCell ucell,
const Input_para inp 
)
overridevirtual

Initialize of the first-principels energy solver.

1) read pseudopotentials

2) initialie the plane wave basis for rho

3) initialize the double grid (for uspp) if necessary

4) print some information

5) initialize the charge extrapolation method if necessary

Reimplemented from ModuleESolver::ESolver_FP.

Here is the call graph for this function:

◆ before_opt()

void ModuleESolver::ESolver_OF::before_opt ( const int  istep,
UnitCell ucell 
)
private

Prepare to optimize the charge density, update elecstate, kedf, and opts if needed calculate ewald energy, initialize the rho, phi, theta.

Parameters
istep
ucell

1) call before_scf() of ESolver_FP

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cal_dEdtheta()

void ModuleESolver::ESolver_OF::cal_dEdtheta ( double **  ptemp_phi,
Charge temp_rho,
UnitCell ucell,
double *  ptheta,
double *  rdEdtheta 
)
private

Calculate dE/dTheta and store it in rdEdtheta. dE/dTheta = <dE / dtemp_phi | dtemp_phi / dTheta> = <dE / dtemp_phi | - sin(theta) * phi + cos(theta) * direction>

Parameters
[in]ptemp_phi
[in]temp_rho
[in]ucell
[in]ptheta
[out]rdEdthetadE/dTheta
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cal_energy()

double ModuleESolver::ESolver_OF::cal_energy ( )
overridevirtual

Calculate the total energy. NOTE THIS FUNCTION SHOULD BE CALLEDD AFTER POTENTIAL HAS BEEN UPDATED.

Returns
total energy

Implements ModuleESolver::ESolver.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cal_force()

void ModuleESolver::ESolver_OF::cal_force ( UnitCell ucell,
ModuleBase::matrix force 
)
overridevirtual

Calculate the force.

Parameters
[out]force

Implements ModuleESolver::ESolver.

Here is the call graph for this function:

◆ cal_mu()

double ModuleESolver::ESolver_OF::cal_mu ( double *  pphi,
double *  pdEdphi,
double  nelec 
)
private

Calculate the chemical potential mu. mu = <dE/dphi|phi> / (2 * nelec)

Parameters
pphi
pdEdphi
nelec
Returns
mu
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cal_potential()

void ModuleESolver::ESolver_OF::cal_potential ( double *  ptemp_phi,
double *  rdLdphi,
UnitCell ucell 
)
private

Get dL/dphi = dL/drho * drho/dphi = (dE/drho - mu) * 2 * ptemp_phi and store it in rdLdphi.

Parameters
[in]ptemp_phiphi
[out]rdLdphidL/dphi
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cal_potential_wrapper()

void ModuleESolver::ESolver_OF::cal_potential_wrapper ( double *  ptemp_phi,
double *  rdLdphi 
)
private
Here is the caller graph for this function:

◆ cal_stress()

void ModuleESolver::ESolver_OF::cal_stress ( UnitCell ucell,
ModuleBase::matrix stress 
)
overridevirtual

Calculate the stress.

Parameters
[out]stress

Implements ModuleESolver::ESolver.

Here is the call graph for this function:

◆ check_direction()

void ModuleESolver::ESolver_OF::check_direction ( double *  dEdtheta,
double **  ptemp_phi,
UnitCell ucell 
)
private

Make sure that dEdtheta<0 at theta = 0, preparing to call the line search.

Parameters
dEdtheta
ptemp_phi
ucell
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_exit()

bool ModuleESolver::ESolver_OF::check_exit ( bool &  conv_esolver)
private

Check convergence, return ture if converge or iter >= max_iter_, and print the necessary information.

Returns
exit or not
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dfuncdstp()

double ModuleESolver::ESolver_OF::dfuncdstp ( double *  x,
double *  p 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dfuncdx()

void ModuleESolver::ESolver_OF::dfuncdx ( double *  x,
double *  gradient 
)
Here is the caller graph for this function:

◆ func()

double ModuleESolver::ESolver_OF::func ( double *  x)
Here is the caller graph for this function:

◆ get_direction()

void ModuleESolver::ESolver_OF::get_direction ( UnitCell ucell)
private

[Interface to opt] Call optimization methods to get the optimization direction

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_step_length()

void ModuleESolver::ESolver_OF::get_step_length ( double *  dEdtheta,
double **  ptemp_phi,
UnitCell ucell 
)
private

[Interface to opt] Call line search to find the best step length

Parameters
dEdthetad E / d theta
ptemp_phi
ucell
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_elecstate()

void ModuleESolver::ESolver_OF::init_elecstate ( UnitCell ucell)
private

Initialize this->pelec, as well as this->pelec->pot.

Parameters
ucell
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_opt()

void ModuleESolver::ESolver_OF::init_opt ( )
private

[Interface to opt] Initialize the opts

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inner_product()

double ModuleESolver::ESolver_OF::inner_product ( double *  pa,
double *  pb,
int  length,
double  dV = 1 
)
inlineprivate
Here is the call graph for this function:
Here is the caller graph for this function:

◆ optimize()

void ModuleESolver::ESolver_OF::optimize ( UnitCell ucell)
private

Get the optimization direction (this->pdirection_) and the step length (this->theta)

Parameters
ucell
Here is the call graph for this function:
Here is the caller graph for this function:

◆ print_info()

void ModuleESolver::ESolver_OF::print_info ( const bool  conv_esolver)
private

Print nessecary information to the screen, and write the components of the total energy into running_log.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ runner()

void ModuleESolver::ESolver_OF::runner ( UnitCell cell,
const int  istep 
)
overridevirtual

run energy solver

Implements ModuleESolver::ESolver.

Here is the call graph for this function:

◆ test_direction()

void ModuleESolver::ESolver_OF::test_direction ( double *  dEdtheta,
double **  ptemp_phi,
UnitCell ucell 
)
private

ONLY used for test. Check the validity of KEDF.

Parameters
dEdtheta
ptemp_phi
ucell
Here is the call graph for this function:

◆ update_potential()

void ModuleESolver::ESolver_OF::update_potential ( UnitCell ucell)
private

Get dL/dphi = dL/drho * drho/dphi = (dE/drho - mu) * 2 * phi, as well as normdLdphi = sqrt{<dL/dphi|dL/dphi>}.

Parameters
ucell
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_rho()

void ModuleESolver::ESolver_OF::update_rho ( )
private

Update the charge density and "wavefunction" (phi) after one step of optimization phi = cos(theta) * phi + sin(theta) * direction, rho = phi^2.

Here is the caller graph for this function:

Member Data Documentation

◆ bound_cal_potential_

std::function<void(double*, double*)> ModuleESolver::ESolver_OF::bound_cal_potential_
private

◆ dV_

double ModuleESolver::ESolver_OF::dV_ = 0
private

◆ energy_current_

double ModuleESolver::ESolver_OF::energy_current_ = 0
private

◆ energy_last_

double ModuleESolver::ESolver_OF::energy_last_ = 0
private

◆ energy_llast_

double ModuleESolver::ESolver_OF::energy_llast_ = 0
private

◆ flag_

int ModuleESolver::ESolver_OF::flag_ = -1
private

◆ iter_

int ModuleESolver::ESolver_OF::iter_ = 0
private

◆ kedf_manager_

KEDF_Manager* ModuleESolver::ESolver_OF::kedf_manager_ = nullptr
private

◆ max_dcsrch_

int ModuleESolver::ESolver_OF::max_dcsrch_ = 200
private

◆ max_iter_

int ModuleESolver::ESolver_OF::max_iter_ = 50
private

◆ nelec_

double* ModuleESolver::ESolver_OF::nelec_ = nullptr
private

◆ normdLdphi_

double ModuleESolver::ESolver_OF::normdLdphi_ = 100.
private

◆ normdLdphi_last_

double ModuleESolver::ESolver_OF::normdLdphi_last_ = 100
private

◆ normdLdphi_llast_

double ModuleESolver::ESolver_OF::normdLdphi_llast_ = 100
private

◆ of_conv_

std::string ModuleESolver::ESolver_OF::of_conv_ = "energy"
private

◆ of_kinetic_

std::string ModuleESolver::ESolver_OF::of_kinetic_ = "wt"
private

◆ of_method_

std::string ModuleESolver::ESolver_OF::of_method_ = "tn"
private

◆ of_tole_

double ModuleESolver::ESolver_OF::of_tole_ = 2e-6
private

◆ of_tolp_

double ModuleESolver::ESolver_OF::of_tolp_ = 1e-5
private

◆ opt_cg_

ModuleBase::Opt_CG* ModuleESolver::ESolver_OF::opt_cg_ = nullptr
private

◆ opt_cg_mag_

ModuleBase::Opt_CG* ModuleESolver::ESolver_OF::opt_cg_mag_ = nullptr
private

◆ opt_dcsrch_

ModuleBase::Opt_DCsrch* ModuleESolver::ESolver_OF::opt_dcsrch_ = nullptr
private

◆ opt_tn_

ModuleBase::Opt_TN* ModuleESolver::ESolver_OF::opt_tn_ = nullptr
private

◆ pdEdphi_

double** ModuleESolver::ESolver_OF::pdEdphi_ = nullptr
private

◆ pdirect_

double** ModuleESolver::ESolver_OF::pdirect_ = nullptr
private

◆ pdLdphi_

double** ModuleESolver::ESolver_OF::pdLdphi_ = nullptr
private

◆ pphi_

double** ModuleESolver::ESolver_OF::pphi_ = nullptr
private

◆ precip_dir_

std::complex<double>** ModuleESolver::ESolver_OF::precip_dir_ = nullptr
private

◆ psi_

psi::Psi<double>* ModuleESolver::ESolver_OF::psi_ = nullptr
private

◆ ptemp_rho_

Charge* ModuleESolver::ESolver_OF::ptemp_rho_ = nullptr
private

◆ task_

char* ModuleESolver::ESolver_OF::task_ = nullptr
private

◆ theta_

double* ModuleESolver::ESolver_OF::theta_ = nullptr
private

◆ tn_spin_flag_

int ModuleESolver::ESolver_OF::tn_spin_flag_ = -1
private

◆ x

double* ModuleESolver::ESolver_OF::x

The documentation for this class was generated from the following files: