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

Functions

int main (int argc, char **argv)
 

Variables

namespace filesystem = std::experimental::filesystem
 

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)
61 {
63
64 Integer_t dim_sub; //全ヒルベルト空間の次元
65 Integer_t info, failed=0; // カウンタ
66 double gE, EnergyRange, dtemp;
67
68 if( !Initialize(argc, argv, Nargs_common) ) {
69 std::cerr << "Error: Initialization failed." << std::endl;
70 std::exit(EX_USAGE);
71 }
72 debug_print("# Successfully initialized.");
73
74 //******************** Check for the directory structure ********************
75 debug_print("# Checking for the directory structure.");
76 std::ofstream OutFs;
77 //******************** (END) Check for the directory structure ********************
78
79 //***************************************************************************
80 //******************** Allocation & Initialization **************************
81 //***************************************************************************
82#ifdef GPU
83 magma_init();
84 magma_queue_t queue = NULL;
85 magma_int_t dev = 0;
86 magma_getdevice( &dev );
87 magma_queue_create( dev, &queue );
88#else
89 void* GPUconf = nullptr;
90#endif
91
92 //******************** Translation invariance ********************
93 debug_print("# Calculating translation-invariant sectors.");
95 //******************** (END)Translation invariance ********************
96
97 //********** Allocate CPU memories **********//
98 debug_print("# Allocating CPU memories.");
99 Integer_t const dim_max = SectorDimension(Sector[n_max]);
100 std::vector<double> eigenEnergy(dim_max);
101 std::vector<double> EXPvalue(dim_max);
102 //********** (END) Allocate CPU memories **********//
103
104 double start, t_int, end, temp_t;
105 double T_diag=0, T_post=0, T_pre=0;
106 init_genrand(SEED);
107 start = getETtime();
108 end = getETtime();
109 std::cout << "(init_genrand): time=" << std::fixed << (end-start) << std::endl;
110 //***************************************************************************
111 //******************** (END) Allocation & Initialization ********************
112 //***************************************************************************
113
114 start = getETtime();
115 end = start;
116 for(Integer_t repetition = repMin;repetition <= repMax; ++repetition) {
117 // 局所ハミルトニアンと局所物理量をランダムにとる ******************************//
118 std::string outDirName(baseDirName);
119 {
120 std::stringstream buff;
121 buff << "/RawData/Sample_No" << repetition;
122 outDirName += buff.str();
123 outDirName = std::regex_replace(outDirName, std::regex("//"), "/");
124 filesystem::create_directories(outDirName);
125 }
126
127 int sign = (Gaussian()>0 ? +1: -1);
128 for(size_t n = n_max;n >= n_min; --n) {
129 debug_print("# (rep,n)=(" << repetition << "," << n << ")");
130 dim_sub = Sector.at(n).dim();
131
132
133 temp_t = getETtime();
134 {
135 eigenEnergy.resize(dim_sub);
136 for(Integer_t j = 0;j < dim_sub; ++j) eigenEnergy[j] = Gaussian()/sqrt((double)n);
137 std::sort(eigenEnergy.begin(), eigenEnergy.end());
138 EnergyRange = eigenEnergy[dim_sub-1] - eigenEnergy[0];
139 gE = eigenEnergy[0];
140 for(Integer_t j = 0;j < dim_sub; ++j) eigenEnergy[j] = (eigenEnergy[j]-gE)/EnergyRange;
141 EXPvalue.resize(dim_sub);
142 for(Integer_t j = 0;j < dim_sub; ++j) {
143 EXPvalue[j] = sign*4*(eigenEnergy[j]-0.5)*(eigenEnergy[j]-0.5);
144 dtemp = (eigenEnergy[j]*EnergyRange + gE)*sqrt((double)n);
145 EXPvalue[j] += Gaussian()/sqrt(dim_sub*0.1*std::exp( -dtemp*dtemp/2.0 ));
146 }
147 }
148 T_diag += getETtime() -temp_t;
149
150 temp_t = getETtime();
151 {
152 debug_print("# Writing results to a file.");
153 std::stringstream buff("");
154 buff << "/EigenExpValue" << PRECISION << "_N" << n << ".txt";
155 std::string filename(outDirName); filename += buff.str();
156 OutFs.open(filename); checkIsFileOpen(OutFs, filename);
157 OutFs << std::right << std::showpos << std::scientific << std::setprecision(6);
158 OutFs << "# OpRange= " << 1.0 << "\n"
159 << "# 1.(Normalized energy) 2.(Energy) 3.(Exp value)" << "\n\n";
160 for(size_t j = 0;j < dim_sub; ++j) {
161 OutFs << eigenEnergy[j] << " "
162 << eigenEnergy[j]*EnergyRange + gE << " "
163 << EXPvalue[j] << std::endl;
164 }
165 OutFs.close();
166 }
167 T_post += getETtime() -temp_t;
168 }
169 if(repetition%10 == 9) {
170 t_int = end; end = getETtime();
171 std::cerr << "(total=" << std::setw(6) << repetition+1
172 << "): timeINT=" << std::setprecision(6) << std::setw(8) << (end-t_int)
173 << ", timeTOT=" << std::setprecision(6) << std::setw(8) << (end-start)
174 << ", T_construct=" << std::setprecision(6) << std::setw(10) << T_pre << "(" << std::setprecision(1) << 100*T_pre /(end-start) << "%)"
175 << ", T_diag=" << std::setprecision(6) << std::setw(8) << T_diag << "(" << std::setprecision(1) << 100*T_diag/(end-start) << "%)"
176 << ", T_process=" << std::setprecision(6) << std::setw(8) << T_post << "(" << std::setprecision(1) << 100*T_post/(end-start) << "%)"
177 << std::endl;
178 }
179 }
180
181 Finalize(argc, argv);
182 #ifdef GPU
183 magma_finalize();
184 #endif
185 return 0;
186}
double getETtime()
Definition EnergySpectrum.c:14
std::vector< TransSector > Sector(n_max+1)
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)
MKL_INT Integer_t
Definition mytypes.hpp:359
baseDirName
Definition setVariablesForEnsemble.cpp:50
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 n_max
Definition setVariablesForEnsemble.cpp:27
std::stringstream buff("")

Variable Documentation

◆ filesystem

namespace filesystem = std::experimental::filesystem