62 {
63 constexpr size_t nargs = 7;
64 constexpr size_t nopts = 2;
65 size_t arg_count = nargs;
67 std::cerr << "Usage: 0.(This) 1.(LMax) 2.(LMin) 3.(hRepMin) 4.(hRepMax) 5.(shellWidth) "
68 "6.(OutDir)\n";
71
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]);
82 std::cout << "outDir = " << data_writer.outDir() << std::endl;
83
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;
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;
110 end = start;
111 for(size_t hRep = hRepMin; hRep <= hRepMax; ++hRep) {
112
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;
118 auto hamiltonian = loc_hamiltonian.construct_globalOp(L);
120
121
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());
131 eigRange * shellWidth);
132
133 Eigen::MatrixXd ETHmeasure
134 = Eigen::MatrixXd::Zero(eigSolver.eigenvectors().cols(), L + 1);
135 Eigen::VectorXd colVec;
136
138 for(size_t m = MMin; m <= std::min(MMax,L); ++m) {
139 auto& opEnsemble = obsEnsembles[L][m];
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 }
148
149 double maxDiff;
150 {
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
163 }
164 }
165
167 data_writer.save_ResultsToFile(eigSolver.eigenvalues(), ETHmeasure, hRep, L,
168 MCAverage.dimShell(), maxDiff);
170 }
171
172 if(hRep % 10 == 9 || hRep == hRepMax) {
173 t_int = end;
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