163 {
166
169 double gE, energyRange, OpRange, OpMin, sum;
170 constexpr double precision = 1.0E-7;
171
172 if(!Initialize(argc, argv, Nargs_common)) {
173 std::cerr << "Error: Initialization failed." << std::endl;
174 std::exit(EX_USAGE);
175 }
177
178
179 debug_print(
"# Checking for the directory structure.");
180 std::ofstream OutFs;
181
182
183
184
185
186#ifdef GPU
187 magma_init();
188 magma_queue_t queue = NULL;
189 magma_int_t dev = 0;
190 magma_getdevice(&dev);
191 magma_queue_create(dev, &queue);
192#else
194#endif
195
196
197 debug_print(
"# Calculating translation-invariant sectors.");
199
200
201
203 double time;
204 constexpr double Tmax = 100000;
208 double MCAverage, shellWidth;
209
210 std::vector<Integer_t> Index(dim_max);
211 std::vector<Integer_t> Degeneracy(dim_max);
212 std::vector<double> eigenEnergy(dim_max);
213 std::vector<double> EXPvalue(dim_max);
214 std::vector<double> energyExpValue(dim_max);
215 std::vector<double> energyStddev(dim_max);
216 std::vector<Complex_t> ComplexVector_temp(dim_max);
219 matrix<Complex_t> Dynamics(dim_max, Nstep + 1);
220#ifndef GPU
221 matrix<Complex_t> h_tot(dim_max, dim_max);
222 matrix<Complex_t> loc_tot(dim_max, dim_max);
223 matrix<Complex_t> State(dim_max, dim_max);
224 #define dh h
225 #define dloc loc
226 #define dh_tot h_tot
227 #define dloc_tot loc_tot
228 #define dState State
229#endif
230
231
232#ifdef GPU
233
236 Integer_t const LDT = magma_roundup(dim_max, GPU_UNIT);
237 std::vector<Complex_t> tempVector(dim_max);
240 matrix_gpu<Complex_t> dh_tot(LDT, dim_max);
241 matrix_gpu<Complex_t> dloc_tot(LDT, dim_max);
242 matrix_gpu<Complex_t> dState(LDT, dim_max);
243 matrix_gpu<Integer_t> dIndex(dim_max, 1);
244 matrix_gpu<Integer_t> dDegeneracy(dim_max + 1, 1);
245 matrix_gpu<double> dEigenEnergy(dim_max, 1);
246 matrix_gpu<Complex_t> dDynamics(LDT, Nstep + 1);
247 matrix_gpu<Complex_t> dComplexMatrix_temp1(LDT, dim_max);
248 matrix_gpu<Complex_t> dComplexMatrix_temp2(LDT, dim_max);
249
250
251
253
254#endif
255
256 double start, t_int, end, temp_t;
257 double T_diag = 0, T_post = 0, T_pre = 0;
258 init_genrand(SEED);
261 generateLocal_h(h,
dloc_h, -1);
262 generateLocal_op(loc,
dloc_op, -1);
263 }
265 std::cout << "(init_genrand): time=" << std::fixed << (end - start) << std::endl;
266
267
268
269
271 end = start;
273
274 generateLocal_h(h,
dloc_h, -1);
275 generateLocal_op(loc,
dloc_op, -1);
276
277 std::cout << "# rep=" << repetition << std::endl;
280
282#ifdef GPU
284 queue);
287
288
289#endif
290
292 {
293 std::stringstream
buff;
294 buff <<
"/RawData/Sample_No" << repetition;
295 outDirName +=
buff.str();
296 outDirName = std::regex_replace(outDirName, std::regex("//"), "/");
297 filesystem::create_directories(outDirName);
298 }
299
300
302 debug_print(
"# (rep,n)=(" << repetition <<
"," << n <<
")");
303 dim_sub = SectorDimension(
Sector[n]);
304 ComplexVector_temp.resize(dim_sub);
305 energyExpValue.resize(dim_sub);
306 energyExpValue.resize(dim_sub);
307
308 debug_print(
"# Constructing global matrices in the sector.");
310 {
313#ifdef GPU
315#endif
316 }
317 {
318#ifdef GPU
319 magma_getvector(dim_sub,
sizeof(
Complex_t), dh_tot.ptr(), dh_tot.LD() + 1,
320 &*ComplexVector_temp.begin(), 1, queue);
321#endif
322#pragma omp parallel for
323 for(size_t j = 0; j < dim_sub; j++) {
324#ifdef GPU
325 energyExpValue.at(j) = real(ComplexVector_temp.at(j));
326#else
327 energyExpValue.at(j) = real(h_tot.at(j, j));
328#endif
329 }
331 }
333
334
335
336
337
338
339
340
341 {
342 debug_print(
"# Calculating eigenstate matrix elements.");
344 if(info != 0) {
346 continue;
347 }
348#ifdef GPU
349 magma_getvector(dim_sub,
sizeof(
Complex_t), dloc_tot.ptr(), dloc_tot.LD() + 1,
350 &*tempVector.begin(), 1, queue);
351 for(size_t j = 0; j < dim_sub; ++j) EXPvalue[j] = (double)real(tempVector.at(j));
352#else
353 for(size_t j = 0; j < dim_sub; ++j) EXPvalue[j] = real(loc_tot.at(j, j));
354#endif
355 energyRange = eigenEnergy[dim_sub - 1] - eigenEnergy[0];
356 gE = eigenEnergy[0];
357#pragma omp parallel for
358 for(size_t j = 0; j < dim_sub; ++j) {
359 eigenEnergy[j] = (eigenEnergy[j] - gE) / energyRange;
360 energyExpValue[j] = (energyExpValue[j] - gE) / energyRange;
361 energyStddev[j] = energyStddev[j] / energyRange;
362 }
363 }
365
366
367
368
369
370
371
372 Degeneracy.resize(0);
373 Degeneracy.push_back(0);
374 for(size_t j = 1; j < dim_sub; ++j) {
375 if(eigenEnergy[j] - eigenEnergy[j - 1] >= precision) Degeneracy.push_back(j);
376 }
377 Degeneracy.push_back(dim_sub);
378
379
380 Index.resize(dim_sub);
381 std::iota(Index.begin(), Index.end(), 0);
382 std::sort(Index.begin(), Index.end(), [&energyExpValue](size_t x, size_t y) {
383 return energyExpValue[x] < energyExpValue[y];
384 });
385
386
387#ifdef GPU
388 magma_setvector(Degeneracy.size(),
sizeof(
Integer_t), &*Degeneracy.begin(), 1,
389 dDegeneracy.ptr(), 1, queue);
390 magma_setvector(Index.size(),
sizeof(
Integer_t), &*Index.begin(), 1, dIndex.ptr(), 1,
391 queue);
392 magma_setvector(dim_sub, sizeof(double), &*eigenEnergy.begin(), 1, dEigenEnergy.ptr(),
393 1, queue);
394 magma_queue_sync(queue);
395#endif
396
397 for(size_t p = 0; p < Nstep; ++p) {
398 time = (Tmax * p) / (double)(Nstep - 1);
399#ifdef GPU
401 GPUconf.
stream()>>>(time, Index.size(), dIndex.ptr(), dim_sub,
402 dState.ptr(), dState.LD(), dh_tot.ptr(),
403 dh_tot.LD(), dEigenEnergy.ptr());
404 magma_queue_sync(queue);
405#else
407#endif
408#ifdef GPU
409 matrixProduct_hemm(MagmaLeft, MagmaUpper, dim_sub, Index.size(), dloc_tot, dState,
410 dComplexMatrix_temp1, queue);
411 matrixProduct_gemm(MagmaConjTrans, MagmaNoTrans, Index.size(), Index.size(),
412 dim_sub, dState, dComplexMatrix_temp1, dComplexMatrix_temp2,
413 queue);
414 magma_copyvector(Index.size(),
sizeof(
Complex_t), dComplexMatrix_temp2.ptr(),
415 dComplexMatrix_temp2.LD() + 1,
416 dDynamics.ptr() + dDynamics.LD() * p, 1, queue);
417#else
418 for(size_t j = 0; j < Index.size(); j++) {
419 Id = Index.at(j);
420 Dynamics.at(j, p)
421 = ComplexOne<> * QuantumExpValue_he(dim_sub, State.begin() + State.LD() * j, dloc_tot, ComplexVector_temp);
422 }
423#endif
424 }
425
426
427 {
428 debug_print(
"# Calculating the infinite time average.");
429#ifdef GPU
432 dState.ptr(), dState.LD(), dh_tot.ptr(),
433 dh_tot.LD(), dEigenEnergy.ptr());
434 magma_queue_sync(queue);
435#else
437#endif
438
439#ifdef GPU
440 magma_copymatrix(dim_sub, dim_sub,
sizeof(
Complex_t), dloc_tot.ptr(), dloc_tot.LD(),
441 dh_tot.ptr(), dh_tot.LD(), queue);
442 magma_queue_sync(queue);
443#else
444 #pragma omp parallel for
446 for(
Integer_t k = 0; k < dim_sub; ++k) h_tot.at(j, k) = loc_tot.at(j, k);
447#endif
448
449#ifdef GPU
452 dim_sub, dloc_tot.ptr(), dloc_tot.LD());
453 magma_queue_sync(queue);
454#else
456
457#endif
458
459#ifdef GPU
460 matrixProduct_hemm(MagmaLeft, MagmaUpper, dim_sub, Index.size(), dloc_tot, dState,
461 dComplexMatrix_temp1, queue);
462 matrixProduct_gemm(MagmaConjTrans, MagmaNoTrans, Index.size(), Index.size(),
463 dim_sub, dState, dComplexMatrix_temp1, dComplexMatrix_temp2,
464 queue);
465 magma_copyvector(Index.size(),
sizeof(
Complex_t), dComplexMatrix_temp2.ptr(),
466 dComplexMatrix_temp2.LD() + 1,
467 dDynamics.ptr() + dDynamics.LD() * Nstep, 1, queue);
468#else
469 for(size_t j = 0; j < Index.size(); j++) {
470 Id = Index.at(j);
471 Dynamics.at(j, Nstep)
472 = ComplexOne<> * QuantumExpValue_he(dim_sub, State.begin() + State.LD() * j, loc_tot, ComplexVector_temp);
473 }
474#endif
475 }
476
477#ifdef GPU
478 magma_getmatrix(Index.size(), Nstep + 1,
sizeof(
Complex_t), dDynamics.ptr(),
479 dDynamics.LD(), &*Dynamics.begin(), Dynamics.LD(), queue);
480 magma_queue_sync(queue);
481#endif
482
486
488 {
490 std::stringstream
buff(
"");
491 buff <<
"/FockStateDynamics" << PRECISION <<
"_N" << n <<
".txt";
492 std::string filename(outDirName);
493 filename +=
buff.str();
494 OutFs.open(filename);
496 OutFs << std::right << std::showpos << std::scientific << std::setprecision(6);
497 OutFs << "# energyRange= " << energyRange << "\n"
498 << "# gE= " << gE << "\n"
499 << "# OpRange= " << OpRange << "\n"
500 << "# OpMin= " << OpMin << "\n"
501 << "# 1.(State No.) 2.(Normalized energy) 3.(Normalized Energy Stddev) "
502 "4.(Normalized MCAverage) 5.(Normalized Cumulative ExpVal at T=1000) "
503 "6.(at T=5000) 7.(at T=10000) 8.(at T=Infty)"
504 << "\n\n";
505 for(size_t j = 0; j < Index.size(); j++) {
506 Id = Index.at(j);
509 dim_sub, eigenEnergy, EXPvalue);
510 for(size_t k = 1; isnan(MCAverage); ++k) {
511 shellWidth = k * energyStddev[Id];
512 MCAverage
514 dim_sub, eigenEnergy, EXPvalue);
515 }
516
517 OutFs << Id << " " << energyExpValue[Id] << " " << energyStddev[Id] << " "
518 << (MCAverage - OpMin) / OpRange << " ";
519 size_t p = 0;
520 sum = 0;
521 for(; p <= (Nstep - 1) / 100; ++p) sum += real(Dynamics.at(j, p));
522 OutFs << (sum / (double)(p + 1) - OpMin) / OpRange << " ";
523 for(; p <= (Nstep - 1) / 10; ++p) sum += real(Dynamics.at(j, p));
524 OutFs << (sum / (double)(p + 1) - OpMin) / OpRange << " ";
525 for(; p <= (Nstep - 1); ++p) sum += real(Dynamics.at(j, p));
526 OutFs << (sum / (double)(p + 1) - OpMin) / OpRange << " ";
527 OutFs << (real(Dynamics.at(j, Nstep)) - OpMin) / OpRange << std::endl;
528 }
529 OutFs.close();
530 }
532 }
533 if(repetition % 10 == 9) {
534 t_int = end;
536 std::cerr << "(total=" << std::setw(6) << repetition + 1
537 << "): timeINT=" << std::setprecision(6) << std::setw(8) << (end - t_int)
538 << ", timeTOT=" << std::setprecision(6) << std::setw(8) << (end - start)
539 << ", T_construct=" << std::setprecision(6) << std::setw(10) << T_pre << "("
540 << std::setprecision(1) << 100 * T_pre / (end - start) << "%)"
541 << ", T_diag=" << std::setprecision(6) << std::setw(8) << T_diag << "("
542 << std::setprecision(1) << 100 * T_diag / (end - start) << "%)"
543 << ", T_process=" << std::setprecision(6) << std::setw(8) << T_post << "("
544 << std::setprecision(1) << 100 * T_post / (end - start) << "%)" << std::endl;
545 }
546 }
547
548 Finalize(argc, argv);
549#ifdef GPU
550 magma_finalize();
551#endif
552 return 0;
553}
void __global__ StatePreparation(double time, Integer_t Nstates, Integer_t *dIndex, Integer_t dim_sub, Complex_t *dState, Integer_t LDS, Complex_t *dh_tot, Integer_t LDH, double *dEigenEnergy)
Definition Dynamics_Deviation.cpp:90
void EnergyStddev(std::vector< double > &res, matrix_gpu< Complex_t > const &Hamiltonian_d, TransSector const &Sector, GPUconfig const &GPUconf)
Definition Dynamics_Deviation.cpp:70
void __global__ InfiniteTimeAverage(Integer_t const SizeDegen, Integer_t const *dDegeneracy, Integer_t const dim_sub, Complex_t *dOp_tot, Integer_t const LDH)
Definition Dynamics_Deviation.cpp:101
double getETtime()
Definition EnergySpectrum.c:14
Definition mytypes.hpp:147
Calculate the microcanonical averages with respect to a given sorted vector 'eigVal'.
Definition MicroCanonicalAverage.hpp:25
bool checkIsFileOpen(std::ifstream &file, std::string const &filename)
Definition file_util.hpp:22
debug_print("# Determining GPU configuration.")
Integer_t const num_op
Definition setVariablesForEnsemble.cpp:39
baseDirName
Definition setVariablesForEnsemble.cpp:50
constexpr int Nargs_base
Definition setVariablesForEnsemble.cpp:13
Integer_t const num_h
Definition setVariablesForEnsemble.cpp:38
Integer_t const repMin
Definition setVariablesForEnsemble.cpp:31
Integer_t const n_min
Definition setVariablesForEnsemble.cpp:28
Integer_t const repMax
Definition setVariablesForEnsemble.cpp:32
Integer_t const dloc_op
Definition setVariablesForEnsemble.cpp:41
Integer_t const dloc_h
Definition setVariablesForEnsemble.cpp:40
Integer_t const n_max
Definition setVariablesForEnsemble.cpp:27
double const dE
Definition setVariablesForMCAverage.cpp:2
double SpectralRange(double &OpMin, Integer_t const dim, matrix< Complex_t< double > > &Operator)
Definition statmech.cpp:49
Integer_t EigenMatrixElements(std::vector< double > &Eigenvalue, Integer_t const dim, matrix< Complex_t< double > > &Hamiltonian, matrix< Complex_t< double > > &Operator, void *GPUconf)
Definition statmech.cpp:89
std::stringstream buff("")