StatMech
Loading...
Searching...
No Matches
MaxETHMeasure_FewBodyObservables.cpp File Reference

Classes

class  IOManager
 

Functions

int main (int argc, char **argv)
 

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)
62 {
63 constexpr size_t nargs = 7;
64 constexpr size_t nopts = 2;
65 size_t arg_count = nargs;
66 if(argc < nargs + HamiltonianEnsemble::nargs()) {
67 std::cerr << "Usage: 0.(This) 1.(LMax) 2.(LMin) 3.(hRepMin) 4.(hRepMax) 5.(shellWidth) "
68 "6.(OutDir)\n";
69 std::cerr << " " << HamiltonianEnsemble::usage(arg_count) << "\n";
70 arg_count += HamiltonianEnsemble::nargs();
71 // std::cerr << " " << ObservableEnsemble::usage(arg_count) << "\n";
72 std::cerr << " " << "Opt1.(MMax) Opt2.(MMin)" << "\n";
73 std::cerr << "argc = " << argc << std::endl;
74 std::exit(EXIT_FAILURE);
75 }
76 size_t const LMax = std::atoi(argv[1]);
77 size_t const LMin = std::atoi(argv[2]);
78 size_t const hRepMin = std::atoi(argv[3]);
79 size_t const hRepMax = std::atoi(argv[4]);
80 double const shellWidth = std::atof(argv[5]);
81 IOManager data_writer(argv[6]);
82 std::cout << "outDir = " << data_writer.outDir() << std::endl;
83
84 arg_count += HamiltonianEnsemble::nargs();
85 std::cout << "arg_count = " << arg_count << ", argc = " << argc << std::endl;
86 size_t const MMax = (arg_count+0 < argc ? std::atoi(argv[arg_count+0]) : LMax);
87 size_t const MMin = (arg_count+1 < argc ? std::atoi(argv[arg_count+1]) : 1);
88 std::cout << "MMax=" << MMax << ", MMin=" << MMin << std::endl;
89
90#ifdef MAGMA
91 CHECK(magma_init());
92#endif
93
94 arg_count = nargs;
95 auto& hEnsemble = HamiltonianEnsemble::get_instance(argv + arg_count);
96 arg_count += HamiltonianEnsemble::nargs();
97 std::vector<std::vector<ObservableEnsemble>> obsEnsembles(LMax + 1);
98 for(size_t L = LMin; L <= LMax; ++L) {
99 obsEnsembles[L].resize(L + 1);
100 for(size_t m = MMin; m <= std::min(MMax,L); ++m) { obsEnsembles[L][m] = ObservableEnsemble(L, m); }
101 }
102
104
105 hEnsemble.discard(hRepMin);
106
107 double start, t_int, end, temp_t;
108 double T_pre = 0, T_diag = 0, T_meas = 0, T_IO = 0;
109 start = getETtime();
110 end = start;
111 for(size_t hRep = hRepMin; hRep <= hRepMax; ++hRep) {
112 // Sample a Hamiltonian
113 auto loc_hamiltonian = hEnsemble.sample();
114
115 for(size_t L = LMin; L <= LMax; ++L) {
116 std::cout << "hRep = " << hRep << ", L = " << L << std::endl;
117 temp_t = getETtime();
118 auto hamiltonian = loc_hamiltonian.construct_globalOp(L);
119 T_pre += getETtime() - temp_t;
120
121 // Diagonalize a Hamiltonian to get eigenvalues and eigenvectors
122 temp_t = getETtime();
123 HamiltonianEnsemble::EigenSolver eigSolver(std::move(hamiltonian));
124 T_diag += getETtime() - temp_t;
125
126 auto eigRange
127 = *std::max_element(eigSolver.eigenvalues().begin(), eigSolver.eigenvalues().end())
128 - *std::min_element(eigSolver.eigenvalues().begin(),
129 eigSolver.eigenvalues().end());
130 MicroCanonicalAverage const MCAverage(eigSolver.eigenvalues().template cast<double>(),
131 eigRange * shellWidth);
132
133 Eigen::MatrixXd ETHmeasure
134 = Eigen::MatrixXd::Zero(eigSolver.eigenvectors().cols(), L + 1);
135 Eigen::VectorXd colVec;
136
137 temp_t = getETtime();
138 for(size_t m = MMin; m <= std::min(MMax,L); ++m) {
139 auto& opEnsemble = obsEnsembles[L][m];
140 auto& stateSpace = HamiltonianEnsemble::stateSpace(L);
141 auto& opSpace = opEnsemble.operatorSpace();
142 std::cout << "m=" << m << ", opSpace.dim() = " << opSpace.dim() << std::endl;
143 calculateETHmeasure(colVec, eigSolver.eigenvectors(), stateSpace, opSpace,
144 MCAverage);
145 ETHmeasure.col(m) += colVec;
146 }
147 T_meas += getETtime() - temp_t;
148
149 double maxDiff;
150 { // Verifying the results
151 auto theorySum = Eigen::VectorXd::Ones(MCAverage.dim())
152 - MCAverage.dimShell().cast<double>().cwiseInverse();
153 maxDiff = (ETHmeasure.rowwise().sum() - theorySum).maxCoeff();
154 if(maxDiff > 1.0e-4) {
155 std::cout << "ETHmeasure.rowwise().sum():\n"
156 << ETHmeasure.rowwise().sum() << "\n"
157 << std::endl;
158 std::cout << "theorySum:\n" << theorySum << "\n" << std::endl;
159 std::cout << "ETHmeasure:\n" << ETHmeasure << "\n" << std::endl;
160 std::cerr << "Error : maxDiff = " << maxDiff << " is too large." << std::endl;
161 continue;
162 // std::exit(EXIT_SUCCESS);
163 }
164 }
165
166 temp_t = getETtime();
167 data_writer.save_ResultsToFile(eigSolver.eigenvalues(), ETHmeasure, hRep, L,
168 MCAverage.dimShell(), maxDiff);
169 T_IO += getETtime() - temp_t;
170 }
171
172 if(hRep % 10 == 9 || hRep == hRepMax) {
173 t_int = end;
174 end = getETtime();
175 std::cerr << "(total=" << std::setw(6) << hRep + 1
176 << "): timeINT=" << std::setprecision(6) << std::setw(8) << (end - t_int)
177 << ", timeTOT=" << std::setprecision(6) << std::setw(8) << (end - start)
178 << ", T_construct=" << std::setprecision(6) << std::setw(10) << T_pre << "("
179 << std::setprecision(1) << 100 * T_pre / (end - start) << "%)"
180 << ", T_diag=" << std::setprecision(6) << std::setw(8) << T_diag << "("
181 << std::setprecision(1) << 100 * T_diag / (end - start) << "%)"
182 << ", T_meas=" << std::setprecision(6) << std::setw(8) << T_meas << "("
183 << std::setprecision(1) << 100 * T_meas / (end - start) << "%)"
184 << ", T_IO=" << std::setprecision(6) << std::setw(8) << T_IO << "("
185 << std::setprecision(1) << 100 * T_IO / (end - start) << "%)" << std::endl;
186 }
187 }
188
189#ifdef MAGMA
190 CHECK(magma_finalize());
191#endif
192 return EXIT_SUCCESS;
193}
double getETtime()
Definition EnergySpectrum.c:14
Definition ETHmeasure.hpp:133
static HamiltonianEnsemble & get_instance(char **CL_argv)
Definition Ensemble.cuh:115
static constexpr size_t nargs(void)
Definition Ensemble.cuh:97
static StateSpace & stateSpace(size_t L)
Definition Ensemble.cuh:99
static std::string usage(size_t nargs)
Definition Ensemble.cuh:93
Definition EigenExpValue.cpp:48
Definition MatrixUtils.hpp:20
Calculate the microcanonical averages with respect to a given sorted vector 'eigVal'.
Definition MicroCanonicalAverage.hpp:25
Definition Ensemble.cuh:131