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>
9#include "source_cell/klist.h"
10
11namespace ModuleSymmetry
12{
13 using Tap = std::pair<int, int>;
14 using TC = std::array<int, 3>;
15 using TapR = std::pair<Tap, TC>;
17
19 {
20 public:
22 {
23 bool operator()(const Tap& lhs, const Tap& rhs) const
24 {
25 if (lhs.first < rhs.first) {return true;
26 } else if (lhs.first > rhs.first) {return false;
27 } else { return lhs.second < rhs.second;
28}
29 }
30 };
32 {
33 bool operator()(const TapR& lhs, const TapR& rhs) const
34 {
35 if (lhs.first < rhs.first) {return true;
36 } else if (lhs.first > rhs.first) {return false;
37 } else { return lhs.second < rhs.second;
38}
39 }
40 };
42 {
43 int norm2(const TC& R)const
44 {
45 return R[0] * R[0] + R[1] * R[1] + R[2] * R[2];
46 }
47 bool operator()(const TC& lhs, const TC& rhs) const
48 {
49 if (norm2(lhs) < norm2(rhs)) {return true;
50 } else if (norm2(lhs) > norm2(rhs)) {return false;
51 } else { return lhs < rhs;
52}
53 }
54 };
55
56 //--------------------------------------------------------------------------------
58 void find_irreducible_sector(const Symmetry& symm, const Atom* atoms, const Statistics& st,
59 const std::vector<TC>& Rs, const TC& period, const Lattice& lat);
60 const std::map<Tap, std::set<TC>>& get_irreducible_sector()const { return this->irreducible_sector_; }
61 // const std::map<int, std::set<std::pair<int, TC>>> convirt_irreducible_sector() {};
62 //--------------------------------------------------------------------------------
63
68 const ModuleBase::Matrix3& gmatd, const TCdouble gtransd,
69 const TCdouble& posd_a1, const TCdouble& posd_a2)const;
70
71 // Getting calculated return lattice
72 TCdouble get_return_lattice(const int iat, const int isym) const
73 {
74 if (iat < 0 || iat >= static_cast<int>(this->return_lattice_.size())) {
75 throw std::out_of_range("Invalid atom index in get_return_lattice");
76 }
77 if (isym < 0 || isym >= static_cast<int>(this->return_lattice_[iat].size())) {
78 throw std::out_of_range("Invalid symmetry index in get_return_lattice");
79 }
80 return this->return_lattice_[iat][isym];
81 }
82 protected:
83 void cal_return_lattice_all(const Symmetry& symm, const Atom* atoms, const Statistics& st);
84
85 //--------------------------------------------------------------------------------
87
90 TC rotate_R(const Symmetry& symm, const int isym, const int iat1, const int iat2, const TC& R, const char gauge = 'R')const;
91 TapR rotate_apR_by_formula(const Symmetry& symm, const int isym, const TapR& iapR, const char gauge = 'R')const;
93 TCdouble get_aRb_direct(const Atom* atoms, const Statistics& st, const int iat1, const int iat2, const TC& R, const char gauge = 'R')const;
94 TCdouble get_aRb_direct(const Atom* atoms, const Statistics& st, const int iat1, const int iat2, const TCdouble& R, const char gauge = 'R')const;
95
97
98 // /// find the irreducible atom pairs
99 // /// algorithm 1: the way finding irreducible k-points
100 // void find_irreducible_atom_pairs(const Symmetry& symm);
101 // /// algorithm 2: taking out atom pairs from the initial set
102 // void find_irreducible_atom_pairs_set(const Symmetry& symm);
103 // /// double check between the two algorithms
104 // void test_irreducible_atom_pairs(const Symmetry& symm);
105
106 void output_full_map_to_irreducible_sector(const int nat);
107 void output_sector_star();
109
110 //--------------------------------------------------------------------------------
112 void gen_symmetry_BvK(const Symmetry& symm, const Atom* atoms, const Lattice& lat, const Statistics& st, const TC bvk_period);
114 // std::vector<bool> in_plain(const ModuleSymmetry::Symmetry& symm, const ModuleBase::Matrix3& latvec)const;
115 //--------------------------------------------------------------------------------
116
117 //--------------------------------------------------------------------------------
119 // std::vector<std::map<int, Tap>> atompair_stars_;
120
122 // (including R in other atom pairs that cannot rotate into R_stars_[irreducebule_ap])
123 std::map<Tap, std::set<TC>> irreducible_sector_;
124
125 // //[natoms*natoms](R, (isym, irreducible_R))
126 // std::vector<std::map<TC, std::pair<int, TC>>> full_map_to_irreducible_sector_;
127 // (abR) -> (isym, abR)
128 std::map<TapR, std::pair<int, TapR>, apR_less_func> full_map_to_irreducible_sector_;
129
130 // all the {abR}s , where the isym=0 one in each star forms the irreducible sector.
131 // [irreducible sector size][isym, ((ab),R)]
132 std::map<TapR, std::map<int, TapR>> sector_stars_;
133
135 std::vector<std::vector<TCdouble>> return_lattice_;
136
137 std::vector<int> invmap_;
138
140 std::vector<int> isymbvk_to_isym_;
142
143 friend class Symmetry_rotation;
144 };
145}
Definition abfs-vector3_order.h:16
Definition atom_spec.h:7
3x3 matrix and related mathamatical operations
Definition matrix3.h:19
Definition irreducible_sector.h:19
std::vector< int > invmap_
Definition irreducible_sector.h:137
std::vector< int > isymbvk_to_isym_
symmetry info for BvK supercell
Definition irreducible_sector.h:140
int bvk_nsym_
Definition irreducible_sector.h:141
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:135
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:123
TCdouble get_return_lattice(const int iat, const int isym) const
Definition irreducible_sector.h:72
const std::map< Tap, std::set< TC > > & get_irreducible_sector() const
Definition irreducible_sector.h:60
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:132
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:128
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:16
Definition symm_other.cpp:4
std::pair< Tap, TC > TapR
Definition irreducible_sector.h:15
std::array< int, 3 > TC
Definition irreducible_sector.h:14
std::pair< int, int > Tap
Definition irreducible_sector.h:13
info of lattice
Definition unitcell_data.h:8
Definition irreducible_sector.h:32
bool operator()(const TapR &lhs, const TapR &rhs) const
Definition irreducible_sector.h:33
Definition irreducible_sector.h:22
bool operator()(const Tap &lhs, const Tap &rhs) const
Definition irreducible_sector.h:23
Definition irreducible_sector.h:42
bool operator()(const TC &lhs, const TC &rhs) const
Definition irreducible_sector.h:47
int norm2(const TC &R) const
Definition irreducible_sector.h:43
usefull data and index maps
Definition unitcell_data.h:47