1#ifndef SPIN_CONSTRAIN_H
2#define SPIN_CONSTRAIN_H
37 double alpha_trial_in,
39 double sc_drop_thr_in,
79 const std::complex<double>* becp_k,
81 const int nbands,
const int nkb,
const int* nh_iat);
84 bool check_rms_stop(
int outer_step,
int i_step,
double rms_error,
double duration,
double total_duration);
98 const double alpha_trial);
105 void print_Mi(std::ofstream& ofs_running);
150 void set_lnchiCounts(
const std::map<
int, std::map<int, int>>& lnchiCounts_in);
168 const std::vector<ModuleBase::Vector3<double>>&
get_sc_lambda()
const;
170 const std::vector<ModuleBase::Vector3<double>>&
get_target_mag()
const;
172 const std::vector<ModuleBase::Vector3<int>>&
get_constrain()
const;
180 int get_iat(
int itype,
int atom_index);
201 double alpha_trial_in,
203 double sc_drop_thr_in);
229 std::map<int, std::vector<ScAtomData>>
ScData;
235 std::vector<ModuleBase::Vector3<double>>
lambda_;
237 std::vector<ModuleBase::Vector3<double>>
Mi_;
3 elements vector
Definition vector3.h:22
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
Definition parallel_orbitals.h:9
Definition density_matrix.h:36
Definition elecstate.h:15
Definition spin_constrain.h:28
TK * sub_s_save
Definition spin_constrain.h:270
bool is_Mi_converged
if atomic magnetic moment is converged
Definition spin_constrain.h:267
~SpinConstrain()
Definition spin_constrain.h:226
bool check_gradient_decay(std::vector< ModuleBase::Vector3< double > > new_spin, std::vector< ModuleBase::Vector3< double > > old_spin, std::vector< ModuleBase::Vector3< double > > new_delta_lambda, std::vector< ModuleBase::Vector3< double > > old_delta_lambda, bool print=false)
check gradient decay
std::vector< ModuleBase::Vector3< int > > constrain_
Definition spin_constrain.h:250
void update_psi_charge(const ModuleBase::Vector3< double > *delta_lambda, bool pw_solve=true)
update the charge density for LCAO base with new lambda update the charge density and psi for PW base...
bool mag_converged() const
get is_Mi_converged
Definition spin_constrain.h:262
void set_mag_converged(bool is_Mi_converged_in)
set is_Mi_converged
Definition spin_constrain.h:260
Parallel_Orbitals * ParaV
Definition spin_constrain.h:117
hamilt::Operator< TK > * p_operator
operator for spin-constrained DFT, used for calculating current atomic magnetic moment
Definition spin_constrain.h:265
int get_ntype()
get ntype
Definition spin_constrain.cpp:87
void init_sc(double sc_thr_in, int nsc_in, int nsc_min_in, double alpha_trial_in, double sccut_in, double sc_drop_thr_in, const UnitCell &ucell, Parallel_Orbitals *ParaV_in, int nspin_in, const K_Vectors &kv_in, void *p_hamilt_in, void *psi_in, elecstate::ElecState *pelec_in, ModulePW::PW_Basis_K *pw_wfc_in=nullptr)
initialize spin-constrained DFT
Definition init_sc.cpp:5
TK * becp_save
Definition spin_constrain.h:271
void set_solver_parameters(const K_Vectors &kv_in, void *p_hamilt_in, void *psi_in, elecstate::ElecState *pelec_in)
set parameters for solver
Definition spin_constrain.cpp:490
double tpiba
Definition spin_constrain.h:127
void set_sc_lambda()
set sc_lambda
Definition spin_constrain.cpp:175
const std::map< int, int > & get_atomCounts() const
get element index to atom index map
Definition spin_constrain.cpp:52
double alpha_trial_
Definition spin_constrain.h:252
void set_nspin(int nspin)
set nspin
Definition spin_constrain.cpp:59
double get_sc_thr()
get sc_thr
Definition spin_constrain.cpp:442
const std::map< int, std::map< int, int > > & get_lnchiCounts() const
get lnchiCounts
Definition spin_constrain.cpp:168
TK * sub_h_save
Definition spin_constrain.h:269
double current_sc_thr_
Definition spin_constrain.h:249
SpinConstrain & operator=(SpinConstrain &&)=delete
std::vector< ModuleBase::Vector3< double > > target_mag_
Definition spin_constrain.h:236
SpinConstrain()
Definition spin_constrain.h:225
bool higher_mag_prec
use rerun to get higher precision in lambda_loop for PW base
Definition spin_constrain.h:111
const std::vector< ModuleBase::Vector3< int > > & get_constrain() const
get constrain
Definition spin_constrain.cpp:357
SpinConstrain(SpinConstrain &&)=delete
double restrict_current_
Definition spin_constrain.h:253
int get_nat()
get nat
Definition spin_constrain.cpp:76
void print_Mi(std::ofstream &ofs_running)
print mi
Definition spin_constrain.cpp:515
void print_termination()
print termination message
void set_atomCounts(const std::map< int, int > &atomCounts_in)
set element index to atom index map
Definition spin_constrain.cpp:44
const std::vector< ModuleBase::Vector3< double > > & get_sc_lambda() const
get sc_lambda
Definition spin_constrain.cpp:344
std::vector< ModuleBase::Vector3< double > > Mi_
Definition spin_constrain.h:237
int get_nspin()
get nspin
Definition spin_constrain.cpp:70
void set_ParaV(Parallel_Orbitals *ParaV_in)
set orbital parallel info
Definition spin_constrain.cpp:503
int get_iat(int itype, int atom_index)
get iat
Definition spin_constrain.cpp:120
int get_nsc_min()
get nsc_min
Definition spin_constrain.cpp:456
double get_alpha_trial()
get alpha_trial
Definition spin_constrain.cpp:463
static SpinConstrain & getScInstance()
Public method to access the Singleton instance.
Definition spin_constrain.cpp:12
ModulePW::PW_Basis_K * pw_wfc_
Definition spin_constrain.h:123
double cal_escon()
calculate the energy of \sum_i \lambda_i * Mi if this->is_mag_converged is true, then this function w...
Definition spin_constrain.cpp:19
void set_constrain()
set constrain
Definition spin_constrain.cpp:238
std::map< int, std::map< int, int > > lnchiCounts
Definition spin_constrain.h:234
void print_header()
print header info
void check_atomCounts()
check atomCounts
Definition spin_constrain.cpp:93
void set_lnchiCounts(const std::map< int, std::map< int, int > > &lnchiCounts_in)
set lnchiCounts
Definition spin_constrain.cpp:160
void cal_mi_lcao(const int &step, bool print=false)
calculate the magnetization of each atom with real space projection method for LCAO base
std::vector< double > decay_grad_
Definition spin_constrain.h:231
const double meV_to_Ry
save ucell.tpiba
Definition spin_constrain.h:128
void cal_mw_from_lambda(int i_step, const ModuleBase::Vector3< double > *delta_lambda=nullptr)
int npol_
Definition spin_constrain.h:241
elecstate::ElecState * pelec
Definition spin_constrain.h:122
double cal_alpha_opt(std::vector< ModuleBase::Vector3< double > > spin, std::vector< ModuleBase::Vector3< double > > spin_plus, const double alpha_trial)
calculate alpha_opt
int nsc_min_
Definition spin_constrain.h:246
const std::vector< double > & get_decay_grad()
get decay_grad
Definition spin_constrain.cpp:401
const std::vector< ModuleBase::Vector3< double > > & get_target_mag() const
get target_mag
Definition spin_constrain.cpp:350
void run_lambda_loop(int outer_step, bool rerun=true)
void * p_hamilt
Definition spin_constrain.h:120
double get_sccut()
get sccut
Definition spin_constrain.cpp:470
double escon_
Definition spin_constrain.h:239
bool check_rms_stop(int outer_step, int i_step, double rms_error, double duration, double total_duration)
lambda loop helper functions
std::vector< ModuleBase::Vector3< double > > lambda_
Definition spin_constrain.h:235
std::map< int, double > ScDecayGrad
Definition spin_constrain.h:230
int nspin_
Definition spin_constrain.h:240
void set_decay_grad()
set decay_grad
Definition spin_constrain.cpp:388
void print_Mag_Force(std::ofstream &ofs_running)
print magnetic force, defined as \frac{\delta{L}}/{\delta{Mi}} = -lambda[iat])
Definition spin_constrain.cpp:560
void set_target_mag()
set target_mag
Definition spin_constrain.cpp:198
K_Vectors kv_
Definition spin_constrain.h:129
std::map< int, int > orbitalCounts
Definition spin_constrain.h:233
SpinConstrain(SpinConstrain const &)=delete
Delete copy and move constructors and assign operators.
std::map< int, int > atomCounts
Definition spin_constrain.h:232
int nsc_
Definition spin_constrain.h:245
void zero_Mi()
zero atomic magnetic moment
Definition spin_constrain.cpp:364
double sc_thr_
Definition spin_constrain.h:248
std::vector< std::string > atomLabels_
Definition spin_constrain.h:238
const std::map< int, int > & get_orbitalCounts() const
get element index to orbital index map
Definition spin_constrain.cpp:153
void check_restriction(const std::vector< ModuleBase::Vector3< double > > &search, double &alpha_trial)
apply restriction
std::map< int, std::vector< ScAtomData > > ScData
Definition spin_constrain.h:229
double sc_drop_thr_
Definition spin_constrain.h:247
SpinConstrain & operator=(SpinConstrain const &)=delete
void set_operator(hamilt::Operator< TK > *op_in)
save operator for spin-constrained DFT
int get_nsc()
get nsc
Definition spin_constrain.cpp:449
bool debug
Definition spin_constrain.h:251
void set_sc_drop_thr(double sc_drop_thr_in)
set decay grad switch
Definition spin_constrain.cpp:477
double get_sc_drop_thr()
get sc_drop_thr
Definition spin_constrain.cpp:484
void calculate_delta_hcc(std::complex< double > *h_tmp, const std::complex< double > *becp_k, const ModuleBase::Vector3< double > *delta_lambda, const int nbands, const int nkb, const int *nh_iat)
void set_orbitalCounts(const std::map< int, int > &orbitalCounts_in)
set element index to orbital index map
Definition spin_constrain.cpp:145
void set_input_parameters(double sc_thr_in, int nsc_in, int nsc_min_in, double alpha_trial_in, double sccut_in, double sc_drop_thr_in)
set input parameters
Definition spin_constrain.cpp:425
double get_escon()
Definition spin_constrain.cpp:37
Definition spin_constrain.cpp:9
base device SOURCES math_hegvd_test cpp endif() if(ENABLE_GOOGLEBENCH) AddTest(TARGET PERF_MODULE_HSOLVER_KERNELS LIBS parameter $
Definition CMakeLists.txt:10
struct for storing parameters of non-collinear spin-constrained DFT
Definition spin_constrain.h:278
std::vector< double > target_mag
Definition spin_constrain.h:281
std::vector< int > constrain
Definition spin_constrain.h:282
double target_mag_angle1
Definition spin_constrain.h:285
double target_mag_val
Definition spin_constrain.h:284
double target_mag_angle2
Definition spin_constrain.h:286
std::vector< double > lambda
Definition spin_constrain.h:280
int mag_type
Definition spin_constrain.h:283
int index
Definition spin_constrain.h:279