5#include "Eigen/SparseCore"
14template<
class ManyBodySpace,
typename RealType = Real_t>
21 assert((this->
dim() - m_NumParityEigens) % 2 == 0);
22 return (this->
dim() - m_NumParityEigens) / 2;
33 template<
typename std::enable_if_t< std::is_convertible_v<
37 debug_constructor_printf(1);
39 if(this->
totalSpace().sysSize() == 0) {
return; }
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;
46 int reversed = mbHSpace.reverse(state);
50 calculated[reversed] =
true;
54 debug_print(
"mbHSpace.dim() = " << mbHSpace.dim() <<
", dim = " <<
dim
58 this->
basis().reserve(Eigen::VectorXi::Constant(
dim, 2));
60 calculated = Eigen::ArrayX<bool>::Constant(mbHSpace.dim(),
false);
63 for(
int state = 0; state != mbHSpace.dim(); ++state) {
64 if(calculated[state])
continue;
65 calculated[state] =
true;
67 int reversed = mbHSpace.reverse(state);
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;
77 for(
int j = 0; j != parityEigen.size(); ++j)
78 this->
basis().insert(parityEigen[j],
dim++) = 1;
81 debug_print(
"mbHSpace.dim() = " << mbHSpace.dim() <<
", dim = " <<
dim
82 <<
", this->dim() = " << this->dim());
83 this->
basis().makeCompressed();
84 assert(
dim == this->
dim());
93 template<
typename... Args>
96 debug_constructor_printf((Default));
101 __host__ __device__
int rep(
int j,
int trans = 0)
const {
102 assert(j < this->
dim());
106 assert(innerId < this->
basis().nonZeros());
110 __host__ __device__
int period(
int j)
const {
111 assert(j < this->
dim() &&
"j < this->dim()");
__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.")