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
9 const double lat0_in, // unit length (unit in bohr)
11 latvec_in, // Unitcell lattice vectors (unit in lat0)
12 const double gridecut // unit in Ry, ecut to set up grids
13) {
14 return;
15}
16
18 const double lat0_in,
19 const ModuleBase::Matrix3 latvec_in, // Unitcell lattice vectors
20 const int nx_in,
21 int ny_in,
22 int nz_in) {
23 return;
24}
25
26void PW_Basis::distribute_r() { return; }
27
29 this->nks = 1;
30 this->npwk_max = 3;
31 // used for update_precondition
32 this->gk2 = new double[3];
33 this->npwk = new int[1];
34 this->npwk[0] = 3;
35 this->tpiba2 = 1.0;
36}
37
39 delete[] this->gk2;
40 delete[] this->npwk;
41}
42
43double& PW_Basis_K::getgk2(const int ik, const int igl) const {
44 this->gk2[igl] = (ik + igl) * 1.5;
45 return this->gk2[igl];
46}
47
48
49} // namespace ModulePW
50
54
55
56namespace hsolver {
57
58template <typename T, typename Device>
59DiagoCG<T, Device>::DiagoCG(const std::string& basis_type,
60 const std::string& calculation) {
61 basis_type_ = basis_type;
62 calculation_ = calculation;
63 this->one_ = new T(static_cast<T>(1.0));
64 this->zero_ = new T(static_cast<T>(0.0));
65 this->neg_one_ = new T(static_cast<T>(-1.0));
66}
67
68template <typename T, typename Device>
69DiagoCG<T, Device>::DiagoCG(const std::string& basis_type,
70 const std::string& calculation,
71 const bool& need_subspace,
72 const Func& subspace_func,
73 const Real& pw_diag_thr,
74 const int& pw_diag_nmax,
75 const int& nproc_in_pool) {
76 basis_type_ = basis_type;
77 calculation_ = calculation;
78 need_subspace_ = need_subspace;
79 subspace_func_ = subspace_func;
80 pw_diag_thr_ = pw_diag_thr;
81 pw_diag_nmax_ = pw_diag_nmax;
82 nproc_in_pool_ = nproc_in_pool;
83 this->one_ = new T(static_cast<T>(1.0));
84 this->zero_ = new T(static_cast<T>(0.0));
85 this->neg_one_ = new T(static_cast<T>(-1.0));
86}
87
88template <typename T, typename Device>
90 delete this->one_;
91 delete this->zero_;
92 delete this->neg_one_;
93}
94
95template <typename T, typename Device>
96void DiagoCG<T, Device>::diag(const Func& hpsi_func,
97 const Func& spsi_func,
99 ct::Tensor& eigen,
100 const std::vector<double>& ethr_band,
101 const ct::Tensor& prec) {
102 auto n_bands = psi.shape().dim_size(0);
103 auto n_basis = psi.shape().dim_size(1);
104 auto psi_pack = psi.accessor<T, 2>();
105 auto eigen_pack = eigen.accessor<Real, 1>();
106 // do something
107 for (int ib = 0; ib < n_bands; ib++) {
108 eigen_pack[ib] = 0.0;
109 for (int ig = 0; ig < n_basis; ig++) {
110 psi_pack[ib][ig] += T(2.0, 0.0);
111 eigen_pack[ib] += psi_pack[ib][ig].real();
112 }
113 eigen_pack[ib] /= n_basis;
114 }
116 return;
117}
118
119template class DiagoCG<std::complex<float>, base_device::DEVICE_CPU>;
120template class DiagoCG<std::complex<double>, base_device::DEVICE_CPU>;
121
122template <typename T, typename Device>
123DiagoDavid<T, Device>::DiagoDavid(const Real* precondition_in,
124 const int nband_in,
125 const int dim_in,
126 const int david_ndim_in,
127 const bool use_paw_in,
128 const diag_comm_info& diag_comm_in)
129 : 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) {
130 this->device = base_device::get_device_type<Device>(this->ctx);
131 this->precondition = precondition_in;
132
133 test_david = 2;
134 // 1: check which function is called and which step is executed
135 // 2: check the eigenvalues of the result of each iteration
136 // 3: check the eigenvalues and errors of the last result
137 // default: no check
138}
139
140template <typename T, typename Device>
141DiagoDavid<T, Device>::~DiagoDavid() {
142 delmem_complex_op()(this->hpsi);
143 delmem_complex_op()(this->spsi);
144 delmem_complex_op()(this->hcc);
145 delmem_complex_op()(this->vcc);
146 delmem_complex_op()(this->lagrange_matrix);
148}
149
150template <typename T, typename Device>
151int DiagoDavid<T, Device>::diag(const std::function<void(T*, T*, const int, const int)>& hpsi_func,
152 const std::function<void(T*, T*, const int, const int)>& spsi_func,
153 const int ld_psi,
154 T* psi_in,
155 Real* eigenvalue_in,
156 const std::vector<double>& ethr_band,
157 const int david_maxiter,
158 const int ntry_max,
159 const int notconv_max) {
160 // do nothing, we dont need it
161 // do something
162 // for (int ib = 0; ib < psi.get_nbands(); ib++) {
163 // eigenvalue_in[ib] = 0.0;
164 // for (int ig = 0; ig < psi.get_nbasis(); ig++) {
165 // psi(ib, ig) += T(1.0, 0.0);
166 // eigenvalue_in[ib] += psi(ib, ig).real();
167 // }
168 // eigenvalue_in[ib] /= psi.get_nbasis();
169 // }
170 // DiagoIterAssist<T, Device>::avg_iter += 1.0;
171 return 1;
172}
173template class DiagoDavid<std::complex<float>, base_device::DEVICE_CPU>;
174template class DiagoDavid<std::complex<double>, base_device::DEVICE_CPU>;
175
176template class DiagoIterAssist<std::complex<float>, base_device::DEVICE_CPU>;
177template class DiagoIterAssist<std::complex<double>, base_device::DEVICE_CPU>;
178
179} // namespace hsolver
3x3 matrix and related mathamatical operations
Definition matrix3.h:19
~FFT_Bundle()
Definition fft_bundle.cpp:24
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:77
int nproc_in_pool
Definition pw_test.cpp:12