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
17namespace spinconstrain
18{
19
20struct ScAtomData;
21
22template <typename FPTYPE>
24{
25public:
30 void init_sc(double sc_thr_in,
31 int nsc_in,
32 int nsc_min_in,
33 double alpha_trial_in,
34 double sccut_in,
35 double sc_drop_thr_in,
36 const UnitCell& ucell,
37 Parallel_Orbitals* ParaV_in,
38 int nspin_in,
39 K_Vectors& kv_in,
40 void* p_hamilt_in,
41 void* psi_in,
42 elecstate::ElecState* pelec_in,
43 ModulePW::PW_Basis_K* pw_wfc_in = nullptr);
44
48 void cal_mi_lcao(const int& step, bool print = false);
49
50 void cal_mi_pw();
51
52 void cal_mw_from_lambda(int i_step, const ModuleBase::Vector3<double>* delta_lambda = nullptr);
53
59 double cal_escon();
60
61 double get_escon();
62
63 void run_lambda_loop(int outer_step, bool rerun = true);
64
67 void update_psi_charge(const ModuleBase::Vector3<double>* delta_lambda, bool pw_solve = true);
68
69 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);
70
72 bool check_rms_stop(int outer_step, int i_step, double rms_error, double duration, double total_duration);
73
75 void check_restriction(const std::vector<ModuleBase::Vector3<double>>& search, double& alpha_trial);
76
79 std::vector<ModuleBase::Vector3<double>> old_spin,
80 std::vector<ModuleBase::Vector3<double>> new_delta_lambda,
81 std::vector<ModuleBase::Vector3<double>> old_delta_lambda,
82 bool print = false);
85 std::vector<ModuleBase::Vector3<double>> spin_plus,
86 const double alpha_trial);
91
93 void print_Mi(std::ofstream& ofs_running);
94
96 void print_Mag_Force(std::ofstream& ofs_running);
97
99 bool higher_mag_prec = false;
100
101public:
106 //--------------------------------------------------------------------------------
107 // pointers for solve Hamiltonian to get new Magnetization from Lambda
108 void* p_hamilt = nullptr;
109 void* psi = nullptr;
112 double tpiba = 0.0;
113 const double meV_to_Ry = 7.349864435130999e-05;
115 //--------------------------------------------------------------------------------
116
117 public:
124 SpinConstrain(SpinConstrain const&) = delete;
127 void set_atomCounts(const std::map<int, int>& atomCounts_in);
129 const std::map<int, int>& get_atomCounts() const;
131 void set_orbitalCounts(const std::map<int, int>& orbitalCounts_in);
133 const std::map<int, int>& get_orbitalCounts() const;
135 void set_lnchiCounts(const std::map<int, std::map<int, int>>& lnchiCounts_in);
137 const std::map<int, std::map<int, int>>& get_lnchiCounts() const;
139 void set_sc_lambda();
141 void set_sc_lambda(const ModuleBase::Vector3<double>* lambda_in, int nat_in);
143 void set_target_mag();
145 void set_target_mag(const ModuleBase::Vector3<double>* target_mag_in, int nat_in);
147 void set_target_mag(const std::vector<ModuleBase::Vector3<double>>& target_mag_in);
149 void set_constrain();
151 void set_constrain(const ModuleBase::Vector3<int>* constrain_in, int nat_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;
159 int get_nat();
161 int get_ntype();
163 void check_atomCounts();
165 int get_iat(int itype, int atom_index);
167 void set_nspin(int nspin);
169 int get_nspin();
171 void zero_Mi();
173 double get_decay_grad(int itype);
175 void set_decay_grad();
177 const std::vector<double>& get_decay_grad();
179 void set_decay_grad(const double* decay_grad_in, int ntype_in);
181 void set_sc_drop_thr(double sc_drop_thr_in);
183 void set_input_parameters(double sc_thr_in,
184 int nsc_in,
185 int nsc_min_in,
186 double alpha_trial_in,
187 double sccut_in,
188 double sc_drop_thr_in);
190 double get_sc_thr();
192 int get_nsc();
194 int get_nsc_min();
196 double get_alpha_trial();
198 double get_sccut();
200 double get_sc_drop_thr();
202 void set_ParaV(Parallel_Orbitals* ParaV_in);
205 void* p_hamilt_in,
206 void* psi_in,
207 elecstate::ElecState* pelec_in);
208
209 private:
210 SpinConstrain(){}; // Private constructor
211 ~SpinConstrain(){}; // Destructor
212 SpinConstrain& operator=(SpinConstrain const&) = delete; // Copy assign
213 SpinConstrain& operator=(SpinConstrain &&) = delete; // Move assign
214 std::map<int, std::vector<ScAtomData>> ScData;
215 std::map<int, double> ScDecayGrad; // in unit of uB^2/eV
216 std::vector<double> decay_grad_; // in unit of uB^2/Ry
217 std::map<int, int> atomCounts;
218 std::map<int, int> orbitalCounts;
219 std::map<int, std::map<int, int>> lnchiCounts;
220 std::vector<ModuleBase::Vector3<double>> lambda_; // in unit of Ry/uB in code, but in unit of meV/uB in input file
221 std::vector<ModuleBase::Vector3<double>> target_mag_; // in unit of uB
222 std::vector<ModuleBase::Vector3<double>> Mi_; // in unit of uB
223 std::vector<std::string> atomLabels_;
224 double escon_ = 0.0;
225 int nspin_ = 0;
226 int npol_ = 1;
230 int nsc_;
232 double sc_drop_thr_ = 1e-3;
233 double sc_thr_; // in unit of uB
235 std::vector<ModuleBase::Vector3<int>> constrain_;
236 bool debug = false;
237 double alpha_trial_; // in unit of Ry/uB^2 = 0.01 eV/uB^2
238 double restrict_current_; // in unit of Ry/uB = 3 eV/uB
239
240 public:
245 void set_mag_converged(bool is_Mi_converged_in){this->is_Mi_converged = is_Mi_converged_in;}
247 bool mag_converged() const {return this->is_Mi_converged;}
248 private:
252 bool is_Mi_converged = false;
253
254 FPTYPE* sub_h_save;
255 FPTYPE* sub_s_save;
256 FPTYPE* becp_save;
257};
258
259
264 int index;
265 std::vector<double> lambda;
266 std::vector<double> target_mag;
267 std::vector<int> constrain;
272};
273
274} // namespace spinconstrain
275
276#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:16
Definition elecstate.h:15
Definition operator.h:38
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 exx_lip.h:23
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