StatMech
Loading...
Searching...
No Matches
Ensemble.hpp
Go to the documentation of this file.
1#pragma once
2#ifdef GPU
3 #include "Ensemble.cuh"
4#else
5 #include "Headers/mytypes.hpp"
9 #include <Eigen/Dense>
10 #include <Eigen/Sparse>
11 #include <unsupported/Eigen/KroneckerProduct>
12
13int g_dimLoc = 2;
14int g_parity = 1;
15
18
19class SubSpaceManager {
20 public:
23
24 private:
25 std::vector<SubHilbertSpace> m_sectors;
26 std::vector<bool> m_isConstructed;
27 SubSpaceManager() = default;
28
29 public:
35 static SubSpaceManager instance;
36 return instance;
37 }
38
40 SubSpaceManager& instance = this->get_instance();
41 if(instance.m_sectors.size() <= L) {
42 instance.m_sectors.resize(L + 1);
43 instance.m_isConstructed.resize(L + 1, false);
44
45 if(!instance.m_isConstructed[L]) {
46 instance.m_sectors[L]
48 instance.m_isConstructed[L] = true;
49 }
50 }
51 return instance.m_sectors[L];
52 }
53};
54
55namespace Ensemble::internal {
56 template<class MatrixType>
57 class ScalableOperator {
58 private:
59 using Scalar = typename MatrixType::Scalar;
60 MatrixType m_locOp;
61 size_t m_dimLoc;
62 size_t m_Locality;
63
64 public:
65 ScalableOperator(MatrixType const& locOp, size_t dimLoc)
66 : m_locOp{locOp}, m_dimLoc{dimLoc} {
67 if(m_locOp.rows() != m_locOp.cols()) {
68 std::cerr << "Error at [" << __FILE__ << ":" << __LINE__ << "]\n\t"
69 << __PRETTY_FUNCTION__ << "\nMessage:\t locOp.rows()("
70 << m_locOp.rows() << ") != locOp.cols()(" << locOp.cols() << "): "
71 << "local operator must be a square matrix" << std::endl;
72 std::exit(EXIT_FAILURE);
73 }
74 size_t dim = m_locOp.rows();
75 for(m_Locality = 0; dim != 1; ++m_Locality) {
76 if(dim % dimLoc != 0) {
77 std::cerr << "Error at [" << __FILE__ << ":" << __LINE__ << "]\n\t"
78 << __PRETTY_FUNCTION__ << "\nMessage:\t locOp.rows()("
79 << m_locOp.rows() << ") must be a power of dimLoc(" << dimLoc
80 << ")" << std::endl;
81 std::exit(EXIT_FAILURE);
82 }
83 dim /= dimLoc;
84 }
85 }
86
87 MatrixType construct_globalOp(size_t L) {
88 if(L < m_Locality) {
89 std::cerr << "Error at [" << __FILE__ << ":" << __LINE__ << "]\n\t"
90 << __PRETTY_FUNCTION__ << "\n\t L(" << L
91 << ") must not be smaller than m_Locality(" << m_Locality << ")."
92 << std::endl;
93 std::exit(EXIT_FAILURE);
94 }
95
96 size_t dimCompl = 1;
97 for(int j = 0; j < L - m_Locality; ++j) { dimCompl *= g_dimLoc; }
98
99 auto Identity = MatrixType::Identity(dimCompl, dimCompl);
101 auto& subSpaceBase = subSpaces[L].basis();
102 MatrixType res = subSpaceBase.adjoint() * Eigen::kroneckerProduct(Identity, m_locOp)
103 * subSpaceBase;
104 return res;
105 };
106 };
107} // namespace Ensemble::internal
108
110 public:
111 using MatrixType = Eigen::MatrixX<Scalar>;
112 using EigenSolver = Eigen::SelfAdjointEigenSolver<MatrixType>;
115
116 static std::string dataname(size_t rep) {
117 std::stringstream buff("");
118 buff << std::setprecision(3);
119 buff << "Hamiltonian_B" << class_B << "_h" << class_h;
120 return buff.str();
121 };
122 static std::string usage(size_t nargs) {
123 std::string usage = "HamiltonianEnsemble Usage: ";
124 usage += std::to_string(nargs + 0) + ".(Transverse field) ";
125 usage += std::to_string(nargs + 1) + ".(Longitudinal field) ";
126 return usage;
127 };
128 static constexpr size_t nargs(void) { return 2; };
129
130 static StateSpace& stateSpace(size_t L) {
132 return subSpaces[L];
133 }
134
135 private:
136 static double class_B; // Transverse field
137 static double class_h; // Longitudinal field
139
140 HamiltonianEnsemble(char** CL_argv) {
141 class_B = std::atof(CL_argv[0]);
142 class_h = std::atof(CL_argv[1]);
143 size_t dim = g_dimLoc * g_dimLoc;
144 MatrixType sX = MatrixType::Zero(g_dimLoc, g_dimLoc);
145 MatrixType sY = MatrixType::Zero(g_dimLoc, g_dimLoc);
146 MatrixType sZ = MatrixType::Zero(g_dimLoc, g_dimLoc);
147
148 double s = (g_dimLoc - 1) / 2.0;
149 for(auto j = 0; j != g_dimLoc - 1; ++j) {
150 double m = s - j;
151 sZ(j, j) = m;
152 sX(j, j + 1) = std::sqrt((s - m + 1) * (s + m));
153 sY(j + 1, j) = std::sqrt((s + m) * (s - m + 1));
154 }
155 sZ(g_dimLoc - 1, g_dimLoc - 1) = -s;
156 sX = (sX + sY).eval() / 2.0;
157 sY = Scalar(0, 1) * (sY - sX).eval();
158
159 auto Identity = MatrixType::Identity(g_dimLoc, g_dimLoc);
160
161 m_locMat = Eigen::kroneckerProduct(sZ, sZ);
163 += class_B
164 * (Eigen::kroneckerProduct(sX, Identity) + Eigen::kroneckerProduct(Identity, sX))
165 / 2.0;
167 += class_h
168 * (Eigen::kroneckerProduct(sZ, Identity) + Eigen::kroneckerProduct(Identity, sZ))
169 / 2.0;
170 std::cout << m_locMat << std::endl;
171 }
172
173 public:
178 static HamiltonianEnsemble& get_instance(char** CL_argv) {
179 static HamiltonianEnsemble instance(CL_argv);
180 return instance;
181 }
182
183 void discard(size_t n) {}
184
186};
189
190class ObservableEnsemble {
191 public:
192 using MatrixType = Eigen::MatrixX<Scalar>;
193 using EigenSolver = Eigen::SelfAdjointEigenSolver<MatrixType>;
196
197 static size_t class_M;
198 static std::string dataname(size_t rep) {
199 return "m" + std::to_string(class_M) + "_Observable" + "_No" + std::to_string(rep);
200 };
201 static std::string usage(size_t nargs) {
202 std::string usage = "ObservableEnsemble Usage: ";
203 usage += std::to_string(nargs + 0) + ".(m) ";
204 return usage;
205 };
206 static constexpr size_t nargs(void) { return 1; };
207
208 private:
209 size_t m_L;
210 size_t m_M;
214
215 public:
216 ObservableEnsemble(size_t L, size_t m) : m_L(L), m_M(m) {
217 assert(m_L >= 1);
218 class_M = m_M;
222 }
223
224 ObservableEnsemble(size_t L, char** CL_argv)
225 : ObservableEnsemble(L, std::atoi(CL_argv[0])) {}
226
232
234
236
237 void reset() { m_mbGRME.reset(); }
238
239 void discard(size_t n) { m_mbGRME.discard(n); }
240
243 auto& subSpaceBase = subSpaces[m_L].basis();
244 auto op = m_mbGRME();
245 // std::cout << "observable sample:\n" << op << std::endl;
246 MatrixType res = subSpaceBase.adjoint() * op * subSpaceBase;
247
248 // std::cout << "observable res:\n" << res << std::endl;
249 return res;
250 }
251};
253#endif
Real_t RealScalar
Definition Ensemble.cuh:14
int g_dimLoc
Definition Ensemble.cuh:11
int g_dimLoc
Definition Ensemble.hpp:12
Definition mytypes.hpp:147
Definition Ensemble.cuh:55
ScalableOperator(MatrixType const &locOp, size_t dimLoc)
Definition Ensemble.hpp:65
typename MatrixType::Scalar Scalar
Definition Ensemble.cuh:57
size_t m_Locality
Definition Ensemble.hpp:62
size_t m_dimLoc
Definition Ensemble.hpp:61
MatrixType construct_globalOp(size_t L)
Definition Ensemble.hpp:87
MatrixType m_locOp
Definition Ensemble.template.hpp:39
Definition RandomMatrix.hpp:9
Definition Ensemble.cuh:84
HamiltonianEnsemble(const HamiltonianEnsemble &)=delete
typename SubSpaceManager::SubHilbertSpace StateSpace
Definition Ensemble.cuh:89
Ensemble::internal::ScalableOperator< MatrixType > ScalableOperator
Definition Ensemble.cuh:90
ScalableOperator sample()
Definition Ensemble.hpp:185
HamiltonianEnsemble(char **CL_argv)
Definition Ensemble.hpp:140
HamiltonianEnsemble & operator=(HamiltonianEnsemble &&)=delete
HamiltonianEnsemble & operator=(const HamiltonianEnsemble &)=delete
static HamiltonianEnsemble & get_instance(char **CL_argv)
Definition Ensemble.hpp:178
static double class_h
Definition Ensemble.hpp:137
static constexpr size_t nargs(void)
Definition Ensemble.cuh:97
HamiltonianEnsemble(HamiltonianEnsemble &&)=delete
static std::string dataname(size_t rep)
Definition Ensemble.hpp:116
static StateSpace & stateSpace(size_t L)
Definition Ensemble.hpp:130
MatrixType m_locMat
Definition Ensemble.hpp:138
void discard(size_t n)
Definition Ensemble.hpp:183
static std::string usage(size_t nargs)
Definition Ensemble.hpp:122
static double class_B
Definition Ensemble.hpp:136
Definition HilbertSpace.hpp:423
Definition MatrixUtils.hpp:20
Definition Ensemble.cuh:131
size_t m_M
Definition Ensemble.cuh:151
static std::string dataname(size_t rep)
Definition Ensemble.hpp:198
StateSpace & stateSpace()
Definition Ensemble.hpp:233
ObservableEnsemble & operator=(const ObservableEnsemble &)=delete
static size_t class_M
Definition Ensemble.cuh:138
OperatorSpace m_opSpace
Definition Ensemble.cuh:153
static constexpr size_t nargs(void)
Definition Ensemble.cuh:147
size_t m_L
Definition Ensemble.cuh:150
GaussianRandomMatrixGenerator_GPU< OperatorSpace > m_mbGRME
Definition Ensemble.cuh:154
ManyBodySpinSpace StateSpace
Definition Ensemble.cuh:135
ObservableEnsemble(const ObservableEnsemble &)=delete
ObservableEnsemble(ObservableEnsemble &&)=default
static std::string usage(size_t nargs)
Definition Ensemble.hpp:201
StateSpace m_stateSpace
Definition Ensemble.cuh:152
ObservableEnsemble & operator=(ObservableEnsemble &&)=default
OperatorSpace & operatorSpace()
Definition Ensemble.hpp:235
ObservableEnsemble(size_t L, size_t m)
Definition Ensemble.hpp:216
void reset()
Definition Ensemble.hpp:237
ObservableEnsemble()=default
ObservableEnsemble(size_t L, char **CL_argv)
Definition Ensemble.hpp:224
MatrixType sample()
Definition Ensemble.hpp:241
void discard(size_t n)
Definition Ensemble.hpp:239
Definition OperatorSpace.hpp:132
Translation invariant sector of a many-body Hilbert space.
Definition ParityTransSector.hpp:19
Definition Ensemble.cuh:112
Definition Ensemble.cuh:17
SubSpaceManager(SubSpaceManager &&)=delete
std::vector< SubHilbertSpace > m_sectors
Definition Ensemble.cuh:23
std::vector< bool > m_isConstructed
Definition Ensemble.cuh:24
SubSpaceManager(const SubSpaceManager &)=delete
SubHilbertSpace & operator[](size_t L)
Definition Ensemble.hpp:39
SubSpaceManager()=default
SubSpaceManager & operator=(const SubSpaceManager &)=delete
TransSector< RealScalar > SubHilbertSpace
Definition Ensemble.cuh:19
static SubSpaceManager & get_instance()
Definition Ensemble.hpp:34
typename SubHilbertSpace::TotalSpace TotalSpace
Definition Ensemble.cuh:20
SubSpaceManager & operator=(SubSpaceManager &&)=delete
Translation invariant sector of a many-body Hilbert space.
Definition TransSector.hpp:19
ManyBodySpinSpace TotalSpace
Definition TransSector.hpp:24
double Real_t
Definition mytypes.hpp:37
Definition Ensemble.cuh:53
int g_parity
Definition Ensemble.hpp:14
int g_dimLoc
Definition Ensemble.hpp:13
Complex_t< RealScalar > Scalar
Definition Ensemble.hpp:17
std::stringstream buff("")