ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
lr_util_hcontainer.h
Go to the documentation of this file.
1#pragma once
3#include <numeric>
5namespace LR_Util
6{
7 template<typename TR>
8 void print_HR(const hamilt::HContainer<TR>& HR, const int& nat, const std::string& label, const double& threshold = 1e-10)
9 {
10 std::cout << label << "\n";
11 for (int ia = 0;ia < nat;ia++)
12 for (int ja = 0;ja < nat;ja++)
13 {
14 auto ap = HR.find_pair(ia, ja);
15 for (int iR = 0;iR < ap->get_R_size();++iR)
16 {
17 std::cout << "atom pair (" << ia << ", " << ja << "), "
18 << "R=(" << ap->get_R_index(iR)[0] << ", " << ap->get_R_index(iR)[1] << ", " << ap->get_R_index(iR)[2] << "): \n";
19 auto& mat = ap->get_HR_values(iR);
20 std::cout << "rowsize=" << ap->get_row_size() << ", colsize=" << ap->get_col_size() << "\n";
21 for (int i = 0;i < ap->get_row_size();++i)
22 {
23 for (int j = 0;j < ap->get_col_size();++j)
24 {
25 auto& v = mat.get_value(i, j);
26 std::cout << (std::abs(v) > threshold ? v : 0) << " ";
27 }
28 std::cout << "\n";
29 }
30 }
31 }
32 }
33 template <typename TK, typename TR>
34 void print_DMR(const elecstate::DensityMatrix<TK, TR>& DMR, const int& nat, const std::string& label, const double& threshold = 1e-10)
35 {
36 std::cout << label << "\n";
37 int is = 0;
38 for (auto& dr : DMR.get_DMR_vector())
39 print_HR(*dr, nat, "DMR[" + std::to_string(is++) + "]", threshold);
40 }
41 void get_DMR_real_imag_part(const elecstate::DensityMatrix<std::complex<double>, std::complex<double>>& DMR,
42 elecstate::DensityMatrix<std::complex<double>, double>& DMR_real,
43 const int& nat,
44 const char& type = 'R');
46 hamilt::HContainer<std::complex<double>>& HR,
47 const int& nat,
48 const char& type = 'R');
49
50 template <typename T, typename TR>
52 const UnitCell& ucell,
53 const Grid_Driver& gd,
54 const std::vector<double>& orb_cutoff)
55 {
56 const auto& pmat = *hR.get_paraV();
57 for (int iat1 = 0; iat1 < ucell.nat; iat1++)
58 {
59 auto tau1 = ucell.get_tau(iat1);
60 int T1, I1;
61 ucell.iat2iait(iat1, &I1, &T1);
63 gd.Find_atom(ucell, tau1, T1, I1, &adjs);
64 for (int ad = 0; ad < adjs.adj_num + 1; ++ad)
65 {
66 const int T2 = adjs.ntype[ad];
67 const int I2 = adjs.natom[ad];
68 int iat2 = ucell.itia2iat(T2, I2);
69 if (pmat.get_row_size(iat1) <= 0 || pmat.get_col_size(iat2) <= 0) { continue; }
70 const ModuleBase::Vector3<int>& R_index = adjs.box[ad];
71 if (ucell.cal_dtau(iat1, iat2, R_index).norm() * ucell.lat0 >= orb_cutoff[T1] + orb_cutoff[T2]) { continue; }
72 hamilt::AtomPair<TR> tmp(iat1, iat2, R_index.x, R_index.y, R_index.z, &pmat);
73 hR.insert_pair(tmp);
74 }
75 }
76 hR.allocate(nullptr, true);
77 // hR.set_paraV(&pmat);
78 if (std::is_same<T, double>::value) { hR.fix_gamma(); }
79 }
80 template <typename T, typename TR>
82 const Parallel_Orbitals& pmat,
83 const UnitCell& ucell,
84 const Grid_Driver& gd,
85 const std::vector<double>& orb_cutoff)
86 {
87 hamilt::HContainer<TR> hR_tmp(&pmat);
88 initialize_HR<T, TR>(hR_tmp, ucell, gd, orb_cutoff);
89 dm.init_DMR(hR_tmp);
90 }
91
93 template<typename TR1, typename TR2>
94 TR1 dot_R_matrix(const hamilt::HContainer<TR1>& h1, const hamilt::HContainer<TR2>& h2, const int& nat)
95 {
96 const auto& pmat = *h1.get_paraV();
97 TR1 sum = 0;
98 // in case of the different order of atom pair and R-index in h1 and h2, we search by value instead of index
99 for (int iat1 = 0;iat1 < nat;++iat1)
100 {
101 for (int iat2 = 0;iat2 < nat;++iat2)
102 {
103 auto ap1 = h1.find_pair(iat1, iat2);
104 if (!ap1) { continue; }
105 auto ap2 = h2.find_pair(iat1, iat2);
106 assert(ap2);
107 for (int iR = 0;iR < ap1->get_R_size();++iR)
108 {
109 const ModuleBase::Vector3<int>& R = ap1->get_R_index(iR);
110 auto mat1 = ap1->get_HR_values(R.x, R.y, R.z);
111 auto mat2 = ap2->get_HR_values(R.x, R.y, R.z);
112 sum += std::inner_product(mat1.get_pointer(), mat1.get_pointer() + mat1.get_memory_size(), mat2.get_pointer(), (TR1)0.0);
113 }
114 }
115 }
117 return sum;
118 }
119
120}
Definition sltk_grid_driver.h:20
int adj_num
Definition sltk_grid_driver.h:25
std::vector< ModuleBase::Vector3< int > > box
Definition sltk_grid_driver.h:29
std::vector< int > ntype
Definition sltk_grid_driver.h:26
std::vector< int > natom
Definition sltk_grid_driver.h:27
Definition sltk_grid_driver.h:43
void Find_atom(const UnitCell &ucell, const int ntype, const int nnumber, AdjacentAtomInfo *adjs=nullptr) const
Definition sltk_grid_driver.cpp:25
3 elements vector
Definition vector3.h:22
T x
Definition vector3.h:24
T norm(void) const
Get the norm of a Vector3.
Definition vector3.h:187
T y
Definition vector3.h:25
T z
Definition vector3.h:26
Definition parallel_orbitals.h:9
Definition unitcell.h:16
const ModuleBase::Vector3< double > & get_tau(const int &iat) const
Definition unitcell.h:149
double & lat0
Definition unitcell.h:28
ModuleBase::IntArray & itia2iat
Definition unitcell.h:51
int & nat
Definition unitcell.h:46
const ModuleBase::Vector3< double > cal_dtau(const int &iat1, const int &iat2, const ModuleBase::Vector3< int > &R) const
Definition unitcell.h:155
bool iat2iait(const Tiat iat, Tiait *ia, Tiait *it) const
Definition unitcell.h:89
Definition density_matrix.h:36
const std::vector< hamilt::HContainer< TR > * > & get_DMR_vector() const
get pointer vector of DMR
Definition density_matrix.h:145
void init_DMR(const Grid_Driver *GridD_in, const UnitCell *ucell)
initialize density matrix DMR from UnitCell
Definition density_matrix_io.cpp:15
Definition atom_pair.h:42
Definition hcontainer.h:144
void fix_gamma()
restrict R indexes of all atom-pair to 0, 0, 0 add BaseMatrix<T> with non-zero R index to this->atom_...
Definition hcontainer.cpp:462
void insert_pair(const AtomPair< T > &atom_ij)
a AtomPair object can be inserted into HContainer, two steps: 1, find AtomPair with atom index atom_i...
Definition hcontainer.cpp:624
void allocate(T *data_array=nullptr, bool if_zero=false)
allocate memory for all <IJR> matrix if data_array is not nullptr, use memory after data_array for ea...
Definition hcontainer.cpp:175
const Parallel_Orbitals * get_paraV() const
get parallel orbital pointer to check parallel information
Definition hcontainer.h:192
AtomPair< T > * find_pair(int i, int j) const
find AtomPair with atom index atom_i and atom_j This interface can be used to find AtomPair,...
Definition hcontainer.cpp:219
Definition lr_util.cpp:6
TR1 dot_R_matrix(const hamilt::HContainer< TR1 > &h1, const hamilt::HContainer< TR2 > &h2, const int &nat)
$\sum_{uvR} H1_{uv}(R) H2_{uv}(R)$
Definition lr_util_hcontainer.h:94
void initialize_DMR(elecstate::DensityMatrix< T, TR > &dm, const Parallel_Orbitals &pmat, const UnitCell &ucell, const Grid_Driver &gd, const std::vector< double > &orb_cutoff)
Definition lr_util_hcontainer.h:81
void set_HR_real_imag_part(const hamilt::HContainer< double > &HR_real, hamilt::HContainer< std::complex< double > > &HR, const int &nat, const char &type)
Definition lr_util_hcontainer.cpp:35
void print_HR(const hamilt::HContainer< TR > &HR, const int &nat, const std::string &label, const double &threshold=1e-10)
Definition lr_util_hcontainer.h:8
void get_DMR_real_imag_part(const elecstate::DensityMatrix< std::complex< double >, std::complex< double > > &DMR, elecstate::DensityMatrix< std::complex< double >, double > &DMR_real, const int &nat, const char &type)
Definition lr_util_hcontainer.cpp:4
void print_DMR(const elecstate::DensityMatrix< TK, TR > &DMR, const int &nat, const std::string &label, const double &threshold=1e-10)
Definition lr_util_hcontainer.h:34
void initialize_HR(hamilt::HContainer< TR > &hR, const UnitCell &ucell, const Grid_Driver &gd, const std::vector< double > &orb_cutoff)
Definition lr_util_hcontainer.h:51
void reduce_all(T &object)
reduce in all process
Definition depend_mock.cpp:14
#define threshold
Definition sph_bessel_recursive_test.cpp:4