5#include "Eigen/SparseCore"
7 #include <thrust/sort.h>
8 #include <thrust/execution_policy.h>
18template<
typename RealType = Real_t>
42 debug_constructor_printf((Default));
45 __host__ __device__
constexpr int momentum()
const {
return 0; };
49 __host__ __device__
int rep(
int j,
int trans = 0)
const {
51 assert(innerId < this->
basis().nonZeros() &&
"innerId < this->basis().nonZeros()");
55 __host__ __device__
int period(
int j)
const {
56 assert(j < this->
dim() &&
"j < this->dim()");
61template<
typename RealType>
65 m_parity((parity >= 0 ? +1 : -1)) {
66 debug_constructor_printf(1);
68 if(this->totalSpace().sysSize() == 0) {
return; }
70 this->totalSpace().computeTransEqClass();
71 debug_printf(
"%s:\n\t this->totalSpace().dim()=%d, this->totalSpace().transEqDim()=%d, "
72 "this->totalSpace().transPeriod().sum()=%d\n",
73 __PRETTY_FUNCTION__, this->totalSpace().dim(), this->totalSpace().transEqDim(),
74 this->totalSpace().transPeriod().sum());
75 assert(this->totalSpace().transPeriod().sum() == this->totalSpace().dim());
77 int L = this->totalSpace().sysSize();
80 Eigen::ArrayX<bool> calculated;
81 calculated = Eigen::ArrayX<bool>::Constant(this->totalSpace().transEqDim(),
false);
82 for(
int eqClass = 0; eqClass < this->totalSpace().transEqDim(); ++eqClass) {
83 if(calculated(eqClass))
continue;
84 calculated(eqClass) =
true;
85 auto repState = this->totalSpace().transEqClassRep(eqClass);
86 auto revState = this->totalSpace().reverse(repState);
87 auto reversed = this->totalSpace().stateToTransEqClass(revState);
88 calculated(reversed) =
true;
92 if(eqClass != reversed) { m_numParityPairs += 1; }
95 if(m_parity == -1) dim = m_numParityPairs;
96 std::cout <<
"m_parity = " << m_parity <<
", dim = " << dim
97 <<
", m_numParityPairs = " << m_numParityPairs << std::endl;
100 this->basis().resize(this->totalSpace().dim(), dim, this->totalSpace().dim());
102 int nonZeroId = 0, classIdx = 0;
104 calculated = Eigen::ArrayX<bool>::Constant(this->totalSpace().transEqDim(),
false);
105 for(
int eqClass = 0; eqClass != this->totalSpace().transEqDim(); ++eqClass) {
106 if(calculated(eqClass))
continue;
107 calculated(eqClass) =
true;
108 auto repState = this->totalSpace().transEqClassRep(eqClass);
109 auto revState = this->totalSpace().reverse(repState);
110 auto reversed = this->totalSpace().stateToTransEqClass(revState);
111 calculated(reversed) =
true;
112 if(eqClass != reversed)
continue;
114 this->basis().outerIndexPtr()[classIdx] = nonZeroId;
115 for(
int trans = 0; trans != this->totalSpace().transPeriod(eqClass); ++trans) {
116 this->basis().innerIndexPtr()[nonZeroId]
117 = this->totalSpace().transEqClassRep(eqClass, trans);
118 this->basis().valuePtr()[nonZeroId]
119 = 1.0 / RealType(sqrt(RealType(this->totalSpace().transPeriod(eqClass))));
126 calculated = Eigen::ArrayX<bool>::Constant(this->totalSpace().transEqDim(),
false);
127 for(
int eqClass = 0; eqClass != this->totalSpace().transEqDim(); ++eqClass) {
128 if(calculated(eqClass))
continue;
129 calculated(eqClass) =
true;
130 auto repState = this->totalSpace().transEqClassRep(eqClass);
131 auto revState = this->totalSpace().reverse(repState);
132 auto reversed = this->totalSpace().stateToTransEqClass(revState);
133 calculated(reversed) =
true;
134 if(eqClass == reversed)
continue;
136 this->basis().outerIndexPtr()[classIdx] = nonZeroId;
137 for(
int trans = 0; trans != this->totalSpace().transPeriod(eqClass); ++trans) {
138 this->basis().innerIndexPtr()[nonZeroId]
139 = this->totalSpace().transEqClassRep(eqClass, trans);
140 this->basis().valuePtr()[nonZeroId]
141 = 1.0 / RealType(sqrt(RealType(2 * this->totalSpace().transPeriod(eqClass))));
144 for(
int trans = 0; trans != this->totalSpace().transPeriod(eqClass); ++trans) {
145 this->basis().innerIndexPtr()[nonZeroId]
146 = this->totalSpace().transEqClassRep(reversed, trans);
147 this->basis().valuePtr()[nonZeroId]
148 = m_parity / RealType(sqrt(RealType(2 * this->totalSpace().transPeriod(reversed))));
153 assert(dim == classIdx &&
"dim == classIdx");
154 this->basis().outerIndexPtr()[dim] = nonZeroId;
155 this->basis().setNonZeros(this->basis().outerIndexPtr()[dim]);
156 for(
int eqClass = 0; eqClass != dim; ++eqClass) {
158 thrust::seq, this->basis().innerIndexPtr() + this->basis().outerIndexPtr()[eqClass],
159 this->basis().innerIndexPtr() + this->basis().outerIndexPtr()[eqClass + 1],
160 this->basis().valuePtr() + this->basis().outerIndexPtr()[eqClass]);
163 this->basis().resize(this->totalSpace().dim(), dim);
164 this->basis().reserve(Eigen::VectorXi::Constant(dim, 2 * L));
168 calculated = Eigen::ArrayX<bool>::Constant(this->totalSpace().transEqDim(),
false);
169 for(
int eqClass = 0; eqClass != this->totalSpace().transEqDim(); ++eqClass) {
170 if(calculated(eqClass))
continue;
171 calculated(eqClass) =
true;
172 auto repState = this->totalSpace().transEqClassRep(eqClass);
173 auto revState = this->totalSpace().reverse(repState);
174 auto reversed = this->totalSpace().stateToTransEqClass(revState);
175 calculated(reversed) =
true;
176 if(eqClass != reversed)
continue;
178 for(
int trans = 0; trans != this->totalSpace().transPeriod(eqClass); ++trans) {
179 auto state = this->totalSpace().transEqClassRep(eqClass, trans);
180 this->basis().insert(state, classIdx)
181 = 1.0 / RealType(sqrt(RealType(this->totalSpace().transPeriod(eqClass))));
187 calculated = Eigen::ArrayX<bool>::Constant(this->totalSpace().transEqDim(),
false);
188 for(
int eqClass = 0; eqClass != this->totalSpace().transEqDim(); ++eqClass) {
189 if(calculated(eqClass))
continue;
190 calculated(eqClass) =
true;
191 auto repState = this->totalSpace().transEqClassRep(eqClass);
192 auto revState = this->totalSpace().reverse(repState);
193 auto reversed = this->totalSpace().stateToTransEqClass(revState);
194 calculated(reversed) =
true;
195 if(eqClass == reversed)
continue;
197 for(
int trans = 0; trans != this->totalSpace().transPeriod(eqClass); ++trans) {
198 auto state = this->totalSpace().transEqClassRep(eqClass, trans);
199 this->basis().insert(state, classIdx)
200 = 1.0 / RealType(sqrt(RealType(2 * this->totalSpace().transPeriod(eqClass))));
202 for(
int trans = 0; trans != this->totalSpace().transPeriod(reversed); ++trans) {
203 auto state = this->totalSpace().transEqClassRep(reversed, trans);
204 this->basis().insert(state, classIdx)
205 = m_parity / RealType(sqrt(RealType(2 * this->totalSpace().transPeriod(reversed))));
210 this->basis().makeCompressed();
215 #include "ParityTransSector.cuh"
Definition mytypes.hpp:147
__host__ __device__ int dim() const
Definition HilbertSpace.hpp:34
Definition HilbertSpace.hpp:423
Translation invariant sector of a many-body Hilbert space.
Definition ParityTransSector.hpp:19
int m_parity
Definition ParityTransSector.hpp:21
__host__ __device__ int period(int j) const
Definition ParityTransSector.hpp:55
int m_numParityPairs
Definition ParityTransSector.hpp:22
__host__ __device__ constexpr int parity() const
Definition ParityTransSector.hpp:47
__host__ __device__ constexpr int momentum() const
Definition ParityTransSector.hpp:45
__host__ __device__ int rep(int j, int trans=0) const
Definition ParityTransSector.hpp:49
__host__ __device__ ParityTransSector(int parity=0, int systemSize=0, int dimLoc=0)
Default constructor.
Definition ParityTransSector.hpp:40
__host__ __device__ ParityTransSector(int parity, ManyBodySpinSpace const &mbHSpace)
Construct a ParityTransSector object from a ManyBodySpinSpace object.
Definition ParityTransSector.hpp:63
__host__ __device__ int * innerIndexPtr() const
Definition MatrixUtils.cuh:421
__host__ __device__ int * outerIndexPtr() const
Definition MatrixUtils.cuh:420
Definition HilbertSpace.hpp:568
__host__ __device__ Matrix_t & basis()
Definition HilbertSpace.hpp:668