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

Classes

struct  statm_t
 

Functions

void read_off_memory_status (statm_t &result)
 
Integer_t Bin (double x)
 
int main (int argc, char **argv)
 

Variables

namespace filesystem = std::experimental::filesystem
 
statm_t Usage
 

Function Documentation

◆ Bin()

Integer_t Bin ( double  x)
85 {
86 Integer_t res = (Integer_t)(x*NDIV);
87 return (res==NDIV ? res-1: res);
88};
MKL_INT Integer_t
Definition mytypes.hpp:359

◆ main()

int main ( int  argc,
char **  argv 
)
90 {
91 #ifndef MAX
92 # define MAX 100
93 #endif
94 #ifndef SEED
95 # define SEED 0
96 #endif
98 std::string const Type(argv[Nargs_common+0]);
99 double const param = atof(argv[Nargs_common+1]);
100
101 Integer_t dim_sub; //全ヒルベルト空間の次元
102 double EnergyRange0, EnergyRange1;
103 double ggE, gE1;
104 #ifdef GPU
105 constexpr magma_trans_t transC = MagmaConjTrans;
106 constexpr magma_trans_t transN = MagmaNoTrans;
107 #else
108 char transC = 'C', transN = 'N';
109 #endif
110
111 if( !Initialize(argc, argv, Nargs_common) ) {
112 std::cerr << "Error: Initialization failed." << std::endl;
113 std::exit(EX_USAGE);
114 }
115 debug_print("# Successfully initialized.");
116
117 //******************** Check for the directory structure ********************
118 debug_print("# Checking for the directory structure.");
119 std::ofstream OutSample, OutParam, OutMultiFractal;
120 //******************** (END) Check for the directory structure ********************
121
122 //***************************************************************************
123 //******************** Allocation & Initialization **************************
124 //***************************************************************************
125#ifdef GPU
126 magma_init();
127 magma_queue_t queue = NULL, queue2 = NULL;
128 magma_queue_t& queue1 = queue;
129 magma_int_t dev = 0;
130 magma_getdevice( &dev );
131 magma_queue_create( dev, &queue1 );
132 magma_queue_create( dev, &queue2 );
133#else
134 void* GPUconf = nullptr;
135#endif
136
137 //******************** Translation invariance ********************
138 debug_print("# Calculating translation-invariant sectors.");
140 //******************** (END)Translation invariance ********************
141
142 //********** Allocate CPU memories **********//
143 debug_print("# Allocating CPU memories.");
144 Integer_t const dim_max = SectorDimension(Sector[n_max]);
145 std::vector<double> eigenEnergy1(dim_max);
146 std::vector<double> eigenEnergy0(dim_max);
147 matrix<Complex_t> h(dloc_h , dloc_h );
148 matrix<Complex_t> h1_tot(dim_max, dim_max);
149 matrix<Complex_t> h0_tot(dim_max, dim_max);
150 matrix<Complex_t> Overlap(dim_max, dim_max);
151 std::vector<double> aveOverlap(NDIV);
152#ifndef GPU
153 #define dh h
154 #define dh1_tot h1_tot
155 #define dh0_tot h0_tot
156 #define dOverlap Overlap
157 #define dfactorUnity factorUnity
158#endif
159
160 constexpr double epsilon = 1.0e-4;
161 std::vector<std::vector<Real_t>> factorUnity(n_max+1);
162 for(Integer_t n = n_min;n <= n_max; ++n) {
163 factorUnity[n].resize(n);
164 factorUnity[n][0] = 0;
165 for(Integer_t j = 1;j <= n/2; ++j) {
166 factorUnity[n][j] = (Real_t)std::pow(j,-epsilon);
167 factorUnity[n].at(n-j) = factorUnity[n][j];
168 }
169 print(factorUnity[n],n);
170 }
171 //********** (END) Allocate CPU memories **********//
172
173#ifdef GPU
174 //********** Allocate GPU memories **********//
175 debug_print("# Allocating GPU memories.");
176 constexpr Integer_t GPU_UNIT = 32;
177 Integer_t const LDT = magma_roundup(dim_max, GPU_UNIT);
178 matrix_gpu<Complex_t> dh(dloc_h, dloc_h);
179 matrix_gpu<Complex_t> dh1_tot(LDT, dim_max);
180 matrix_gpu<Complex_t> dh0_tot(LDT, dim_max);
181 matrix_gpu<Complex_t> dOverlap(LDT, dim_max);
182
183 std::vector<Real_t*> dfactorUnity(n_max+1);
184 for(int n = n_min;n <= n_max; ++n) {
185 CHECK( magma_malloc((void**)&dfactorUnity[n], n*sizeof(Real_t)) );
186 CHECK( magma_setvector(n, sizeof(Real_t), &*factorUnity[n].begin(), 1, dfactorUnity[n], 1, queue) );
187 }
188 //********** (END) Allocate GPU memories **********//
189
190 //********** Determine GPU configuration **********//
192 //********** (END) Determine GPU configuration **********//
193#endif // #ifdef GPU
194
195 double start, t_int, end, temp_t;
196 double T_diag=0, T_post=0, T_pre=0;
197 init_genrand(SEED);
198 start = getETtime();
199 for(Integer_t repetition = 0;repetition < repMin; ++repetition) {
200 generateLocal_h(h, dloc_h, -1);
201 }
202 end = getETtime();
203 std::cout << "(init_genrand): time=" << std::fixed << (end-start) << std::endl;
204 //***************************************************************************
205 //******************** (END) Allocation & Initialization ********************
206 //***************************************************************************
207
208 start = getETtime();
209 end = start;
210
211 // for(Integer_t repetition = repMin;repetition <= repMin+9; ++repetition) {
212 for(Integer_t repetition = repMin;repetition <= repMax; ++repetition) {
213 #if !defined(NDEBUG) && defined(__linux__)
215 std::cerr << "# (GPU, rep= " << std::setw(6) << repetition
216 << ") size=" << Usage.size
217 << ", resident=" << Usage.resident
218 << ", share=" << Usage.share
219 << ", text=" << Usage.text
220 << ", lib=" << Usage.lib
221 << ", data=" << Usage.data
222 << ", dt=" << Usage.dt
223 << std::endl;
224 #endif
225 // 局所ハミルトニアンと局所物理量をランダムにとる ******************************//
226 generateLocal_h(h, dloc_h, -1);
227 #ifdef GPU
228 magma_setmatrix(dloc_h, dloc_h, sizeof(Complex_t), &*h.begin(), dloc_h, dh.ptr(), dloc_h, queue);
229 #endif
230
231 std::string outDirName(baseDirName);
232 {
233 std::stringstream buff("");
234 buff << "/ProcessedData/Sample_No" << repetition;
235 outDirName += buff.str();
236 outDirName = std::regex_replace(outDirName, std::regex("//"), "/");
237 filesystem::create_directories(outDirName);
238 }
239
240 for(Integer_t n = n_max;n >= n_min; --n) {
241 debug_print("# (rep,n)=(" << repetition << "," << n << ")");
242 debug_print("# Constructing global matrices in the sector.");
243 temp_t = getETtime();
244 {
245 dim_sub = constructGlobalOperator(dh0_tot, dh, num_h, Sector.at(n), dfactorUnity[n], GPUconf);
246 debug_print("# dim_sub=" << dim_sub);
247 eigenEnergy0.resize(dim_sub);
248 eigenEnergy1.resize(dim_sub);
249
250 if(Type == "CRMT") {
251 matrix<Complex_t>& Pert = Overlap;
252 RandomMatrix_GUE(Pert, dim_sub);
253 #ifdef GPU
254 {
255 matrix_gpu<Complex_t>& dPert = dOverlap;
256 magma_setmatrix_async(dim_sub, dim_sub, sizeof(Complex_t), &*Pert.begin(), Pert.LD(), dPert.ptr(), dPert.LD(), queue);
257 magma_copymatrix_async(dim_sub,dim_sub,sizeof(Complex_t),dh0_tot.ptr(),dh0_tot.LD(),dh1_tot.ptr(),dh1_tot.LD(),queue);
258 magma_queue_sync(queue);
259 Complex_t alpha = ComplexOne<>*epsilon;
260 magma_axpy_wrapper(LDT*dim_max, alpha, dPert.ptr(), 1, dh0_tot.ptr(), 1, queue);
261 if(Diagonalize(dim_sub, dh0_tot, eigenEnergy0) != 0) continue;
262
263 EnergyRange0 = eigenEnergy0[dim_sub-1] - eigenEnergy0[0];
264 alpha = ComplexOne<>*EnergyRange0*param/sqrt((double)dim_sub);
265 magma_axpy_wrapper(LDT*dim_max, alpha, dPert.ptr(), 1, dh1_tot.ptr(), 1, queue);
266 }
267 #else
268 { Integer_t n = Pert.size(), one=1;
269 Complex_t alpha = DoubleComplexOne*epsilon;
270 h1_tot.copy(h0_tot);
271 zaxpy_(&n, &alpha, &*Pert.begin(), &one, &*h0_tot.begin(), &one);
272 if(Diagonalize(dim_sub, dh0_tot, eigenEnergy0) != 0) continue;
273
274 EnergyRange0 = eigenEnergy0[dim_sub-1] - eigenEnergy0[0];
275 alpha = DoubleComplexOne*EnergyRange0*param/sqrt((double)dim_sub);
276 zaxpy_(&n, &alpha, &*Pert.begin(), &one, &*h1_tot.begin(), &one);
277 }
278 #endif
279 } else {
280 constructGlobal_h(dh1_tot, dh, num_h, Sector.at(n), GPUconf);
281 #ifdef GPU
282 magma_queue_sync(queue);
283 #endif
284 if(Diagonalize(dim_sub, dh0_tot, eigenEnergy0) != 0) continue;
285 }
286 }
287 T_pre += getETtime() -temp_t;
288
289 debug_print("# Calculating overlaps of eigenvectors.");
290 temp_t = getETtime();
291 {
292 if(Diagonalize(dim_sub, dh1_tot, eigenEnergy1) != 0) continue;
293 matrixProduct_gemm(transC, transN, dim_sub, dim_sub, dim_sub, dh0_tot, dh1_tot, dOverlap, GPUconf);
294 }
295 debug_print("# EnergyRange0=" << EnergyRange0 << ", EnergyRange1=" << EnergyRange1 << ", eigenEnergy0.size()=" << eigenEnergy0.size() << ", eigenEnergy1.size()=" << eigenEnergy1.size());
296 EnergyRange0 = eigenEnergy0.at(dim_sub-1) - eigenEnergy0[0];
297 EnergyRange1 = eigenEnergy1.at(dim_sub-1) - eigenEnergy1[0];
298 ggE = eigenEnergy0[0];
299 gE1 = eigenEnergy1[0];
300 #pragma omp parallel for
301 for(size_t i = 0;i < dim_sub; ++i) {
302 eigenEnergy0.at(i) = (eigenEnergy0.at(i)-ggE)/EnergyRange0;
303 eigenEnergy1.at(i) = (eigenEnergy1.at(i)-gE1)/EnergyRange1;
304 }
305 #ifdef GPU
306 magma_getmatrix(dim_sub, dim_sub, sizeof(Complex_t), dOverlap.ptr(), dOverlap.LD(), &*Overlap.begin(), Overlap.LD(), queue);
307 #endif
308 T_diag += getETtime() -temp_t;
309
310 temp_t = getETtime();
311 debug_print("# Preprocessing the overlaps.");
312 { // Calculate Multi-fractal dimensions
313 #ifdef GPU
314 magma_getmatrix_async(dim_sub, dim_sub, sizeof(Complex_t), dh1_tot.ptr(), dh1_tot.LD(), &*h1_tot.begin(), h1_tot.LD(), queue1);
315 if(Type == "Short") {
316 magma_getmatrix_async(dim_sub, dim_sub, sizeof(Complex_t), dh0_tot.ptr(), dh0_tot.LD(), &*h0_tot.begin(), h0_tot.LD(), queue2);
317 }
318 #endif
319 {
320 std::stringstream buff("");
321 buff << "/MultiFractal" << PRECISION << "_MF_N" << n << ".txt";
322 std::string filename(outDirName); filename += buff.str();
323 OutMultiFractal.open(filename); checkIsFileOpen(OutMultiFractal,filename);
324 OutMultiFractal
325 << "# 1.(Energy) 2.(deg.2) 3.(deg.3) ...\n" << std::endl
326 << std::scientific;
327 printMultiFractalDimensions(OutMultiFractal, dim_sub, 8, eigenEnergy1, Overlap, dim_sub);
328 OutMultiFractal.close(); OutMultiFractal.clear();
329 }
330 {
331 std::stringstream buff("");
332 buff << "/MultiFractal" << PRECISION << "_H1vsFock_N" << n << ".txt";
333 std::string filename(outDirName); filename += buff.str();
334 OutMultiFractal.open(filename); checkIsFileOpen(OutMultiFractal,filename);
335 OutMultiFractal
336 << "# 1.(Energy) 2.(deg.2) 3.(deg.3) ...\n" << std::endl
337 << std::scientific;
338 #ifdef GPU
339 magma_queue_sync(queue1);
340 #endif
341 printMultiFractalDimensions(OutMultiFractal, dim_sub, 8, eigenEnergy1, h1_tot, dim_sub);
342 OutMultiFractal.close(); OutMultiFractal.clear();
343 }
344 if(Type == "Short") {
345 std::stringstream buff("");
346 buff << "/MultiFractal" << PRECISION << "_H0vsFock_N" << n << ".txt";
347 std::string filename(outDirName); filename += buff.str();
348 OutMultiFractal.open(filename); checkIsFileOpen(OutMultiFractal,filename);
349 OutMultiFractal
350 << "# 1.(Energy) 2.(deg.2) 3.(deg.3) ...\n" << std::endl
351 << std::scientific;
352 #ifdef GPU
353 magma_queue_sync(queue2);
354 #endif
355 printMultiFractalDimensions(OutMultiFractal, dim_sub, 8, eigenEnergy0, h0_tot, dim_sub);
356 OutMultiFractal.close(); OutMultiFractal.clear();
357 }
358 }
359 { debug_print("# Calculating Energy dependence of overlaps.");
360 #pragma omp parallel for
361 for (size_t i = 0; i < dim_sub; ++i) for (size_t j = 0; j < dim_sub; ++j) {
362 Overlap.at(i,j) = conj(Overlap.at(i,j))*Overlap.at(i,j);
363 }
364 auto [BinAverage, BinDataNum] = coarseGrainingMatrixByEnergy(NDIV, dim_sub, eigenEnergy0, eigenEnergy1, Overlap);
365 auto [mean, sigma, DOS] = OverlapSqVsEnergy(NDIV, dim_sub, eigenEnergy0, eigenEnergy1, Overlap);
366 {
367 debug_print("# Writing results to a file.");
368 std::stringstream buff(""); buff << "/Overlap" << PRECISION << "_MF_N" << n << ".txt";
369 std::string filename(outDirName+buff.str());
370 OutSample.open(filename); checkIsFileOpen(OutSample,filename);
371 OutSample << "# 1.(Energy1) 2.(Energy0) 3.(Overlap^2) 4.(Num. data) 5.(Dos of H1)\n" << std::endl
372 << std::scientific;
373 for(size_t bin1 = 0;bin1 < NDIV; ++bin1) for(size_t bin0 = 0;bin0 < NDIV; ++bin0) {
374 if( isnan(real(BinAverage.at(bin0,bin1))) ) continue;
375 OutSample << std::setw(13) << (bin1+0.5)/(double)NDIV << " "
376 << std::setw(13) << (bin0+0.5)/(double)NDIV << " "
377 << std::setw(13) << real(BinAverage.at(bin0,bin1)) << " "
378 << std::setw(5) << BinDataNum.at(bin0,bin1) << " "
379 << std::setw(13) << DOS.at(bin1)
380 << "\n" << std::noshowpos;
381 }
382 OutSample.close(); OutSample.clear();
383 }
384 {
385 std::stringstream buff(""); buff << "/Parameter" << PRECISION << "_MF_N" << n << ".txt";
386 std::string filename(outDirName+buff.str());
387 OutParam.open(filename); checkIsFileOpen(OutParam,filename);
388 OutParam << "# 1.(Energy1) 2.(mean) 3.(width) 4.(Strength sigma) 5.(density of states)\n" << std::endl
389 << std::scientific;
390 for(size_t bin1 = 0;bin1 < NDIV; ++bin1) {
391 if(DOS[bin1] == 0) continue;
392 OutParam << std::setw(13) << (bin1+0.5)/(double)NDIV << " "
393 << std::setw(13) << mean[bin1] << " "
394 << std::setw(13) << sigma[bin1] << " "
395 << std::setw(13) << EnergyRange0*sqrt(sigma[bin1]/DOS[bin1]/M_PI) << " "
396 << std::setw(13) << DOS[bin1]
397 << "\n" << std::noshowpos;
398 }
399 OutParam.close(); OutParam.clear();
400 }
401 }
402 T_post += getETtime() - temp_t;
403 }
404
405 if(repetition%10 == 9) {
406 t_int = end; end = getETtime();
407 std::cerr << "(total=" << std::setw(6) << repetition+1
408 << "): timeINT=" << std::setprecision(6) << std::setw(8) << (end-t_int)
409 << ", timeTOT=" << std::setprecision(6) << std::setw(8) << (end-start)
410 << ", T_construct=" << std::setprecision(6) << std::setw(10) << T_pre << "(" << std::setprecision(1) << 100*T_pre /(end-start) << "%)"
411 << ", T_diag=" << std::setprecision(6) << std::setw(8) << T_diag << "(" << std::setprecision(1) << 100*T_diag/(end-start) << "%)"
412 << ", T_process=" << std::setprecision(6) << std::setw(8) << T_post << "(" << std::setprecision(1) << 100*T_post/(end-start) << "%)"
413 << std::endl;
414 }
415 }
416 Finalize(argc, argv);
417 #ifdef GPU
418 for(int n = n_min;n <= n_max; ++n) CHECK( magma_free(dfactorUnity[n]) );
419 magma_queue_destroy(queue1);
420 magma_queue_destroy(queue2);
421 magma_finalize();
422 #endif
423 return 0;
424}
double getETtime()
Definition EnergySpectrum.c:14
void read_off_memory_status(statm_t &result)
Definition Overlap_vsH0.cpp:56
statm_t Usage
Definition Overlap_vsH0.cpp:55
std::vector< TransSector > Sector(n_max+1)
Definition mytypes.hpp:147
bool checkIsFileOpen(std::ifstream &file, std::string const &filename)
Definition file_util.hpp:22
debug_print("# Determining GPU configuration.")
GPUconfig GPUconf(dim3(nBlock, nBlock, 1), dim3(nThread, nThread, 1), 0, queue)
double Real_t
Definition mytypes.hpp:37
baseDirName
Definition setVariablesForEnsemble.cpp:50
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_h
Definition setVariablesForEnsemble.cpp:40
Integer_t const n_max
Definition setVariablesForEnsemble.cpp:27
Integer_t Diagonalize(Integer_t const dim, matrix< Complex_t< double > > &Hamiltonian, std::vector< double > &Eigenvalue)
Definition statmech.cpp:56
std::tuple< std::vector< double >, std::vector< double >, std::vector< double > > OverlapSqVsEnergy(Integer_t const NDIV, Integer_t const dim, std::vector< double > const &Energy1, std::vector< double > const &Energy2, matrix< Type > const &OverlapSq)
Definition statmech.cpp:346
unsigned long dt
Definition Fluc_randHOp.cpp:95
unsigned long lib
Definition Fluc_randHOp.cpp:95
unsigned long text
Definition Fluc_randHOp.cpp:95
unsigned long resident
Definition Fluc_randHOp.cpp:95
unsigned long share
Definition Fluc_randHOp.cpp:95
unsigned long size
Definition Fluc_randHOp.cpp:95
unsigned long data
Definition Fluc_randHOp.cpp:95
std::stringstream buff("")

◆ read_off_memory_status()

void read_off_memory_status ( statm_t result)
57 {
58 const char* statm_path = "/proc/self/statm";
59
60 FILE *f = fopen(statm_path,"r");
61 if(!f){
62 perror(statm_path);
63 abort();
64 }
65 if(7 != fscanf(f,"%ld %ld %ld %ld %ld %ld %ld",
66 &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt))
67 {
68 perror(statm_path);
69 abort();
70 }
71 fclose(f);
72 }

Variable Documentation

◆ filesystem

namespace filesystem = std::experimental::filesystem

◆ Usage

statm_t Usage