122 {
125
128 double gE, EnergyRange, OpRange, OpMin, sum;
129
130 if( !Initialize(argc, argv, Nargs_common) ) {
131 std::cerr << "Error: Initialization failed." << std::endl;
132 std::exit(EX_USAGE);
133 }
135
136
137 debug_print(
"# Checking for the directory structure.");
138 std::ofstream OutFs;
139
140
141
142
143
144#ifdef GPU
145 magma_init();
146 magma_queue_t queue = NULL;
147 magma_int_t dev = 0;
148 magma_getdevice( &dev );
149 magma_queue_create( dev, &queue );
150#else
152#endif
153
154
155 debug_print(
"# Calculating translation-invariant sectors.");
157
158
159
161 double time;
166 double MCAverage, shellWidth;
167
168 std::vector<Integer_t> Index(dim_max);
169 std::vector<double> eigenEnergy(dim_max);
170 std::vector<double> EXPvalue(dim_max);
171 std::vector<double> energyExpValue(dim_max);
172 std::vector<double> energyStddev(dim_max);
173 std::vector<Complex_t> ComplexVector_temp(dim_max);
176 matrix<Complex_t> Dynamics(dim_max, Nstep);
177#ifndef GPU
178 matrix<Complex_t> h_tot(dim_max, dim_max);
179 matrix<Complex_t> loc_tot(dim_max, dim_max);
180 matrix<Complex_t> State(dim_max, dim_max);
181 #define dh h
182 #define dloc loc
183 #define dh_tot h_tot
184 #define dloc_tot loc_tot
185 #define dState State
186#endif
187
188
189#ifdef GPU
190
193 Integer_t const LDT = magma_roundup(dim_max, GPU_UNIT);
194 std::vector<Complex_t> tempVector(dim_max);
197 matrix_gpu<Complex_t> dh_tot(LDT, dim_max);
198 matrix_gpu<Complex_t> dloc_tot(LDT, dim_max);
199 matrix_gpu<Complex_t> dState(LDT, dim_max);
200 matrix_gpu<Integer_t> dIndex(dim_max, 1);
201 matrix_gpu<double> dEigenEnergy(dim_max, 1);
202 matrix_gpu<Complex_t> dDynamics(LDT, Nstep);
203 matrix_gpu<Complex_t> dComplexMatrix_temp1(LDT, dim_max);
204 matrix_gpu<Complex_t> dComplexMatrix_temp2(LDT, dim_max);
205
206
207
209
210#endif
211
212 double start, t_int, end, temp_t;
213 double T_diag=0, T_post=0, T_pre=0;
214 init_genrand(SEED);
217 generateLocal_h( h,
dloc_h, -1);
218 generateLocal_op(loc,
dloc_op, -1);
219 }
221 std::cout << "(init_genrand): time=" << std::fixed << (end-start) << std::endl;
222
223
224
225
227 end = start;
229
230 generateLocal_h( h,
dloc_h, -1);
231 generateLocal_op(loc,
dloc_op, -1);
232
234 #ifdef GPU
237 #endif
238
239
240
241
243 {
244 std::stringstream
buff;
245 buff <<
"/RawData/Sample_No" << repetition;
246 outDirName +=
buff.str();
247 outDirName = std::regex_replace(outDirName, std::regex("//"), "/");
248 filesystem::create_directories(outDirName);
249 }
250
252 debug_print(
"# (rep,n)=(" << repetition <<
"," << n <<
")");
253 dim_sub = SectorDimension(
Sector[n] );
254 ComplexVector_temp.resize(dim_sub);
255 energyExpValue.resize(dim_sub);
256 energyExpValue.resize(dim_sub);
257
258 debug_print(
"# Constructing global matrices in the sector.");
260 {
263 #ifdef GPU
264 magma_queue_sync(queue);
265 #endif
266 }
267 {
268 #ifdef GPU
269 magma_getvector(dim_sub,
sizeof(
Complex_t), dh_tot.ptr(), dh_tot.LD()+1,&* ComplexVector_temp.begin(), 1, queue);
270 #endif
271 #pragma omp parallel for
272 for (size_t j = 0; j < dim_sub; j++) {
273 #ifdef GPU
274 energyExpValue.at(j) = real( ComplexVector_temp.at(j) );
275 #else
276 energyExpValue.at(j) = real( h_tot.at(j,j) );
277 #endif
278 }
280 }
282
283
284
285
286
287
289 {
290 debug_print(
"# Calculating eigenstate expectation values.");
292 if(info != 0) {
294 continue;
295 }
296 #ifdef GPU
297 magma_getvector(dim_sub,
sizeof(
Complex_t), dloc_tot.ptr(), dloc_tot.LD()+1, &*tempVector.begin(), 1, queue);
298 for(size_t j = 0;j < dim_sub; ++j) EXPvalue[j] = (double)real( tempVector.at(j) );
299 #else
300 for(size_t j = 0;j < dim_sub; ++j) EXPvalue[j] = real(dloc_tot.at(j,j));
301 #endif
302
303 EnergyRange = eigenEnergy[dim_sub-1] - eigenEnergy[0];
304 gE = eigenEnergy[0];
305 #pragma omp parallel for
306 for(size_t j = 0;j < dim_sub; ++j) {
307 eigenEnergy[j] = ( eigenEnergy[j] -gE )/EnergyRange;
308 energyExpValue[j] = ( energyExpValue[j] -gE )/EnergyRange;
309 energyStddev[j] = energyStddev[j] /EnergyRange;
310 }
311 }
313
314
315
316
317
318
319
320
321
322 Index.resize(dim_sub);
323 std::iota(Index.begin(), Index.end(), 0);
324 std::sort(Index.begin(), Index.end(), [&energyExpValue](size_t x, size_t y) {
325 return energyExpValue[x] < energyExpValue[y];
326 });
327
330 std::stringstream
buff(
"");
331 buff <<
"/FockStateEnergy" << PRECISION <<
"_N" << n <<
".txt";
332 std::string filename(outDirName); filename +=
buff.str();
334 OutFs << std::right << std::showpos << std::scientific << std::setprecision(6);
335 OutFs << "# EnergyRange= " << EnergyRange << "\n"
336 << "# gE= " << gE << "\n"
337 << "# 1.(State No.) 2.(Normalized energy) 3.(Energy) 4.(Normalized Energy Stddev)" << "\n\n";
338 for(size_t j = 0;j < dim_sub; ++j) {
339 info = Index.at(j);
340 OutFs << info << " "
341 << energyExpValue[info] << " "
342 << energyExpValue[info]*EnergyRange + gE << " "
343 << energyStddev[info] << std::endl;
344 }
345 OutFs.close();
346 }
348
349 Index.resize(0);
350 for(size_t j = 0;j < dim_sub; ++j) {
351
352
353
354 if(
Emin < energyExpValue[j]-energyStddev[j] && energyExpValue[j]+energyStddev[j] <
Emax) {
355 Index.push_back(j);
356 }
357 }
358 print(Index, Index.size());
359
360 #ifdef GPU
361 magma_setvector(Index.size(),
sizeof(
Integer_t), &*Index.begin(), 1, dIndex.ptr(), 1, queue);
362 magma_setvector(dim_sub, sizeof(double), &*eigenEnergy.begin(), 1, dEigenEnergy.ptr(), 1, queue);
363 magma_queue_sync(queue);
364 #endif
365 for(size_t p = 0;p < Nstep;++p) {
366 time = (Tmax*p)/(double)(Nstep-1);
367 #ifdef GPU
368 StatePreparation<<<
GPUconf.
dimGrid(),
GPUconf.
dimBlock(),
GPUconf.
shared(),
GPUconf.
stream()>>>(time, Index.size(), dIndex.ptr(), dim_sub, dState.ptr(), dState.LD(), dh_tot.ptr(), dh_tot.LD(), dEigenEnergy.ptr());
369 magma_queue_sync(queue);
370 #else
372 #endif
373 #ifdef GPU
374 matrixProduct_hemm(MagmaLeft, MagmaUpper, dim_sub, Index.size(), dloc_tot, dState, dComplexMatrix_temp1, queue);
375 matrixProduct_gemm(MagmaConjTrans, MagmaNoTrans, Index.size(), Index.size(), dim_sub, dState, dComplexMatrix_temp1, dComplexMatrix_temp2, queue);
376 magma_copyvector(Index.size(),
sizeof(
Complex_t), dComplexMatrix_temp2.ptr(), dComplexMatrix_temp2.LD()+1, dDynamics.ptr()+dDynamics.LD()*p, 1, queue);
377 #else
378 for(size_t j = 0; j < Index.size(); j++) {
379 Id = Index.at(j);
380 Dynamics.at(j,p) = ComplexOne<>*QuantumExpValue_he(dim_sub, State.begin()+State.LD()*j, dloc_tot, ComplexVector_temp);
381 }
382 #endif
383 }
384 #ifdef GPU
385
386 magma_getmatrix(Index.size(), Nstep,
sizeof(
Complex_t), dDynamics.ptr(), dDynamics.LD(), &*Dynamics.begin(), Dynamics.LD(), queue);
387 magma_queue_sync(queue);
388 #endif
389
390
392 for(size_t j = 0; j < Index.size(); j++) {
393 Id = Index.at(j);
395 MCAverage =
MicroCanonicalAverage(NdataInShell, energyExpValue[Id], shellWidth, dim_sub, eigenEnergy, EXPvalue);
396 for(size_t k = 1; isnan(MCAverage); ++k) {
397 shellWidth = k*energyStddev[Id];
398 MCAverage =
MicroCanonicalAverage(NdataInShell, energyExpValue[Id], shellWidth, dim_sub, eigenEnergy, EXPvalue);
399 }
400
401
403 std::stringstream
buff(
"");
404 buff <<
"/N" << n <<
"_" << PRECISION <<
"_StateNo" << Id <<
".txt";
405 filesystem::create_directories(outDirName+"/Dynamics");
406 std::string filename(outDirName+
"/Dynamics"); filename +=
buff.str();
408 OutFs << std::right << std::showpos << std::scientific << std::setprecision(6);
409 OutFs << "# EnergyRange= " << EnergyRange << "\n"
410 << "# gE= " << gE << "\n"
411 << "# NormalizedEnergyEXPvalue= " << energyExpValue[Id] << "\n"
412 << "# NormalizedEnergyStddev= " << energyStddev[Id] << "\n"
413 << "# OpRange= " << OpRange << "\n"
414 << "# OpMin= " << OpMin << "\n"
415 << "# NormalizedMCAverage= " << (MCAverage -OpMin)/OpRange << "\n"
416 << "# shellWidth= " << shellWidth << "\n"
417 << "# NdataInShell= " << NdataInShell << "\n"
418 << "# 1.(time) 2.(EXPvalue) 3.(Normalized EXPvalue) 4.(Cumulative of Normalized EXPvalue)" << "\n\n";
419 sum = 0;
420 for(size_t p = 0;p < Nstep;++p) {
421 sum += real(Dynamics.at(j,p));
422 time = (Tmax*p)/(double)(Nstep-1);
423 OutFs << time << " "
424 << real(Dynamics.at(j,p)) << " "
425 << ( real(Dynamics.at(j,p)) -OpMin) / OpRange << " "
426 << (sum/(double)(p+1) -OpMin) / OpRange
427 << std::endl;
428 }
429 OutFs.close();
430 }
431
432
433
434 }
435 if(repetition%10 == 9) {
437 std::cerr << "(total=" << std::setw(6) << repetition+1
438 << "): timeINT=" << std::setprecision(6) << std::setw(8) << (end-t_int)
439 << ", timeTOT=" << std::setprecision(6) << std::setw(8) << (end-start)
440 << ", T_construct=" << std::setprecision(6) << std::setw(10) << T_pre << "(" << std::setprecision(1) << 100*T_pre /(end-start) << "%)"
441 << ", T_diag=" << std::setprecision(6) << std::setw(8) << T_diag << "(" << std::setprecision(1) << 100*T_diag/(end-start) << "%)"
442 << ", T_process=" << std::setprecision(6) << std::setw(8) << T_post << "(" << std::setprecision(1) << 100*T_post/(end-start) << "%)"
443 << std::endl;
444 }
445 }
446
447 Finalize(argc, argv);
448 #ifdef GPU
449 magma_finalize();
450 #endif
451 return 0;
452}
double getETtime()
Definition EnergySpectrum.c:14
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 TimeEvolution.cpp:89
void EnergyStddev(std::vector< double > &res, matrix_gpu< Complex_t > const &Hamiltonian_d, TransSector const &Sector, GPUconfig const &GPUconf)
Definition TimeEvolution.cpp:70
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
constexpr double Emin
Definition setVariablesForMCAverage.cpp:4
constexpr double Emax
Definition setVariablesForMCAverage.cpp:5
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("")