StatMech
Loading...
Searching...
No Matches
TransSector.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#ifdef GPU
7 #include <thrust/sort.h>
8 #include <thrust/execution_policy.h>
9#endif
10
18template<typename RealType = Real_t>
19class TransSector : public SubSpace< ManyBodySpinSpace, Complex_t<RealType> > {
20 private:
22
23 public:
31 __host__ __device__ TransSector(int k, ManyBodySpinSpace const& mbHSpace);
39 __host__ __device__ TransSector(int k = 0, int systemSize = 0, int dimLoc = 0)
40 : TransSector(k, ManyBodySpinSpace(systemSize, dimLoc)) {
41 debug_constructor_printf((Default));
42 }
43
44 __host__ __device__ int momentum() const { return m_momentum; };
45
46 __host__ __device__ int rep(int j, int trans = 0) const {
47 int innerId = this->basis().outerIndexPtr()[j] + (trans % this->period(j));
48 assert(innerId < this->basis().nonZeros() && "innerId < this->basis().nonZeros()");
49 return this->basis().innerIndexPtr()[innerId];
50 };
51
52 __host__ __device__ int period(int j) const {
53 assert(j < this->dim() && "j < this->dim()");
54 return this->basis().outerIndexPtr()[j + 1] - this->basis().outerIndexPtr()[j];
55 };
56};
57
58template<typename RealType>
59__host__ __device__ TransSector<RealType>::TransSector(int const k,
60 ManyBodySpinSpace const& mbHSpace)
61 : SubSpace< ManyBodySpinSpace, Complex_t<RealType> >{mbHSpace}, m_momentum(k) {
62 debug_constructor_printf(1);
63 constexpr Complex_t<RealType> I = Complex_t<RealType>(0, 1);
64 if(this->totalSpace().sysSize() == 0) { return; }
65
66 this->totalSpace().computeTransEqClass();
67 debug_printf("%s:\n\t this->totalSpace().dim()=%d, this->totalSpace().transEqDim()=%d, "
68 "this->totalSpace().transPeriod().sum()=%d\n",
69 __PRETTY_FUNCTION__, this->totalSpace().dim(), this->totalSpace().transEqDim(),
70 this->totalSpace().transPeriod().sum());
71 assert(this->totalSpace().transPeriod().sum() == this->totalSpace().dim());
72
73 int L = this->totalSpace().sysSize();
74 int dim = 0;
75 for(int eqClass = 0; eqClass < this->totalSpace().transEqDim(); ++eqClass) {
76 if((this->totalSpace().transPeriod(eqClass) * k) % L != 0) continue;
77 dim += 1;
78 }
79
80#ifdef __CUDA_ARCH__
81 this->basis().resize(this->totalSpace().dim(), dim, this->totalSpace().dim());
82#else
83 this->basis().resize(this->totalSpace().dim(), dim);
84 this->basis().reserve(Eigen::VectorXi::Constant(dim, L));
85#endif // #ifdef __CUDA_ARCH__
86
87 int numCompatible = 0, nonZeroId = 0;
88 for(int eqClass = 0; eqClass != this->totalSpace().transEqDim(); ++eqClass) {
89 if((this->totalSpace().transPeriod(eqClass) * k) % L != 0) continue;
90#ifdef __CUDA_ARCH__
91 assert(nonZeroId < this->basis().reserved());
92 this->basis().outerIndexPtr()[numCompatible] = nonZeroId;
93 for(int trans = 0; trans != this->totalSpace().transPeriod(eqClass); ++trans) {
94 this->basis().innerIndexPtr()[nonZeroId]
95 = this->totalSpace().transEqClassRep(eqClass, trans);
96 this->basis().valuePtr()[nonZeroId]
97 = exp(-I * RealType(M_PI * 2 * k * trans / RealType(L)))
98 / RealType(sqrt(RealType(this->totalSpace().transPeriod(eqClass))));
99 ++nonZeroId;
100 }
101#else
102 for(int trans = 0; trans != this->totalSpace().transPeriod(eqClass); ++trans) {
103 this->basis().insert(this->totalSpace().transEqClassRep(eqClass, trans), numCompatible)
104 = exp(-I * RealType(M_PI * 2 * k * trans / RealType(L)))
105 / RealType(sqrt(RealType(this->totalSpace().transPeriod(eqClass))));
106 }
107#endif // #ifdef __CUDA_ARCH__
108 numCompatible += 1;
109 assert(numCompatible <= dim);
110 }
111 assert(dim == numCompatible && "dim == numCompatible");
112 this->basis().outerIndexPtr()[dim] = nonZeroId;
113
114#ifdef __CUDA_ARCH__
115 this->basis().setNonZeros(this->basis().outerIndexPtr()[dim]);
116 for(int eqClass = 0; eqClass != dim; ++eqClass) {
117 thrust::sort_by_key(
118 thrust::seq, this->basis().innerIndexPtr() + this->basis().outerIndexPtr()[eqClass],
119 this->basis().innerIndexPtr() + this->basis().outerIndexPtr()[eqClass + 1],
120 this->basis().valuePtr() + this->basis().outerIndexPtr()[eqClass]);
121 }
122#else // #ifdef __CUDA_ARCH__
123 this->basis().makeCompressed();
124#endif // #ifdef __CUDA_ARCH__
125}
126
127#ifdef GPU
128 #include "TransSector.cuh"
129#endif
Definition mytypes.hpp:147
__host__ __device__ int dim() const
Definition HilbertSpace.hpp:34
Definition HilbertSpace.hpp:423
__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
Translation invariant sector of a many-body Hilbert space.
Definition TransSector.hpp:19
__host__ __device__ TransSector(int k=0, int systemSize=0, int dimLoc=0)
Default constructor.
Definition TransSector.hpp:39
__host__ __device__ int period(int j) const
Definition TransSector.hpp:52
__host__ __device__ TransSector(int k, ManyBodySpinSpace const &mbHSpace)
Construct a TransSector object from a ManyBodySpinSpace object.
int m_momentum
Definition TransSector.hpp:21
__host__ __device__ int momentum() const
Definition TransSector.hpp:44
__host__ __device__ int rep(int j, int trans=0) const
Definition TransSector.hpp:46