Cytnx v0.7.4
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 <iostream>
11#include <ostream>
12#include "utils/vec_clone.hpp"
13namespace cytnx{
15 struct __sym{
16 enum __stype{
17 U = -1,
18 Z = 0
19 };
20 };
21
22 class SymmetryType_class{
23 public:
24 enum : int{
25 Void=-99,
26 U=-1,
27 Z=0,
28 };
29 std::string getname(const int &stype);
30 };
31 extern SymmetryType_class SymType;
33
35 class Symmetry_base: public intrusive_ptr_base<Symmetry_base>{
36 public:
37 int stype_id;
38 int n;
39 Symmetry_base():stype_id(SymType.Void){};
40 Symmetry_base(const int &n):stype_id(SymType.Void){
41 this->Init(n);
42 };
43 Symmetry_base(const Symmetry_base &rhs);
44 Symmetry_base& operator=(const Symmetry_base &rhs);
45
46 std::vector<cytnx_int64> combine_rule( const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
47 cytnx_int64 combine_rule( const cytnx_int64 &inL, const cytnx_int64 &inR);
48
49 cytnx_int64 reverse_rule( const cytnx_int64 &in);
50
51
52 virtual void Init(const int &n){};
53 virtual boost::intrusive_ptr<Symmetry_base> clone(){return nullptr;};
54 virtual bool check_qnum(const cytnx_int64 &in_qnum); // check the passed in qnums satisfy the symmetry requirement.
55 virtual bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
56 virtual void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
57 virtual void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR);
58 virtual void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
59 virtual void print_info() const;
60 //virtual std::vector<cytnx_int64>& combine_rule(const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
61
62 };
64
66 class U1Symmetry : public Symmetry_base{
67 public:
68 U1Symmetry(){this->stype_id = SymType.U;};
69 U1Symmetry(const int &n){this->Init(n);};
70 void Init(const int &n){
71 this->stype_id = SymType.U;
72 this->n = n;
73 if(n!=1) cytnx_error_msg(1,"%s","[ERROR] U1Symmetry should set n = 1");
74 }
75 boost::intrusive_ptr<Symmetry_base> clone(){
76 boost::intrusive_ptr<Symmetry_base> out(new U1Symmetry(this->n));
77 return out;
78 }
79 bool check_qnum(const cytnx_int64 &in_qnum);
80 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
81 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
82 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR);
83 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
84 void print_info() const;
85 };
87
89 class ZnSymmetry : public Symmetry_base{
90 public:
91 ZnSymmetry(){this->stype_id = SymType.Z;};
92 ZnSymmetry(const int &n){this->Init(n);};
93 void Init(const int &n){
94 this->stype_id = SymType.Z;
95 this->n = n;
96 if(n<=1) cytnx_error_msg(1,"%s","[ERROR] ZnSymmetry can only have n > 1");
97 }
98 boost::intrusive_ptr<Symmetry_base> clone(){
99 boost::intrusive_ptr<Symmetry_base> out(new ZnSymmetry(this->n));
100 return out;
101 }
102 bool check_qnum(const cytnx_int64 &in_qnum);
103 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
104 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR);
105 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR);
106 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
107 void print_info() const;
108 };
110
111 //=====================================
112 // this is API
114 class Symmetry{
115 public:
116 //[Note] these two are hide from user.
118 boost::intrusive_ptr<Symmetry_base> _impl;
119
120 Symmetry(const int &stype=-1, const int &n=0): _impl( new Symmetry_base()){
121 this->Init(stype,n);
122 }; //default is U1Symmetry
123
124 void Init(const int &stype=-1, const int &n=0){
125 if(stype==SymType.U){
126 boost::intrusive_ptr<Symmetry_base> tmp(new U1Symmetry(1));
127 this->_impl = tmp;
128 }else if(stype==SymType.Z){
129 boost::intrusive_ptr<Symmetry_base> tmp(new ZnSymmetry(n));
130 this->_impl = tmp;
131 }else{
132 cytnx_error_msg(1,"%s","[ERROR] invalid symmetry type.");
133 }
134 }
135 Symmetry& operator=(const Symmetry &rhs){
136 this->_impl = rhs._impl;
137 return *this;
138 }
139 Symmetry(const Symmetry &rhs){
140 this->_impl = rhs._impl;
141 }
143
144
145 //[genenrators]
172 static Symmetry U1(){
173 return Symmetry(SymType.U,1);
174 }
175
203 static Symmetry Zn(const int &n){
204 return Symmetry(SymType.Z,n);
205 }
206
222 Symmetry out;
223 out._impl = this->_impl->clone();
224 return out;
225 }
226
227
234 int stype() const {
235 return this->_impl->stype_id;
236 }
237
247 int & n() const{
248 return this->_impl->n;
249 }
250
257 std::string stype_str() const{
258 return SymType.getname(this->_impl->stype_id) + std::to_string(this->_impl->n);
259 }
260
261
262
269 bool check_qnum(const cytnx_int64 &qnum){
270 return this->_impl->check_qnum(qnum);
271 }
272
279 bool check_qnums(const std::vector<cytnx_int64> &qnums){
280 return this->_impl->check_qnums(qnums);
281 }
282
290 std::vector<cytnx_int64> combine_rule(const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR){
291 return this->_impl->combine_rule(inL,inR);
292 }
293
301 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL, const std::vector<cytnx_int64> &inR){
302 this->_impl->combine_rule_(out,inL,inR);
303 }
304
313 return this->_impl->combine_rule(inL,inR);
314 }
315
323 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR){
324 this->_impl->combine_rule_(out,inL,inR);
325 }
326
327
328 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in){
329 this->_impl->reverse_rule_(out,in);
330 }
331
333 return this->_impl->reverse_rule(in);
334 }
335
336 void Save(const std::string &fname) const;
337 void Save(const char* fname) const;
338 static Symmetry Load(const std::string &fname);
339 static Symmetry Load(const char* fname);
340
342 void _Save(std::fstream &f) const;
343 void _Load(std::fstream &f);
345
346 void print_info() const{
347 this->_impl->print_info();
348 }
349
350 bool operator==(const Symmetry &rhs) const;
351 bool operator!=(const Symmetry &rhs) const;
352
353
354 };
355
356
357 std::ostream & operator<<(std::ostream &os, const Symmetry &in);
358
359}
360#endif
the symmetry object
Definition Symmetry.hpp:114
static Symmetry Zn(const int &n)
create a Zn descrete symmetry object with
Definition Symmetry.hpp:203
bool check_qnum(const cytnx_int64 &qnum)
check the quantum number is within the valid value range of current Symmetry.
Definition Symmetry.hpp:269
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:290
std::string stype_str() const
return the symmetry type name of current Symmetry object.
Definition Symmetry.hpp:257
Symmetry clone() const
return a clone instance of current Symmetry object.
Definition Symmetry.hpp:221
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:279
static Symmetry Load(const std::string &fname)
Definition Symmetry.cpp:193
int stype() const
return the symmetry type-id of current Symmetry object.
Definition Symmetry.hpp:234
int & n() const
return the descrete n of current Symmetry object.
Definition Symmetry.hpp:247
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:323
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:301
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:312
void print_info() const
Definition Symmetry.hpp:346
static Symmetry U1()
create a U1 symmetry object
Definition Symmetry.hpp:172
void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in)
Definition Symmetry.hpp:328
bool operator!=(const Symmetry &rhs) const
Definition Symmetry.cpp:16
void Save(const std::string &fname) const
Definition Symmetry.cpp:173
cytnx_int64 reverse_rule(const cytnx_int64 &in)
Definition Symmetry.hpp:332
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:18
Definition Accessor.hpp:12
std::ostream & operator<<(std::ostream &os, const Scalar &in)
Definition Scalar.cpp:14
int64_t cytnx_int64
Definition Type.hpp:25
SymmetryType_class SymType
Definition Symmetry.cpp:247