ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
symmetry_rotation.h
Go to the documentation of this file.
1#pragma once
4#include <RI/global/Tensor.h>
7
8namespace ModuleSymmetry
9{
10 using Tap = std::pair<int, int>;
11 using TC = std::array<int, 3>;
12 using TapR = std::pair<Tap, TC>;
14
16 {
17 public:
20
21 //--------------------------------------------------------------------------------
22 // getters
23 const std::map<Tap, std::set<TC>>& get_irreducible_sector()const { return this->irs_.get_irreducible_sector(); }
25 const ModuleBase::Matrix3& gmatd, const TCdouble gtransd,
26 const TCdouble& posd_a1, const TCdouble& posd_a2)const
27 {
28 return this->irs_.get_return_lattice(symm, gmatd, gtransd, posd_a1, posd_a2);
29 }
30 TCdouble get_return_lattice(const int iat, const int isym) const
31 {
32 return this->irs_.get_return_lattice(iat, isym);
33 }
35 const std::vector<std::vector<RI::Tensor<std::complex<double>>>>& rotmat_Slm = this->rotmat_Slm_;
36 const int& abfs_Lmax = this->abfs_Lmax_;
37 //--------------------------------------------------------------------------------
38 // setters
39 void find_irreducible_sector(const Symmetry& symm, const Atom* atoms, const Statistics& st,
40 const std::vector<TC>& Rs, const TC& period, const Lattice& lat)
41 {
42 this->irs_.find_irreducible_sector(symm, atoms, st, Rs, period, lat);
43 }
44 void set_abfs_Lmax(const int l) { this->abfs_Lmax_ = l; }
45 void set_Cs_rotation(const std::vector<std::vector<int>>& abfs_l_nchi);
46 //--------------------------------------------------------------------------------
48
52 void cal_Ms(const K_Vectors& kv,
53 //const std::vector<std::map<int, TCdouble>>& kstars,
54 const UnitCell& ucell, const Parallel_2D& pv);
55
58 std::vector<std::vector<std::complex<double>>>restore_dm(const K_Vectors& kv,
59 const std::vector<std::vector<std::complex<double>>>& dm_k_ibz,
60 const Parallel_2D& pv)const;
61 std::vector<std::vector<double>>restore_dm(const K_Vectors& kv,
62 const std::vector<std::vector<double>>& dm_k_ibz,
63 const Parallel_2D& pv)const;
64 std::vector<std::complex<double>> rot_matrix_ao(const std::vector<std::complex<double>>& DMkibz,
65 const int ik_ibz, const int kstar_size, const int isym, const Parallel_2D& pv, const bool TRS_conj = false) const;
66
68 double wigner_d(const double beta, const int l, const int m1, const int m2) const;
69 std::complex<double> wigner_D(const TCdouble& euler_angle, const int l, const int m1, const int m2, const bool inv) const;
70
72 std::complex<double> ovlp_Ylm_Slm(const int l, const int m1, const int m2) const;
73
76
78 void cal_rotmat_Slm(const ModuleBase::Matrix3* gmatc, const int lmax);
79
82 void set_block_to_mat2d(const int starti, const int startj, const RI::Tensor<std::complex<double>>& block,
83 std::vector<std::complex<double>>& obj_mat, const Parallel_2D& pv, const bool trans = false) const;
84 void set_block_to_mat2d(const int starti, const int startj, const RI::Tensor<std::complex<double>>& block,
85 std::vector<double>& obj_mat, const Parallel_2D& pv, const bool trans = false) const;
86
89 std::vector<std::complex<double>> contruct_2d_rot_mat_ao(const Symmetry& symm, const Atom* atoms, const Statistics& cell_st,
90 const TCdouble& kvec_d_ibz, int isym, const Parallel_2D& pv) const;
91
92 std::vector<std::vector<RI::Tensor<std::complex<double>>>>& get_rotmat_Slm() { return this->rotmat_Slm_; }
93
94 //--------------------------------------------------------------------------------
97 template<typename Tdata> // RI::Tensor type
98 std::map<int, std::map<std::pair<int, TC>, RI::Tensor<Tdata>>> restore_HR(
99 const Symmetry& symm, const Atom* atoms, const Statistics& st, const char mode,
100 const std::map<int, std::map<std::pair<int, TC>, RI::Tensor<Tdata>>>& HR_irreduceble)const;
101 template<typename TR> // HContainer type
102 void restore_HR(
103 const Symmetry& symm, const Atom* atoms, const Statistics& st, const char mode,
104 const hamilt::HContainer<TR>& HR_irreduceble, hamilt::HContainer<TR>& HR_rotated)const;
105
106 //--------------------------------------------------------------------------------
109 template<typename Tdata> // RI::Tensor type, using col-major implementation
110 void test_HR_rotation(const Symmetry& symm, const Atom* atoms, const Statistics& st, const char mode,
111 const std::map<int, std::map<std::pair<int, TC>, RI::Tensor<Tdata>>>& HR_full);
112 template<typename Tdata> // test the rotation of RI coefficients
113 void test_Cs_rotation(const Symmetry& symm, const Atom* atoms, const Statistics& st,
114 const std::map<int, std::map<std::pair<int, TC>, RI::Tensor<Tdata>>>& Cs_full)const;
115 template<typename TR> // HContainer type, using row-major implementation
116 void test_HR_rotation(const Symmetry& symm, const Atom* atoms, const Statistics& st, const char mode,
117 const hamilt::HContainer<TR>& HR_full);
118 template<typename Tdata> // HContainer type
119 void print_HR(const std::map<int, std::map<std::pair<int, TC>, RI::Tensor<Tdata>>>& HR, const std::string name, const double& threshold = 0.0);
120 //--------------------------------------------------------------------------------
121
122 private:
123 //--------------------------------------------------------------------------------
124 std::vector<TC> get_Rs_from_BvK(const K_Vectors& kv)const;
125 std::vector<TC> get_Rs_from_adjacent_list(const UnitCell& ucell,
126 const Grid_Driver& gd,
127 const Parallel_Orbitals& pv) const;
128 //--------------------------------------------------------------------------------
129
133 template<typename Tdata> // RI::Tensor type, blas
134 RI::Tensor<Tdata> rotate_atompair_serial(const RI::Tensor<Tdata>& A, const int isym,
135 const Atom& a1, const Atom& a2, const char mode, bool output = false)const;
136 template<typename Tdata> // pointer type, blas
137 void rotate_atompair_serial(Tdata* TAT, const Tdata* A, const int& nw1, const int& nw2, const int isym,
138 const Atom& a1, const Atom& a2, const char mode)const;
139 template<typename TR> // HContainer type, pblas
140 void rotate_atompair_parallel(const TR* Alocal_in, const int isym, const Atom* atoms, const Statistics& st,
141 const Tap& ap_in, const Tap& ap_out, const char mode, const Parallel_Orbitals& pv, TR* Alocal_out, const bool output = false)const;
142
144 template<typename Tdata>
145 RI::Tensor<Tdata> rotate_singleC_serial(const RI::Tensor<Tdata>& C, const int isym,
146 const Atom& a1, const Atom& a2, const int& type1, bool output = false)const;
147
148 template<typename Tdata>
149 RI::Tensor<Tdata> set_rotation_matrix(const Atom& a, const int& isym)const;
150 template<typename Tdata>
151 RI::Tensor<Tdata> set_rotation_matrix_abf(const int& type, const int& isym)const;
152 //--------------------------------------------------------------------------------
153
154 int nsym_ = 1;
155
156 double eps_ = 1e-6;
157
158 bool TRS_first_ = true; //if R(k)=-k, firstly use TRS to restore D(k) from D(R(k)), i.e conjugate D(R(k)).
159
160 bool reduce_Cs_ = false;
161 int abfs_Lmax_ = 0;
162
163 std::vector<std::vector<int>> abfs_l_nchi_;
164
166 std::vector<std::vector<RI::Tensor<std::complex<double>>>> rotmat_Slm_;
167 // [natom][nsym], phase factor corresponding to a certain kvec_d_ibz
168 // std::vector<std::vector<std::complex<double>>> phase_factor_;
169
172 std::vector<std::map<int, std::vector<std::complex<double>>>> Ms_;
173
176
177 };
178
179 template<typename T> std::string vec3_fmt(const T& x, const T& y, const T& z)
180 {
181 return "(" + std::to_string(x) + " " + std::to_string(y) + " " + std::to_string(z) + ")";
182 }
183 template<typename T> std::string vec3_fmt(const ModuleBase::Vector3<T>& v)
184 {
185 return vec3_fmt(v.x, v.y, v.z);
186 }
187 // output k stars and the rotation matrices of Bloch orbitals
189 const K_Vectors& kv, const UnitCell& ucell);
190 void print_symrot_info_R(const Symmetry_rotation& symrot, const Symmetry& symm,
191 const int lmax_ao, const std::vector<TC>& Rs);
192}
193
Definition abfs-vector3_order.h:16
Definition atom_spec.h:7
Definition sltk_grid_driver.h:43
Definition klist.h:13
3x3 matrix and related mathamatical operations
Definition matrix3.h:19
3 elements vector
Definition vector3.h:22
T x
Definition vector3.h:24
T y
Definition vector3.h:25
T z
Definition vector3.h:26
Definition irreducible_sector.h:19
TCdouble get_return_lattice(const Symmetry &symm, const ModuleBase::Matrix3 &gmatd, const TCdouble gtransd, const TCdouble &posd_a1, const TCdouble &posd_a2) const
Definition irreducible_sector.cpp:50
const std::map< Tap, std::set< TC > > & get_irreducible_sector() const
Definition irreducible_sector.h:60
void find_irreducible_sector(const Symmetry &symm, const Atom *atoms, const Statistics &st, const std::vector< TC > &Rs, const TC &period, const Lattice &lat)
The main function to find irreducible sector: {abR}.
Definition irreducible_sector.cpp:160
Definition symmetry_rotation.h:16
int nsym_
Definition symmetry_rotation.h:154
void set_abfs_Lmax(const int l)
Definition symmetry_rotation.h:44
double eps_
Definition symmetry_rotation.h:156
bool reduce_Cs_
Definition symmetry_rotation.h:160
const int & abfs_Lmax
Definition symmetry_rotation.h:36
std::vector< std::vector< RI::Tensor< std::complex< double > > > > & get_rotmat_Slm()
Definition symmetry_rotation.h:92
void test_Cs_rotation(const Symmetry &symm, const Atom *atoms, const Statistics &st, const std::map< int, std::map< std::pair< int, TC >, RI::Tensor< Tdata > > > &Cs_full) const
Definition symmetry_rotation_R.hpp:287
std::vector< std::vector< std::complex< double > > > restore_dm(const K_Vectors &kv, const std::vector< std::vector< std::complex< double > > > &dm_k_ibz, const Parallel_2D &pv) const
Definition symmetry_rotation.cpp:80
Symmetry_rotation()
Definition symmetry_rotation.h:18
TCdouble get_return_lattice(const Symmetry &symm, const ModuleBase::Matrix3 &gmatd, const TCdouble gtransd, const TCdouble &posd_a1, const TCdouble &posd_a2) const
Definition symmetry_rotation.h:24
double wigner_d(const double beta, const int l, const int m1, const int m2) const
calculate Wigner D matrix
Definition symmetry_rotation.cpp:154
std::vector< std::vector< RI::Tensor< std::complex< double > > > > rotmat_Slm_
the rotation matrix under the basis of S_l^m. size: [nsym][lmax][nm*nm]
Definition symmetry_rotation.h:166
void rotate_atompair_parallel(const TR *Alocal_in, const int isym, const Atom *atoms, const Statistics &st, const Tap &ap_in, const Tap &ap_out, const char mode, const Parallel_Orbitals &pv, TR *Alocal_out, const bool output=false) const
Definition symmetry_rotation_R_hcontainer.hpp:80
~Symmetry_rotation()
Definition symmetry_rotation.h:19
void set_Cs_rotation(const std::vector< std::vector< int > > &abfs_l_nchi)
Definition symmetry_rotation.cpp:15
std::vector< std::map< int, std::vector< std::complex< double > > > > Ms_
Definition symmetry_rotation.h:172
std::vector< std::vector< int > > abfs_l_nchi_
number of abfs for each angular momentum
Definition symmetry_rotation.h:163
RI::Tensor< Tdata > rotate_atompair_serial(const RI::Tensor< Tdata > &A, const int isym, const Atom &a1, const Atom &a2, const char mode, bool output=false) const
Definition symmetry_rotation_R.hpp:141
std::map< int, std::map< std::pair< int, TC >, RI::Tensor< Tdata > > > restore_HR(const Symmetry &symm, const Atom *atoms, const Statistics &st, const char mode, const std::map< int, std::map< std::pair< int, TC >, RI::Tensor< Tdata > > > &HR_irreduceble) const
Definition symmetry_rotation_R.hpp:40
void test_HR_rotation(const Symmetry &symm, const Atom *atoms, const Statistics &st, const char mode, const std::map< int, std::map< std::pair< int, TC >, RI::Tensor< Tdata > > > &HR_full)
Definition symmetry_rotation_R.hpp:241
TCdouble get_return_lattice(const int iat, const int isym) const
Definition symmetry_rotation.h:30
RI::Tensor< Tdata > set_rotation_matrix(const Atom &a, const int &isym) const
Definition symmetry_rotation_R.hpp:127
int abfs_Lmax_
Definition symmetry_rotation.h:161
const std::map< Tap, std::set< TC > > & get_irreducible_sector() const
Definition symmetry_rotation.h:23
std::vector< TC > get_Rs_from_BvK(const K_Vectors &kv) const
Definition symmetry_rotation.cpp:476
RI::Tensor< Tdata > set_rotation_matrix_abf(const int &type, const int &isym) const
Definition symmetry_rotation_R.hpp:183
std::complex< double > ovlp_Ylm_Slm(const int l, const int m1, const int m2) const
c^l_{m1, m2}=<Y_l^m1|S_l^m2>
Definition symmetry_rotation.cpp:180
void cal_Ms(const K_Vectors &kv, const UnitCell &ucell, const Parallel_2D &pv)
functions to contruct rotation matrix in AO-representation
Definition symmetry_rotation.cpp:21
void cal_rotmat_Slm(const ModuleBase::Matrix3 *gmatc, const int lmax)
T_mm' = [c^\dagger D c]_mm', the rotation matrix in the representation of real sphere harmonics.
Definition symmetry_rotation.cpp:254
std::complex< double > wigner_D(const TCdouble &euler_angle, const int l, const int m1, const int m2, const bool inv) const
Definition symmetry_rotation.cpp:171
void find_irreducible_sector(const Symmetry &symm, const Atom *atoms, const Statistics &st, const std::vector< TC > &Rs, const TC &period, const Lattice &lat)
Definition symmetry_rotation.h:39
std::vector< TC > get_Rs_from_adjacent_list(const UnitCell &ucell, const Grid_Driver &gd, const Parallel_Orbitals &pv) const
Definition symmetry_rotation.cpp:442
TCdouble get_euler_angle(const ModuleBase::Matrix3 &gmatc) const
calculate euler angle from rotation matrix
Definition symmetry_rotation.cpp:205
void print_HR(const std::map< int, std::map< std::pair< int, TC >, RI::Tensor< Tdata > > > &HR, const std::string name, const double &threshold=0.0)
Definition symmetry_rotation_R.hpp:224
std::vector< std::complex< double > > rot_matrix_ao(const std::vector< std::complex< double > > &DMkibz, const int ik_ibz, const int kstar_size, const int isym, const Parallel_2D &pv, const bool TRS_conj=false) const
Definition symmetry_rotation.cpp:405
RI::Tensor< Tdata > rotate_singleC_serial(const RI::Tensor< Tdata > &C, const int isym, const Atom &a1, const Atom &a2, const int &type1, bool output=false) const
rotate a 3-dim C tensor in RI technique
Definition symmetry_rotation_R.hpp:205
const std::vector< std::vector< RI::Tensor< std::complex< double > > > > & rotmat_Slm
the rotation matrix under the basis of S_l^m. size: [nsym][lmax][nm*nm]
Definition symmetry_rotation.h:35
std::vector< std::complex< double > > contruct_2d_rot_mat_ao(const Symmetry &symm, const Atom *atoms, const Statistics &cell_st, const TCdouble &kvec_d_ibz, int isym, const Parallel_2D &pv) const
Definition symmetry_rotation.cpp:370
Irreducible_Sector irs_
irreducible sector
Definition symmetry_rotation.h:175
void set_block_to_mat2d(const int starti, const int startj, const RI::Tensor< std::complex< double > > &block, std::vector< std::complex< double > > &obj_mat, const Parallel_2D &pv, const bool trans=false) const
Definition symmetry_rotation.cpp:340
bool TRS_first_
Definition symmetry_rotation.h:158
Definition symmetry.h:16
This class packs the basic information of 2D-block-cyclic parallel distribution of an arbitrary matri...
Definition parallel_2d.h:12
Definition parallel_orbitals.h:9
Definition unitcell.h:16
Definition hcontainer.h:144
Definition output.h:13
#define T
Definition exp.cpp:237
Definition symm_other.cpp:4
Abfs::Vector3_Order< double > TCdouble
Definition irreducible_sector.h:16
std::pair< Tap, TC > TapR
Definition irreducible_sector.h:15
std::string vec3_fmt(const T &x, const T &y, const T &z)
Definition symmetry_rotation.h:179
void print_symrot_info_k(const ModuleSymmetry::Symmetry_rotation &symrot, const K_Vectors &kv, const UnitCell &ucell)
Definition symmetry_rotation_output.cpp:54
std::array< int, 3 > TC
Definition irreducible_sector.h:14
void print_symrot_info_R(const Symmetry_rotation &symrot, const Symmetry &symm, const int lmax_ao, const std::vector< TC > &Rs)
Definition symmetry_rotation_output.cpp:14
std::pair< int, int > Tap
Definition irreducible_sector.h:13
std::array< int, 3 > TC
Definition ri_cv_io_test.cpp:9
#define threshold
Definition sph_bessel_recursive_test.cpp:4
info of lattice
Definition unitcell_data.h:8
usefull data and index maps
Definition unitcell_data.h:47