ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
hsolver_pw_sup.h
Go to the documentation of this file.
2
3namespace ModulePW {
4
8 const double lat0_in, // unit length (unit in bohr)
10 latvec_in, // Unitcell lattice vectors (unit in lat0)
11 const double gridecut // unit in Ry, ecut to set up grids
12) {
13 return;
14}
15
17 const double lat0_in,
18 const ModuleBase::Matrix3 latvec_in, // Unitcell lattice vectors
19 const int nx_in,
20 int ny_in,
21 int nz_in) {
22 return;
23}
24
25void PW_Basis::distribute_r() { return; }
26
28 this->nks = 1;
29 this->npwk_max = 3;
30 // used for update_precondition
31 this->gk2 = new double[3];
32 this->npwk = new int[1];
33 this->npwk[0] = 3;
34 this->tpiba2 = 1.0;
35}
36
38 delete[] this->gk2;
39 delete[] this->npwk;
40}
41
42double& PW_Basis_K::getgk2(const int ik, const int igl) const {
43 this->gk2[igl] = (ik + igl) * 1.5;
44 return this->gk2[igl];
45}
46
47
48} // namespace ModulePW
49
53
54
55namespace hsolver {
56
57template <typename T, typename Device>
58DiagoCG<T, Device>::DiagoCG(const std::string& basis_type,
59 const std::string& calculation) {
60 basis_type_ = basis_type;
61 calculation_ = calculation;
62 this->one_ = new T(static_cast<T>(1.0));
63 this->zero_ = new T(static_cast<T>(0.0));
64 this->neg_one_ = new T(static_cast<T>(-1.0));
65}
66
67template <typename T, typename Device>
68DiagoCG<T, Device>::DiagoCG(const std::string& basis_type,
69 const std::string& calculation,
70 const bool& need_subspace,
71 const SubspaceFunc& subspace_func,
72 const Real& pw_diag_thr,
73 const int& pw_diag_nmax,
74 const int& nproc_in_pool) {
75 basis_type_ = basis_type;
76 calculation_ = calculation;
77 need_subspace_ = need_subspace;
78 subspace_func_ = subspace_func;
79 pw_diag_thr_ = pw_diag_thr;
80 pw_diag_nmax_ = pw_diag_nmax;
81 nproc_in_pool_ = nproc_in_pool;
82 this->one_ = new T(static_cast<T>(1.0));
83 this->zero_ = new T(static_cast<T>(0.0));
84 this->neg_one_ = new T(static_cast<T>(-1.0));
85}
86
87template <typename T, typename Device>
89 delete this->one_;
90 delete this->zero_;
91 delete this->neg_one_;
92}
93
94template <typename T, typename Device>
95double DiagoCG<T, Device>::diag(const HPsiFunc& hpsi_func,
96 const SPsiFunc& spsi_func,
97 const int ld_psi,
98 const int nband,
99 const int dim,
100 T* psi_in,
101 Real* eigenvalue_in,
102 const std::vector<double>& ethr_band,
103 const Real* prec) {
104 // do something
105 for (int ib = 0; ib < nband; ib++) {
106 eigenvalue_in[ib] = 0.0;
107 T* psi_band = psi_in + static_cast<size_t>(ib) * static_cast<size_t>(ld_psi);
108 for (int ig = 0; ig < ld_psi; ig++) {
109 psi_band[ig] += T(2.0, 0.0);
110 eigenvalue_in[ib] += psi_band[ig].real();
111 }
112 eigenvalue_in[ib] /= ld_psi;
113 }
115 return avg_iter_;
116}
117
118template class DiagoCG<std::complex<float>, base_device::DEVICE_CPU>;
119template class DiagoCG<std::complex<double>, base_device::DEVICE_CPU>;
120
121template <typename T, typename Device>
122DiagoDavid<T, Device>::DiagoDavid(const Real* precondition_in,
123 const int nband_in,
124 const int dim_in,
125 const int david_ndim_in,
126 const diag_comm_info& diag_comm_in)
127 : nband(nband_in), dim(dim_in), nbase_x(david_ndim_in * nband_in), david_ndim(david_ndim_in), diag_comm(diag_comm_in) {
128 this->device = base_device::get_device_type(this->ctx);
129 this->precondition = precondition_in;
130
131 test_david = 2;
132 // 1: check which function is called and which step is executed
133 // 2: check the eigenvalues of the result of each iteration
134 // 3: check the eigenvalues and errors of the last result
135 // default: no check
136}
137
138template <typename T, typename Device>
139DiagoDavid<T, Device>::~DiagoDavid() {
140 delmem_complex_op()(this->hpsi);
141 delmem_complex_op()(this->spsi);
142 delmem_complex_op()(this->hcc);
143 delmem_complex_op()(this->vcc);
144 delmem_complex_op()(this->lagrange_matrix);
146}
147
148template <typename T, typename Device>
149int DiagoDavid<T, Device>::diag(const std::function<void(T*, T*, const int, const int)>& hpsi_func,
150 const std::function<void(T*, T*, const int, const int)>& spsi_func,
151 const int ld_psi,
152 T* psi_in,
153 Real* eigenvalue_in,
154 const std::vector<double>& ethr_band,
155 const int david_maxiter,
156 const int ntry_max,
157 const int notconv_max) {
158 // do nothing, we dont need it
159 // do something
160 // for (int ib = 0; ib < psi.get_nbands(); ib++) {
161 // eigenvalue_in[ib] = 0.0;
162 // for (int ig = 0; ig < psi.get_nbasis(); ig++) {
163 // psi(ib, ig) += T(1.0, 0.0);
164 // eigenvalue_in[ib] += psi(ib, ig).real();
165 // }
166 // eigenvalue_in[ib] /= psi.get_nbasis();
167 // }
168 // DiagoIterAssist<T, Device>::avg_iter += 1.0;
169 return 1;
170}
171template class DiagoDavid<std::complex<float>, base_device::DEVICE_CPU>;
172template class DiagoDavid<std::complex<double>, base_device::DEVICE_CPU>;
173
174template class DiagoIterAssist<std::complex<float>, base_device::DEVICE_CPU>;
175template class DiagoIterAssist<std::complex<double>, base_device::DEVICE_CPU>;
176
177} // namespace hsolver
3x3 matrix and related mathamatical operations
Definition matrix3.h:19
PW_Basis_K()
Definition pw_basis_k.cpp:12
int npwk_max
Definition pw_basis_k.h:78
~PW_Basis_K()
Definition pw_basis_k.cpp:17
double & getgk2(const int ik, const int igl) const
Definition pw_basis_k.cpp:380
int * npwk
Definition pw_basis_k.h:77
double * gk2
[npw] map ig to ixyz,which is used in dsp fft.
Definition pw_basis_k.h:90
int nks
Definition pw_basis_k.h:74
PW_Basis()
Definition pw_basis.cpp:11
virtual void distribute_r()
distribute real-space grids to different processors
Definition pw_distributer.cpp:11
virtual void initgrids(const double lat0_in, const ModuleBase::Matrix3 latvec_in, const double gridecut)
Definition pw_init.cpp:23
double tpiba2
4pi^2/lat0^2
Definition pw_basis.h:173
virtual ~PW_Basis()
Definition pw_basis.cpp:23
double diag(const HPsiFunc &hpsi_func, const SPsiFunc &spsi_func, const int ld_psi, const int nband, const int dim, T *psi_in, Real *eigenvalue_in, const std::vector< double > &ethr_band, const Real *prec=nullptr)
Definition diago_cg.cpp:582
DiagoCG(const std::string &basis_type, const std::string &calculation)
Definition diago_cg.cpp:18
~DiagoCG()
Definition diago_cg.cpp:49
DiagoDavid(const Real *precondition_in, const int nband_in, const int dim_in, const int david_ndim_in, const diag_comm_info &diag_comm_in)
Constructor for the DiagoDavid class.
Definition diago_david.cpp:16
static Real avg_iter
average steps of last cg diagonalization for each band.
Definition diago_iter_assist.h:28
#define T
Definition exp.cpp:237
int dim
Definition ions_move_basic.cpp:8
Definition pw_op.cpp:3
AbacusDevice_t get_device_type(const Device *dev)
Get the device type enum for a given device type (compile-time version).
Definition device_helpers.h:31
Definition diag_comm_info.h:9
Definition memory_op.h:115
int nproc_in_pool
Definition pw_test.cpp:12