ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
irreducible_sector.h
Go to the documentation of this file.
1#pragma once
2#include <vector>
3#include <map>
4#include <set>
8#include "source_cell/klist.h"
9
10namespace ModuleSymmetry
11{
12 using Tap = std::pair<int, int>;
13 using TC = std::array<int, 3>;
14 using TapR = std::pair<Tap, TC>;
16
18 {
19 public:
21 {
22 bool operator()(const Tap& lhs, const Tap& rhs) const
23 {
24 if (lhs.first < rhs.first) {return true;
25 } else if (lhs.first > rhs.first) {return false;
26 } else { return lhs.second < rhs.second;
27}
28 }
29 };
31 {
32 bool operator()(const TapR& lhs, const TapR& rhs) const
33 {
34 if (lhs.first < rhs.first) {return true;
35 } else if (lhs.first > rhs.first) {return false;
36 } else { return lhs.second < rhs.second;
37}
38 }
39 };
41 {
42 int norm2(const TC& R)const
43 {
44 return R[0] * R[0] + R[1] * R[1] + R[2] * R[2];
45 }
46 bool operator()(const TC& lhs, const TC& rhs) const
47 {
48 if (norm2(lhs) < norm2(rhs)) {return true;
49 } else if (norm2(lhs) > norm2(rhs)) {return false;
50 } else { return lhs < rhs;
51}
52 }
53 };
54
55 //--------------------------------------------------------------------------------
57 void find_irreducible_sector(const Symmetry& symm, const Atom* atoms, const Statistics& st,
58 const std::vector<TC>& Rs, const TC& period, const Lattice& lat);
59 const std::map<Tap, std::set<TC>>& get_irreducible_sector()const { return this->irreducible_sector_; }
60 // const std::map<int, std::set<std::pair<int, TC>>> convirt_irreducible_sector() {};
61 //--------------------------------------------------------------------------------
62
67 const ModuleBase::Matrix3& gmatd, const TCdouble gtransd,
68 const TCdouble& posd_a1, const TCdouble& posd_a2)const;
69
70 // Getting calculated return lattice
71 TCdouble get_return_lattice(const int iat, const int isym) const
72 {
73 if (iat < 0 || iat >= static_cast<int>(this->return_lattice_.size())) {
74 throw std::out_of_range("Invalid atom index in get_return_lattice");
75 }
76 if (isym < 0 || isym >= static_cast<int>(this->return_lattice_[iat].size())) {
77 throw std::out_of_range("Invalid symmetry index in get_return_lattice");
78 }
79 return this->return_lattice_[iat][isym];
80 }
81 protected:
82 void cal_return_lattice_all(const Symmetry& symm, const Atom* atoms, const Statistics& st);
83
84 //--------------------------------------------------------------------------------
86
89 TC rotate_R(const Symmetry& symm, const int isym, const int iat1, const int iat2, const TC& R, const char gauge = 'R')const;
90 TapR rotate_apR_by_formula(const Symmetry& symm, const int isym, const TapR& iapR, const char gauge = 'R')const;
92 TCdouble get_aRb_direct(const Atom* atoms, const Statistics& st, const int iat1, const int iat2, const TC& R, const char gauge = 'R')const;
93 TCdouble get_aRb_direct(const Atom* atoms, const Statistics& st, const int iat1, const int iat2, const TCdouble& R, const char gauge = 'R')const;
94
96
97 // /// find the irreducible atom pairs
98 // /// algorithm 1: the way finding irreducible k-points
99 // void find_irreducible_atom_pairs(const Symmetry& symm);
100 // /// algorithm 2: taking out atom pairs from the initial set
101 // void find_irreducible_atom_pairs_set(const Symmetry& symm);
102 // /// double check between the two algorithms
103 // void test_irreducible_atom_pairs(const Symmetry& symm);
104
105 void output_full_map_to_irreducible_sector(const int nat);
106 void output_sector_star();
108
109 //--------------------------------------------------------------------------------
111 void gen_symmetry_BvK(const Symmetry& symm, const Atom* atoms, const Lattice& lat, const Statistics& st, const TC bvk_period);
113 // std::vector<bool> in_plain(const ModuleSymmetry::Symmetry& symm, const ModuleBase::Matrix3& latvec)const;
114 //--------------------------------------------------------------------------------
115
116 //--------------------------------------------------------------------------------
118 // std::vector<std::map<int, Tap>> atompair_stars_;
119
121 // (including R in other atom pairs that cannot rotate into R_stars_[irreducebule_ap])
122 std::map<Tap, std::set<TC>> irreducible_sector_;
123
124 // //[natoms*natoms](R, (isym, irreducible_R))
125 // std::vector<std::map<TC, std::pair<int, TC>>> full_map_to_irreducible_sector_;
126 // (abR) -> (isym, abR)
127 std::map<TapR, std::pair<int, TapR>, apR_less_func> full_map_to_irreducible_sector_;
128
129 // all the {abR}s , where the isym=0 one in each star forms the irreducible sector.
130 // [irreducible sector size][isym, ((ab),R)]
131 std::map<TapR, std::map<int, TapR>> sector_stars_;
132
134 std::vector<std::vector<TCdouble>> return_lattice_;
135
136 std::vector<int> invmap_;
137
139 std::vector<int> isymbvk_to_isym_;
141
142 friend class Symmetry_rotation;
143 };
144}
Definition abfs-vector3_order.h:16
Definition atom_spec.h:6
3x3 matrix and related mathamatical operations
Definition matrix3.h:19
Definition irreducible_sector.h:18
std::vector< int > invmap_
Definition irreducible_sector.h:136
std::vector< int > isymbvk_to_isym_
symmetry info for BvK supercell
Definition irreducible_sector.h:139
int bvk_nsym_
Definition irreducible_sector.h:140
void gen_symmetry_BvK(const Symmetry &symm, const Atom *atoms, const Lattice &lat, const Statistics &st, const TC bvk_period)
The sub functions judge special symmetry.
Definition irreducible_sector_bvk.cpp:38
std::vector< std::vector< TCdouble > > return_lattice_
the direct lattice vector of {R|t}\tau-\tau' for each atoms and each symmetry operation....
Definition irreducible_sector.h:134
TapR rotate_apR_by_formula(const Symmetry &symm, const int isym, const TapR &iapR, const char gauge='R') const
Definition irreducible_sector.cpp:15
void cal_return_lattice_all(const Symmetry &symm, const Atom *atoms, const Statistics &st)
Definition irreducible_sector.cpp:89
TC rotate_R(const Symmetry &symm, const int isym, const int iat1, const int iat2, const TC &R, const char gauge='R') const
The sub functions to find irreducible sector: {abR}.
Definition irreducible_sector.cpp:5
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
std::map< Tap, std::set< TC > > irreducible_sector_
whether in 2D plain or not for each symmetry operation
Definition irreducible_sector.h:122
TCdouble get_return_lattice(const int iat, const int isym) const
Definition irreducible_sector.h:71
const std::map< Tap, std::set< TC > > & get_irreducible_sector() const
Definition irreducible_sector.h:59
void output_full_map_to_irreducible_sector(const int nat)
Definition irreducible_sector.cpp:108
std::map< TapR, std::map< int, TapR > > sector_stars_
Definition irreducible_sector.h:131
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
ModuleBase::Matrix3 direct_to_cartesian(const ModuleBase::Matrix3 &d, const ModuleBase::Matrix3 &latvec) const
Definition irreducible_sector_bvk.cpp:4
std::map< TapR, std::pair< int, TapR >, apR_less_func > full_map_to_irreducible_sector_
Definition irreducible_sector.h:127
void output_sector_star()
Definition irreducible_sector.cpp:123
void write_irreducible_sector()
Definition irreducible_sector.cpp:146
TCdouble get_aRb_direct(const Atom *atoms, const Statistics &st, const int iat1, const int iat2, const TC &R, const char gauge='R') const
gauge='L': tau_a + R - tau_b; gauge='R': tau_a - tau_b - R (direct)
Definition irreducible_sector.cpp:28
Definition symmetry_rotation.h:16
Definition symmetry.h:15
Definition symm_other.cpp:4
std::pair< Tap, TC > TapR
Definition irreducible_sector.h:14
std::array< int, 3 > TC
Definition irreducible_sector.h:13
std::pair< int, int > Tap
Definition irreducible_sector.h:12
info of lattice
Definition unitcell_data.h:8
Definition irreducible_sector.h:31
bool operator()(const TapR &lhs, const TapR &rhs) const
Definition irreducible_sector.h:32
Definition irreducible_sector.h:21
bool operator()(const Tap &lhs, const Tap &rhs) const
Definition irreducible_sector.h:22
Definition irreducible_sector.h:41
bool operator()(const TC &lhs, const TC &rhs) const
Definition irreducible_sector.h:46
int norm2(const TC &R) const
Definition irreducible_sector.h:42
usefull data and index maps
Definition unitcell_data.h:47