Cytnx v0.7.3
Loading...
Searching...
No Matches
Symmetry.hpp
Go to the documentation of this file.
1#ifndef _H_Symmetry
2#define _H_Symmetry
3
4
5#include "Type.hpp"
6#include "cytnx_error.hpp"
8#include <string>
9#include <cstdio>
10#include "utils/vec_clone.hpp"
11namespace cytnx{
13 struct __sym{
14 enum __stype{
15 U = -1,
16 Z = 0
17 };
18 };
19
20 class SymmetryType_class{
21 public:
22 enum : int{
23 Void=-99,
24 U=-1,
25 Z=0,
26 };
27 std::string getname(const int &stype);
28 };
29 extern SymmetryType_class SymType;
31
33 class Symmetry_base: public intrusive_ptr_base<Symmetry_base>{
34 public:
35 int stype_id;
36 int n;
37 Symmetry_base():stype_id(SymType.Void){};
38 Symmetry_base(const int &n):stype_id(SymType.Void){
39 this->Init(n);
40 };
41 Symmetry_base(const Symmetry_base &rhs);
42 Symmetry_base& operator=(const Symmetry_base &rhs);
43
44 std::vector<cytnx_int64> combine_rule( const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
45 cytnx_int64 combine_rule( const cytnx_int64 &inL, const cytnx_int64 &inR);
46
47 cytnx_int64 reverse_rule( const cytnx_int64 &in);
48
49
50 virtual void Init(const int &n){};
51 virtual boost::intrusive_ptr<Symmetry_base> clone(){return nullptr;};
52 virtual bool check_qnum(const cytnx_int64 &in_qnum); // check the passed in qnums satisfy the symmetry requirement.
53 virtual bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
54 virtual void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
55 virtual void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR);
56 virtual void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
57 //virtual std::vector<cytnx_int64>& combine_rule(const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
58
59 };
61
63 class U1Symmetry : public Symmetry_base{
64 public:
65 U1Symmetry(){this->stype_id = SymType.U;};
66 U1Symmetry(const int &n){this->Init(n);};
67 void Init(const int &n){
68 this->stype_id = SymType.U;
69 this->n = n;
70 if(n!=1) cytnx_error_msg(1,"%s","[ERROR] U1Symmetry should set n = 1");
71 }
72 boost::intrusive_ptr<Symmetry_base> clone(){
73 boost::intrusive_ptr<Symmetry_base> out(new U1Symmetry(this->n));
74 return out;
75 }
76 bool check_qnum(const cytnx_int64 &in_qnum);
77 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
78 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
79 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR);
80 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
81 };
83
85 class ZnSymmetry : public Symmetry_base{
86 public:
87 ZnSymmetry(){this->stype_id = SymType.Z;};
88 ZnSymmetry(const int &n){this->Init(n);};
89 void Init(const int &n){
90 this->stype_id = SymType.Z;
91 this->n = n;
92 if(n<=1) cytnx_error_msg(1,"%s","[ERROR] ZnSymmetry can only have n > 1");
93 }
94 boost::intrusive_ptr<Symmetry_base> clone(){
95 boost::intrusive_ptr<Symmetry_base> out(new ZnSymmetry(this->n));
96 return out;
97 }
98 bool check_qnum(const cytnx_int64 &in_qnum);
99 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
100 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
101 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR);
102 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
103 };
105
106 //=====================================
107 // this is API
109 class Symmetry{
110 public:
111 //[Note] these two are hide from user.
113 boost::intrusive_ptr<Symmetry_base> _impl;
114
115 Symmetry(const int &stype=-1, const int &n=0): _impl( new Symmetry_base()){
116 this->Init(stype,n);
117 }; //default is U1Symmetry
118
119 void Init(const int &stype=-1, const int &n=0){
120 if(stype==SymType.U){
121 boost::intrusive_ptr<Symmetry_base> tmp(new U1Symmetry(1));
122 this->_impl = tmp;
123 }else if(stype==SymType.Z){
124 boost::intrusive_ptr<Symmetry_base> tmp(new ZnSymmetry(n));
125 this->_impl = tmp;
126 }else{
127 cytnx_error_msg(1,"%s","[ERROR] invalid symmetry type.");
128 }
129 }
130 Symmetry& operator=(const Symmetry &rhs){
131 this->_impl = rhs._impl;
132 return *this;
133 }
134 Symmetry(const Symmetry &rhs){
135 this->_impl = rhs._impl;
136 }
138
139
140 //[genenrators]
167 static Symmetry U1(){
168 return Symmetry(SymType.U,1);
169 }
170
198 static Symmetry Zn(const int &n){
199 return Symmetry(SymType.Z,n);
200 }
201
217 Symmetry out;
218 out._impl = this->_impl->clone();
219 return out;
220 }
221
222
229 int stype() const {
230 return this->_impl->stype_id;
231 }
232
242 int & n() const{
243 return this->_impl->n;
244 }
245
252 std::string stype_str() const{
253 return SymType.getname(this->_impl->stype_id) + std::to_string(this->_impl->n);
254 }
255
256
257
264 bool check_qnum(const cytnx_int64 &qnum){
265 return this->_impl->check_qnum(qnum);
266 }
267
274 bool check_qnums(const std::vector<cytnx_int64> &qnums){
275 return this->_impl->check_qnums(qnums);
276 }
277
285 std::vector<cytnx_int64> combine_rule(const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR){
286 return this->_impl->combine_rule(inL,inR);
287 }
288
296 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR){
297 this->_impl->combine_rule_(out,inL,inR);
298 }
299
308 return this->_impl->combine_rule(inL,inR);
309 }
310
318 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR){
319 this->_impl->combine_rule_(out,inL,inR);
320 }
321
322
323 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in){
324 this->_impl->reverse_rule_(out,in);
325 }
326
328 return this->_impl->reverse_rule(in);
329 }
330
331 void Save(const std::string &fname) const;
332 void Save(const char* fname) const;
333 static Symmetry Load(const std::string &fname);
334 static Symmetry Load(const char* fname);
335
337 void _Save(std::fstream &f) const;
338 void _Load(std::fstream &f);
340
341 bool operator==(const Symmetry &rhs) const;
342 bool operator!=(const Symmetry &rhs) const;
343 };
344
345
346}
347#endif
the symmetry object
Definition Symmetry.hpp:109
static Symmetry Zn(const int &n)
create a Zn descrete symmetry object with
Definition Symmetry.hpp:198
bool check_qnum(const cytnx_int64 &qnum)
check the quantum number is within the valid value range of current Symmetry.
Definition Symmetry.hpp:264
std::vector< cytnx_int64 > combine_rule(const std::vector< cytnx_int64 > &inL, const std::vector< cytnx_int64 > &inR)
apply combine rule of current symmetry to two quantum number lists.
Definition Symmetry.hpp:285
std::string stype_str() const
return the symmetry type name of current Symmetry object.
Definition Symmetry.hpp:252
Symmetry clone() const
return a clone instance of current Symmetry object.
Definition Symmetry.hpp:216
bool check_qnums(const std::vector< cytnx_int64 > &qnums)
check all the quantum numbers are within the valid value range of current Symmetry.
Definition Symmetry.hpp:274
static Symmetry Load(const std::string &fname)
Definition Symmetry.cpp:171
int stype() const
return the symmetry type-id of current Symmetry object.
Definition Symmetry.hpp:229
int & n() const
return the descrete n of current Symmetry object.
Definition Symmetry.hpp:242
bool operator==(const Symmetry &rhs) const
Definition Symmetry.cpp:13
void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR)
apply combine rule of current symmetry to two quantum numbers, and store the combined quntun number i...
Definition Symmetry.hpp:318
void combine_rule_(std::vector< cytnx_int64 > &out, const std::vector< cytnx_int64 > &inL, const std::vector< cytnx_int64 > &inR)
apply combine rule of current symmetry to two quantum number lists, and store it into parameter
Definition Symmetry.hpp:296
cytnx_int64 combine_rule(const cytnx_int64 &inL, const cytnx_int64 &inR)
apply combine rule of current symmetry to two quantum numbers.
Definition Symmetry.hpp:307
static Symmetry U1()
create a U1 symmetry object
Definition Symmetry.hpp:167
void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in)
Definition Symmetry.hpp:323
bool operator!=(const Symmetry &rhs) const
Definition Symmetry.cpp:16
void Save(const std::string &fname) const
Definition Symmetry.cpp:151
cytnx_int64 reverse_rule(const cytnx_int64 &in)
Definition Symmetry.hpp:327
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:18
Definition Accessor.hpp:12
int64_t cytnx_int64
Definition Type.hpp:25
SymmetryType_class SymType
Definition Symmetry.cpp:218