1#ifndef SPIN_CONSTRAIN_H
2#define SPIN_CONSTRAIN_H
22template <
typename FPTYPE>
33 double alpha_trial_in,
35 double sc_drop_thr_in,
72 bool check_rms_stop(
int outer_step,
int i_step,
double rms_error,
double duration,
double total_duration);
86 const double alpha_trial);
93 void print_Mi(std::ofstream& ofs_running);
135 void set_lnchiCounts(
const std::map<
int, std::map<int, int>>& lnchiCounts_in);
153 const std::vector<ModuleBase::Vector3<double>>&
get_sc_lambda()
const;
155 const std::vector<ModuleBase::Vector3<double>>&
get_target_mag()
const;
157 const std::vector<ModuleBase::Vector3<int>>&
get_constrain()
const;
165 int get_iat(
int itype,
int atom_index);
186 double alpha_trial_in,
188 double sc_drop_thr_in);
214 std::map<int, std::vector<ScAtomData>>
ScData;
220 std::vector<ModuleBase::Vector3<double>>
lambda_;
222 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 elecstate.h:15
Definition spin_constrain.h:24
std::vector< std::string > atomLabels_
Definition spin_constrain.h:223
int get_nat()
get nat
Definition spin_constrain.cpp:76
double get_sccut()
get sccut
Definition spin_constrain.cpp:470
void print_Mi(std::ofstream &ofs_running)
print mi
Definition spin_constrain.cpp:515
void set_sc_lambda()
set sc_lambda
Definition spin_constrain.cpp:175
void set_target_mag()
set target_mag
Definition spin_constrain.cpp:198
const std::vector< ModuleBase::Vector3< double > > & get_target_mag() const
get target_mag
Definition spin_constrain.cpp:350
double get_escon()
Definition spin_constrain.cpp:37
Parallel_Orbitals * ParaV
Definition spin_constrain.h:105
int get_nsc_min()
get nsc_min
Definition spin_constrain.cpp:456
double sc_drop_thr_
Definition spin_constrain.h:232
void cal_mi_lcao(const int &step, bool print=false)
calculate the magnetization of each atom with real space projection method for LCAO base
FPTYPE * becp_save
Definition spin_constrain.h:256
void set_decay_grad()
set decay_grad
Definition spin_constrain.cpp:388
int get_nspin()
get nspin
Definition spin_constrain.cpp:70
double alpha_trial_
Definition spin_constrain.h:237
void cal_mw_from_lambda(int i_step, const ModuleBase::Vector3< double > *delta_lambda=nullptr)
static SpinConstrain & getScInstance()
Public method to access the Singleton instance.
Definition spin_constrain.cpp:12
const double meV_to_Ry
save ucell.tpiba
Definition spin_constrain.h:113
void set_operator(hamilt::Operator< FPTYPE > *op_in)
save operator for spin-constrained DFT
bool higher_mag_prec
use rerun to get higher precision in lambda_loop for PW base
Definition spin_constrain.h:99
std::map< int, int > atomCounts
Definition spin_constrain.h:217
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< int > > & get_constrain() const
get constrain
Definition spin_constrain.cpp:357
std::map< int, int > orbitalCounts
Definition spin_constrain.h:218
double escon_
Definition spin_constrain.h:224
SpinConstrain()
Definition spin_constrain.h:210
int nspin_
Definition spin_constrain.h:225
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
double current_sc_thr_
Definition spin_constrain.h:234
bool mag_converged() const
get is_Mi_converged
Definition spin_constrain.h:247
double cal_alpha_opt(std::vector< ModuleBase::Vector3< double > > spin, std::vector< ModuleBase::Vector3< double > > spin_plus, const double alpha_trial)
calculate alpha_opt
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
void set_solver_parameters(K_Vectors &kv_in, void *p_hamilt_in, void *psi_in, elecstate::ElecState *pelec_in)
set parameters for solver
Definition spin_constrain.cpp:490
int get_nsc()
get nsc
Definition spin_constrain.cpp:449
SpinConstrain(SpinConstrain &&)=delete
FPTYPE * sub_s_save
Definition spin_constrain.h:255
SpinConstrain & operator=(SpinConstrain const &)=delete
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 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...
std::map< int, std::vector< ScAtomData > > ScData
Definition spin_constrain.h:214
SpinConstrain(SpinConstrain const &)=delete
Delete copy and move constructors and assign operators.
SpinConstrain & operator=(SpinConstrain &&)=delete
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_constrain()
set constrain
Definition spin_constrain.cpp:238
void set_ParaV(Parallel_Orbitals *ParaV_in)
set orbital parallel info
Definition spin_constrain.cpp:503
void zero_Mi()
zero atomic magnetic moment
Definition spin_constrain.cpp:364
K_Vectors kv_
Definition spin_constrain.h:114
std::vector< double > decay_grad_
Definition spin_constrain.h:216
const std::vector< ModuleBase::Vector3< double > > & get_sc_lambda() const
get sc_lambda
Definition spin_constrain.cpp:344
std::map< int, double > ScDecayGrad
Definition spin_constrain.h:215
double restrict_current_
Definition spin_constrain.h:238
void run_lambda_loop(int outer_step, bool rerun=true)
int nsc_min_
Definition spin_constrain.h:231
void set_sc_drop_thr(double sc_drop_thr_in)
set decay grad switch
Definition spin_constrain.cpp:477
void set_lnchiCounts(const std::map< int, std::map< int, int > > &lnchiCounts_in)
set lnchiCounts
Definition spin_constrain.cpp:160
bool debug
Definition spin_constrain.h:236
int get_iat(int itype, int atom_index)
get iat
Definition spin_constrain.cpp:120
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
const std::map< int, std::map< int, int > > & get_lnchiCounts() const
get lnchiCounts
Definition spin_constrain.cpp:168
void set_orbitalCounts(const std::map< int, int > &orbitalCounts_in)
set element index to orbital index map
Definition spin_constrain.cpp:145
void * p_hamilt
Definition spin_constrain.h:108
void print_header()
print header info
double sc_thr_
Definition spin_constrain.h:233
double get_sc_drop_thr()
get sc_drop_thr
Definition spin_constrain.cpp:484
std::vector< ModuleBase::Vector3< double > > target_mag_
Definition spin_constrain.h:221
std::vector< ModuleBase::Vector3< double > > lambda_
Definition spin_constrain.h:220
double get_sc_thr()
get sc_thr
Definition spin_constrain.cpp:442
ModulePW::PW_Basis_K * pw_wfc_
Definition spin_constrain.h:111
int get_ntype()
get ntype
Definition spin_constrain.cpp:87
bool check_rms_stop(int outer_step, int i_step, double rms_error, double duration, double total_duration)
lambda loop helper functions
~SpinConstrain()
Definition spin_constrain.h:211
double get_alpha_trial()
get alpha_trial
Definition spin_constrain.cpp:463
FPTYPE * sub_h_save
Definition spin_constrain.h:254
bool is_Mi_converged
if atomic magnetic moment is converged
Definition spin_constrain.h:252
elecstate::ElecState * pelec
Definition spin_constrain.h:110
void set_mag_converged(bool is_Mi_converged_in)
set is_Mi_converged
Definition spin_constrain.h:245
std::map< int, std::map< int, int > > lnchiCounts
Definition spin_constrain.h:219
hamilt::Operator< FPTYPE > * p_operator
operator for spin-constrained DFT, used for calculating current atomic magnetic moment
Definition spin_constrain.h:250
std::vector< ModuleBase::Vector3< int > > constrain_
Definition spin_constrain.h:235
void check_restriction(const std::vector< ModuleBase::Vector3< double > > &search, double &alpha_trial)
apply restriction
const std::vector< double > & get_decay_grad()
get decay_grad
Definition spin_constrain.cpp:401
void check_atomCounts()
check atomCounts
Definition spin_constrain.cpp:93
const std::map< int, int > & get_orbitalCounts() const
get element index to orbital index map
Definition spin_constrain.cpp:153
double tpiba
Definition spin_constrain.h:112
const std::map< int, int > & get_atomCounts() const
get element index to atom index map
Definition spin_constrain.cpp:52
void set_nspin(int nspin)
set nspin
Definition spin_constrain.cpp:59
int npol_
Definition spin_constrain.h:226
void print_termination()
print termination message
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, 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
int nsc_
Definition spin_constrain.h:230
std::vector< ModuleBase::Vector3< double > > Mi_
Definition spin_constrain.h:222
Definition spin_constrain.cpp:9
struct for storing parameters of non-collinear spin-constrained DFT
Definition spin_constrain.h:263
std::vector< double > target_mag
Definition spin_constrain.h:266
std::vector< int > constrain
Definition spin_constrain.h:267
double target_mag_angle1
Definition spin_constrain.h:270
double target_mag_val
Definition spin_constrain.h:269
double target_mag_angle2
Definition spin_constrain.h:271
std::vector< double > lambda
Definition spin_constrain.h:265
int mag_type
Definition spin_constrain.h:268
int index
Definition spin_constrain.h:264