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>
95void DiagoCG<T, Device>::diag(const Func& hpsi_func,
96 const Func& spsi_func,
98 ct::Tensor& eigen,
99 const std::vector<double>& ethr_band,
100 const ct::Tensor& prec) {
101 auto n_bands = psi.shape().dim_size(0);
102 auto n_basis = psi.shape().dim_size(1);
103 auto psi_pack = psi.accessor<T, 2>();
104 auto eigen_pack = eigen.accessor<Real, 1>();
105 // do something
106 for (int ib = 0; ib < n_bands; ib++) {
107 eigen_pack[ib] = 0.0;
108 for (int ig = 0; ig < n_basis; ig++) {
109 psi_pack[ib][ig] += T(2.0, 0.0);
110 eigen_pack[ib] += psi_pack[ib][ig].real();
111 }
112 eigen_pack[ib] /= n_basis;
113 }
115 return;
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 bool use_paw_in,
127 const diag_comm_info& diag_comm_in)
128 : nband(nband_in), dim(dim_in), nbase_x(david_ndim_in * nband_in), david_ndim(david_ndim_in), use_paw(use_paw_in), diag_comm(diag_comm_in) {
129 this->device = base_device::get_device_type<Device>(this->ctx);
130 this->precondition = precondition_in;
131
132 test_david = 2;
133 // 1: check which function is called and which step is executed
134 // 2: check the eigenvalues of the result of each iteration
135 // 3: check the eigenvalues and errors of the last result
136 // default: no check
137}
138
139template <typename T, typename Device>
140DiagoDavid<T, Device>::~DiagoDavid() {
141 delmem_complex_op()(this->hpsi);
142 delmem_complex_op()(this->spsi);
143 delmem_complex_op()(this->hcc);
144 delmem_complex_op()(this->vcc);
145 delmem_complex_op()(this->lagrange_matrix);
147}
148
149template <typename T, typename Device>
150int DiagoDavid<T, Device>::diag(const std::function<void(T*, T*, const int, const int)>& hpsi_func,
151 const std::function<void(T*, T*, const int, const int)>& spsi_func,
152 const int ld_psi,
153 T* psi_in,
154 Real* eigenvalue_in,
155 const std::vector<double>& ethr_band,
156 const int david_maxiter,
157 const int ntry_max,
158 const int notconv_max) {
159 // do nothing, we dont need it
160 // do something
161 // for (int ib = 0; ib < psi.get_nbands(); ib++) {
162 // eigenvalue_in[ib] = 0.0;
163 // for (int ig = 0; ig < psi.get_nbasis(); ig++) {
164 // psi(ib, ig) += T(1.0, 0.0);
165 // eigenvalue_in[ib] += psi(ib, ig).real();
166 // }
167 // eigenvalue_in[ib] /= psi.get_nbasis();
168 // }
169 // DiagoIterAssist<T, Device>::avg_iter += 1.0;
170 return 1;
171}
172template class DiagoDavid<std::complex<float>, base_device::DEVICE_CPU>;
173template class DiagoDavid<std::complex<double>, base_device::DEVICE_CPU>;
174
175template class DiagoIterAssist<std::complex<float>, base_device::DEVICE_CPU>;
176template class DiagoIterAssist<std::complex<double>, base_device::DEVICE_CPU>;
177
178} // 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:79
~PW_Basis_K()
Definition pw_basis_k.cpp:17
double & getgk2(const int ik, const int igl) const
Definition pw_basis_k.cpp:371
int * npwk
Definition pw_basis_k.h:78
double * gk2
[npw] map ig to ixyz,which is used in dsp fft.
Definition pw_basis_k.h:91
int nks
Definition pw_basis_k.h:75
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
A multi-dimensional array of elements of a single data type.
Definition tensor.h:32
TensorAccessor< T, N, index_t > accessor() const &
Accessor function for a multi-dimensional tensor.
Definition tensor.h:500
DiagoCG(const std::string &basis_type, const std::string &calculation)
Definition diago_cg.cpp:18
~DiagoCG()
Definition diago_cg.cpp:49
void diag(const Func &hpsi_func, const Func &spsi_func, ct::Tensor &psi, ct::Tensor &eigen, const std::vector< double > &ethr_band, const ct::Tensor &prec={})
Definition diago_cg.cpp:578
DiagoDavid(const Real *precondition_in, const int nband_in, const int dim_in, const int david_ndim_in, const bool use_paw_in, const diag_comm_info &diag_comm_in)
Constructor for the DiagoDavid class.
Definition diago_david.cpp:15
static Real avg_iter
average steps of last cg diagonalization for each band.
Definition diago_iter_assist.h:26
#define T
Definition exp.cpp:237
int dim
Definition ions_move_basic.cpp:8
typename GetTypeReal< T >::type Real
Definition write_vxc_lip.hpp:18
Definition pw_op.cpp:3
Definition diag_comm_info.h:9
Definition exx_lip.h:23
Definition memory_op.h:115
int nproc_in_pool
Definition pw_test.cpp:12