StatMech
Loading...
Searching...
No Matches
ParitySector.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Headers/mytypes.hpp"
4#include "HilbertSpace.hpp"
5#include "Eigen/SparseCore"
6
14template<class ManyBodySpace, typename RealType = Real_t>
15class ParitySector : public SubSpace<ManyBodySpace, RealType> {
16 private:
19
20 __host__ __device__ int numParityPairs() {
21 assert((this->dim() - m_NumParityEigens) % 2 == 0);
22 return (this->dim() - m_NumParityEigens) / 2;
23 }
24
25 public:
33 template<typename std::enable_if_t< std::is_convertible_v<
34 ManyBodySpace, ManyBodySpaceBase<ManyBodySpace>> >* = nullptr>
35 __host__ __device__ ParitySector(int parity, ManyBodySpace const& mbHSpace)
36 : Base(mbHSpace), m_parity(parity) {
37 debug_constructor_printf(1);
38 assert(parity == +1 || parity == -1);
39 if(this->totalSpace().sysSize() == 0) { return; }
40
41 Eigen::ArrayX<bool> calculated = Eigen::ArrayX<bool>::Constant(mbHSpace.dim(), false);
42 for(int state = 0; state != mbHSpace.dim(); ++state) {
43 if(calculated[state]) continue;
44 calculated[state] = true;
45
46 int reversed = mbHSpace.reverse(state);
47 if(reversed == state)
49 else
50 calculated[reversed] = true;
51 }
52 int dim = (mbHSpace.dim() - m_NumParityEigens) / 2;
53 if(m_parity == +1) dim += m_NumParityEigens;
54 debug_print("mbHSpace.dim() = " << mbHSpace.dim() << ", dim = " << dim
55 << ", m_NumParityEigens = " << m_NumParityEigens);
56
57 this->basis().resize(mbHSpace.dim(), dim);
58 this->basis().reserve(Eigen::VectorXi::Constant(dim, 2));
59 dim = 0;
60 calculated = Eigen::ArrayX<bool>::Constant(mbHSpace.dim(), false);
61 Eigen::ArrayXi parityEigen(m_NumParityEigens);
63 for(int state = 0; state != mbHSpace.dim(); ++state) {
64 if(calculated[state]) continue;
65 calculated[state] = true;
66
67 int reversed = mbHSpace.reverse(state);
68 if(reversed == state) { parityEigen(m_NumParityEigens++) = state; }
69 else {
70 this->basis().insert(state, dim) = 1.0 / sqrt(2.0);
71 this->basis().insert(reversed, dim) = 1.0 / sqrt(2.0);
72 calculated[reversed] = true;
73 dim += 1;
74 }
75 }
76 if(m_parity == 1) {
77 for(int j = 0; j != parityEigen.size(); ++j)
78 this->basis().insert(parityEigen[j], dim++) = 1;
79 }
80
81 debug_print("mbHSpace.dim() = " << mbHSpace.dim() << ", dim = " << dim
82 << ", this->dim() = " << this->dim());
83 this->basis().makeCompressed();
84 assert(dim == this->dim());
85 };
93 template<typename... Args>
94 __host__ __device__ ParitySector(int parity, int systemSize, Args... args)
95 : ParitySector(parity, ManyBodySpace(systemSize, args...)) {
96 debug_constructor_printf((Default));
97 }
98
99 __host__ __device__ int parity() const { return m_parity; };
100
101 __host__ __device__ int rep(int j, int trans = 0) const {
102 assert(j < this->dim());
103 int const period
104 = this->basis().outerIndexPtr()[j + 1] - this->basis().outerIndexPtr()[j];
105 int const innerId = this->basis().outerIndexPtr()[j] + (trans % period);
106 assert(innerId < this->basis().nonZeros());
107 return this->basis().innerIndexPtr()[innerId];
108 };
109
110 __host__ __device__ int period(int j) const {
111 assert(j < this->dim() && "j < this->dim()");
112 return this->basis().outerIndexPtr()[j + 1] - this->basis().outerIndexPtr()[j];
113 };
114};
__host__ __device__ int dim() const
Definition HilbertSpace.hpp:34
ManyBodySpinSpace defined by , where.
Definition HilbertSpace.hpp:130
Parity invariant sector of a many-body Hilbert space.
Definition ParitySector.hpp:15
__host__ __device__ ParitySector(int parity, ManyBodySpace const &mbHSpace)
Construct a ParitySector object from a ManyBodySpace object.
Definition ParitySector.hpp:35
__host__ __device__ int rep(int j, int trans=0) const
Definition ParitySector.hpp:101
__host__ __device__ int parity() const
Definition ParitySector.hpp:99
int m_parity
Definition ParitySector.hpp:17
__host__ __device__ ParitySector(int parity, int systemSize, Args... args)
Default constructor.
Definition ParitySector.hpp:94
__host__ __device__ int numParityPairs()
Definition ParitySector.hpp:20
int m_NumParityEigens
Definition ParitySector.hpp:18
__host__ __device__ int period(int j) const
Definition ParitySector.hpp:110
__host__ __device__ int * innerIndexPtr() const
Definition MatrixUtils.cuh:421
__host__ __device__ void resize(int rows, int cols, int reserved=1)
Definition MatrixUtils.cuh:353
__host__ __device__ int * outerIndexPtr() const
Definition MatrixUtils.cuh:420
Definition HilbertSpace.hpp:568
__host__ __device__ Matrix_t & basis()
Definition HilbertSpace.hpp:668
__host__ __device__ TotalSpace const & totalSpace() const
Definition HilbertSpace.hpp:671
debug_print("# Determining GPU configuration.")