ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
spin_constrain.h
Go to the documentation of this file.
1#ifndef SPIN_CONSTRAIN_H
2#define SPIN_CONSTRAIN_H
3
4#include <map>
5#include <vector>
6
10#include "source_base/vector3.h"
12#include "source_cell/klist.h"
16
17#ifdef __LCAO
18#include "source_estate/module_dm/density_matrix.h" // mohan add 2025-11-02
19#endif
20
21namespace spinconstrain
22{
23
24struct ScAtomData;
25
26template <typename TK>
28{
29public:
34 void init_sc(double sc_thr_in,
35 int nsc_in,
36 int nsc_min_in,
37 double alpha_trial_in,
38 double sccut_in,
39 double sc_drop_thr_in,
40 const UnitCell& ucell,
41 Parallel_Orbitals* ParaV_in,
42 int nspin_in,
43 const K_Vectors& kv_in,
44 void* p_hamilt_in,
45 void* psi_in,
46#ifdef __LCAO
47 elecstate::DensityMatrix<TK, double> *dm_in, // mohan add 2025-11-02
48#endif
49 elecstate::ElecState* pelec_in,
50 ModulePW::PW_Basis_K* pw_wfc_in = nullptr);
51
55 void cal_mi_lcao(const int& step, bool print = false);
56
57 void cal_mi_pw();
58
59 void cal_mw_from_lambda(int i_step,
60 const ModuleBase::Vector3<double>* delta_lambda = nullptr);
61
67 double cal_escon();
68
69 double get_escon();
70
71 void run_lambda_loop(int outer_step,
72 bool rerun = true);
73
76 void update_psi_charge(const ModuleBase::Vector3<double>* delta_lambda, bool pw_solve = true);
77
78 void calculate_delta_hcc(std::complex<double>* h_tmp,
79 const std::complex<double>* becp_k,
80 const ModuleBase::Vector3<double>* delta_lambda,
81 const int nbands, const int nkb, const int* nh_iat);
82
84 bool check_rms_stop(int outer_step, int i_step, double rms_error, double duration, double total_duration);
85
87 void check_restriction(const std::vector<ModuleBase::Vector3<double>>& search, double& alpha_trial);
88
91 std::vector<ModuleBase::Vector3<double>> old_spin,
92 std::vector<ModuleBase::Vector3<double>> new_delta_lambda,
93 std::vector<ModuleBase::Vector3<double>> old_delta_lambda,
94 bool print = false);
97 std::vector<ModuleBase::Vector3<double>> spin_plus,
98 const double alpha_trial);
103
105 void print_Mi(std::ofstream& ofs_running);
106
108 void print_Mag_Force(std::ofstream& ofs_running);
109
111 bool higher_mag_prec = false;
112
113public:
118 //--------------------------------------------------------------------------------
119 // pointers for solve Hamiltonian to get new Magnetization from Lambda
120 void* p_hamilt = nullptr;
121 void* psi = nullptr;
124#ifdef __LCAO
126#endif
127 double tpiba = 0.0;
128 const double meV_to_Ry = 7.349864435130999e-05;
130 //--------------------------------------------------------------------------------
131
132 public:
139 SpinConstrain(SpinConstrain const&) = delete;
142 void set_atomCounts(const std::map<int, int>& atomCounts_in);
144 const std::map<int, int>& get_atomCounts() const;
146 void set_orbitalCounts(const std::map<int, int>& orbitalCounts_in);
148 const std::map<int, int>& get_orbitalCounts() const;
150 void set_lnchiCounts(const std::map<int, std::map<int, int>>& lnchiCounts_in);
152 const std::map<int, std::map<int, int>>& get_lnchiCounts() const;
154 void set_sc_lambda();
156 void set_sc_lambda(const ModuleBase::Vector3<double>* lambda_in, int nat_in);
158 void set_target_mag();
160 void set_target_mag(const ModuleBase::Vector3<double>* target_mag_in, int nat_in);
162 void set_target_mag(const std::vector<ModuleBase::Vector3<double>>& target_mag_in);
164 void set_constrain();
166 void set_constrain(const ModuleBase::Vector3<int>* constrain_in, int nat_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;
174 int get_nat();
176 int get_ntype();
178 void check_atomCounts();
180 int get_iat(int itype, int atom_index);
182 void set_nspin(int nspin);
184 int get_nspin();
186 void zero_Mi();
188 double get_decay_grad(int itype);
190 void set_decay_grad();
192 const std::vector<double>& get_decay_grad();
194 void set_decay_grad(const double* decay_grad_in, int ntype_in);
196 void set_sc_drop_thr(double sc_drop_thr_in);
198 void set_input_parameters(double sc_thr_in,
199 int nsc_in,
200 int nsc_min_in,
201 double alpha_trial_in,
202 double sccut_in,
203 double sc_drop_thr_in);
205 double get_sc_thr();
207 int get_nsc();
209 int get_nsc_min();
211 double get_alpha_trial();
213 double get_sccut();
215 double get_sc_drop_thr();
217 void set_ParaV(Parallel_Orbitals* ParaV_in);
219 void set_solver_parameters(const K_Vectors& kv_in,
220 void* p_hamilt_in,
221 void* psi_in,
222 elecstate::ElecState* pelec_in);
223
224 private:
225 SpinConstrain(){}; // Private constructor
226 ~SpinConstrain(){}; // Destructor
227 SpinConstrain& operator=(SpinConstrain const&) = delete; // Copy assign
228 SpinConstrain& operator=(SpinConstrain &&) = delete; // Move assign
229 std::map<int, std::vector<ScAtomData>> ScData;
230 std::map<int, double> ScDecayGrad; // in unit of uB^2/eV
231 std::vector<double> decay_grad_; // in unit of uB^2/Ry
232 std::map<int, int> atomCounts;
233 std::map<int, int> orbitalCounts;
234 std::map<int, std::map<int, int>> lnchiCounts;
235 std::vector<ModuleBase::Vector3<double>> lambda_; // in unit of Ry/uB in code, but in unit of meV/uB in input file
236 std::vector<ModuleBase::Vector3<double>> target_mag_; // in unit of uB
237 std::vector<ModuleBase::Vector3<double>> Mi_; // in unit of uB
238 std::vector<std::string> atomLabels_;
239 double escon_ = 0.0;
240 int nspin_ = 0;
241 int npol_ = 1;
245 int nsc_;
247 double sc_drop_thr_ = 1e-3;
248 double sc_thr_; // in unit of uB
250 std::vector<ModuleBase::Vector3<int>> constrain_;
251 bool debug = false;
252 double alpha_trial_; // in unit of Ry/uB^2 = 0.01 eV/uB^2
253 double restrict_current_; // in unit of Ry/uB = 3 eV/uB
254
255 public:
260 void set_mag_converged(bool is_Mi_converged_in){this->is_Mi_converged = is_Mi_converged_in;}
262 bool mag_converged() const {return this->is_Mi_converged;}
263 private:
267 bool is_Mi_converged = false;
268
272};
273
274
279 int index;
280 std::vector<double> lambda;
281 std::vector<double> target_mag;
282 std::vector<int> constrain;
287};
288
289} // namespace spinconstrain
290
291#endif // SPIN_CONSTRAIN_H
Definition klist.h:13
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 unitcell.h:17
Definition density_matrix.h:36
Definition elecstate.h:15
Definition operator.h:38
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 exx_lip.h:23
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