StatMech
Loading...
Searching...
No Matches
LevelSpacingRatio.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 
)
21 {
22 if(argc < 5) {
23 std::cerr << "Usage: 1.This 2.Directory 3.Nmax 4.Nmin 5.dE (Op1).SampleMin (Op2).SampleMax" << std::endl;
24 std::exit(EX_USAGE);
25 }
26 int const Nmax = (argc>=3 ? std::stoi(argv[2]) :16);
27 int const Nmin = (argc>=4 ? std::stoi(argv[3]) :16);
28 double const dE = (argc>=5 ? std::stod(argv[4]) :0.02);
29 double const Emin = 0.5-dE;
30 double const Emax = 0.5+dE;
31 int const SampleMin = (argc>=6 ? std::stod(argv[5]) :-1);
32 int const SampleMax = (argc>=7 ? std::stod(argv[6]) :-1);
33
34
35 std::string const baseDir(argv[1]);
36 std::cout << "# Directory: " << baseDir << "\n";
37 std::string InDataDir(baseDir); InDataDir += "/RawData";
38 std::vector<std::string> dirList;
39 {
40 std::string str;
41 int dataNo;
42 int const idShift=(SampleMin>0? SampleMin: 0);
43 if(SampleMin>0 && SampleMax>0) dirList.resize(SampleMax-idShift+1);
44 for(const filesystem::directory_entry &entry : filesystem::directory_iterator(InDataDir)) {
45 if ( entry.is_directory() ) {
46 str = entry.path().string();
47 dataNo = std::atoi(str.substr(str.find("_No")+3).c_str());
48 if((SampleMin>0 || SampleMax>0) && (dataNo<SampleMin || SampleMax<dataNo)) continue;
49 debug_print("# dir=" << str << ", dataNo=" << dataNo);
50 if( (SampleMin<=0 || SampleMax<=0) && dirList.size()<=dataNo) dirList.resize(dataNo+1);
51 debug_print("dataNo-idShift=" << dataNo-idShift << ", dataNo=" << dataNo << ", idShift=" << idShift);
52 dirList.at(dataNo-idShift) = str;
53 }
54 }
55 }
56
57 std::vector<std::vector<double>> Average(Nmax+1);
58 std::vector<std::vector<double>> Variance(Nmax+1);
59 for(int n = Nmax;n >= Nmin ; --n) {
60 Average.at(n).resize(dirList.size());
61 Variance.at(n).resize(dirList.size());
62 for(size_t sample = 0;sample < dirList.size(); ++sample){
63 Average.at(n).at(sample) = NAN;
64 Variance.at(n).at(sample) = NAN;
65 }
66 }
67
68
69 #pragma omp parallel for schedule(dynamic, 10)
70 for(size_t sample = 0;sample < dirList.size(); ++sample) {
71 Integer_t dim;
72 double dtemp;
73 std::vector<double> EigenEnergy, levelSpacing;
74 std::string InEnergyFname, str;
75 std::ifstream InEnergyFs;
76 std::vector<std::string> candidateFileNames;
77 std::string OutFName;
78 std::string OutDir(std::regex_replace(dirList[sample], std::regex("/RawData"), "/ProcessedData"));
79 filesystem::create_directories(OutDir);
80 OutFName = OutDir + "/LevelSpacingRatio.txt";
81 std::ofstream OutFs(OutFName); checkIsFileOpen(OutFs, OutFName);
82 OutFs << "# 1.(N) 2.(Spectral Mean) 3.(Spectral Stddev) 4.(Spectral Kutosis)\n" << std::endl;
83
84 std::cout << "# " << dirList[sample] << std::endl;
85 for(int n = Nmax;n >= Nmin ; --n) {
86 dim = 0;
87 std::stringstream buff(""); buff << "_N" << n << ".txt";
88 { //-------------------- Load EigenEnergies --------------------//
89 candidateFileNames.resize(2);
90 candidateFileNames[0] = dirList[sample] + "/EigenExpValueZ" + buff.str();
91 candidateFileNames[1] = dirList[sample] + "/EigenExpValueC" + buff.str();
92 if( InEnergyFs.is_open() ) { InEnergyFs.close(); InEnergyFs.clear(); }
93 for(auto name : candidateFileNames) {
94 InEnergyFname = name;
95 InEnergyFs.open(InEnergyFname);
96 if( InEnergyFs.is_open() ) break;
97 }
98 if( !InEnergyFs.is_open() ) continue;
99 InEnergyFs.exceptions(std::ios::badbit | std::ios::failbit);
100
101 EigenEnergy.resize(0);
102 try{
103 skip_header(InEnergyFs);
104 std::stringstream ss;
105 for(getline(InEnergyFs, str); !InEnergyFs.eof(); getline(InEnergyFs, str)) {
106 ss.str(str); ss.clear(std::stringstream::goodbit);
107 ss >> dtemp; EigenEnergy.push_back(dtemp);
108 }
109 } catch(std::exception& e) {
110 if( !InEnergyFs.eof() )
111 std::cerr << "Error(" << InEnergyFs.eof() << InEnergyFs.fail() << InEnergyFs.bad() << "):" << e.what() << std::endl;
112 }
113 InEnergyFs.close(); InEnergyFs.clear();
114 dim = EigenEnergy.size();
115 }
116 #ifndef NDEBUG
117 std::cout << std::scientific;
118 print(EigenEnergy, EigenEnergy.size());
119 #endif
120
121 LevelSpacingRatio(levelSpacing, Emin, Emax, dim, EigenEnergy);
122 Average.at(n).at(sample) = std::accumulate(levelSpacing.begin(), levelSpacing.end(), 0.0) / levelSpacing.size();
123 double ave = Average.at(n).at(sample);
124 Variance.at(n).at(sample) = std::accumulate(levelSpacing.begin(), levelSpacing.end(), 0.0, [ave](double sum, const auto& e){
125 const auto temp = e - ave;
126 return sum + temp * temp;
127 }) / levelSpacing.size();
128 dtemp = std::accumulate(levelSpacing.begin(), levelSpacing.end(), 0.0, [ave](double sum, const auto& e){
129 const auto temp = e - ave;
130 return sum + temp * temp * temp * temp;
131 }) / levelSpacing.size();
132 OutFs << n << " "
133 << Average.at(n).at(sample) << " "
134 << std::sqrt(Variance.at(n).at(sample)) << " "
135 << dtemp/(Variance.at(n).at(sample)*Variance.at(n).at(sample))
136 << std::endl;
137 }
138 }
139
140 std::cout << "# Directory: " << baseDir << "\n";
141 std::string OutDIR(baseDir); OutDIR += "/Output";
142 filesystem::create_directory(OutDIR);
143
144 std::stringstream buff("");
145 buff << "/MeanLevelSpacingRatio_Emin" << std::setprecision(2) << Emin << "_Emax" << Emax << "_dE.txt";
146 std::string OutFName(OutDIR+buff.str());
147 std::ofstream Outfp(OutFName); checkIsFileOpen(Outfp, OutFName);
148 Outfp.exceptions(std::ios::badbit | std::ios::failbit);
149 Outfp << "# 1.(N) 2.(Ensemble Average) 3.(Ensemble Stddev) 4.(ndata)\n" << std::endl;
150 for(int n = Nmax;n >=Nmin ; --n) {
151 double ave=0.0, var=0.0, dtemp;
152 int ndata = 0;
153 for(size_t sample = 0;sample < dirList.size(); ++sample) {
154 if( isnan(Average.at(n).at(sample)) ) continue;
155 ndata += 1;
156 ave += Average.at(n).at(sample);
157 }
158 ave /= (double)ndata;
159 for(size_t sample = 0;sample < dirList.size(); ++sample) {
160 if( isnan(Average.at(n).at(sample)) ) continue;
161 dtemp = Average.at(n).at(sample) - ave;
162 var += dtemp * dtemp;
163 }
164 var /= (double)ndata;
165 Outfp << n << " "
166 << ave << " "
167 << std::sqrt(var) << " "
168 << ndata
169 << std::endl;
170 }
171
172 return 0;
173}
namespace filesystem
Definition LevelSpacingRatio.cpp:13
bool checkIsFileOpen(std::ifstream &file, std::string const &filename)
Definition file_util.hpp:22
debug_print("# Determining GPU configuration.")
MKL_INT Integer_t
Definition mytypes.hpp:359
constexpr double Emin
Definition setVariablesForMCAverage.cpp:4
constexpr double Emax
Definition setVariablesForMCAverage.cpp:5
double const dE
Definition setVariablesForMCAverage.cpp:2
void LevelSpacingRatio(std::vector< double > &result, double const Emin, double const Emax, Integer_t const dim, const std::vector< double > &eigenEnergy)
Definition statmech.cpp:328
std::stringstream buff("")

Variable Documentation

◆ filesystem

namespace filesystem = std::experimental::filesystem