-
Notifications
You must be signed in to change notification settings - Fork 0
/
extra.hpp
151 lines (136 loc) · 4.07 KB
/
extra.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#ifndef _EXTRA_HPP_INCLUDED_
#define _EXTRA_HPP_INCLUDED_
#include <fstream>
#include <Eigen/Dense>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
using namespace std;
using namespace Eigen;
void show_eigenvalues(MatrixXcd H)
{
std::vector<double> eigenvalues;
diagonalize(H, eigenvalues);
for(auto it=eigenvalues.begin(); it!= eigenvalues.end(); it++) cout << *it << " ";
cout << endl << endl;
}
void matrix_output(MatrixXcd Mc, MatrixXcd Mcx, MatrixXcd Mcy, MatrixXcd Mcz)
{
cout << setprecision(3) << Mc << endl << endl << Mcx << endl << endl << Mcy << endl << endl << Mcz << endl << endl;
}
void generate_scriptname(string& scriptname) {
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer,sizeof(buffer),"%S-%M-%I-%Y-%m-%d",timeinfo);
string str(buffer);
string base= "wolframscripts/script";
string extension=".nb";
scriptname= base+str+extension;
}
string current_time_str(void)
{
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer,sizeof(buffer),"%S-%M-%I-%Y-%m-%d",timeinfo);
string str(buffer);
return str;
}
void eigenvalues_Mathematica(MatrixXcf Mc, ofstream& fout, string scriptname)
{
int size = Mc.rows()/2;
fout.open(scriptname);
//fout << "#!/usr/local/bin/WolframScript -linewise -script" << endl;
fout << "Print[Eigenvalues[N[{";
for(int i=0; i<2*size; i++)
{
fout << "{ ";
for(int j=0; j<2*size; j++)
{
fout << Mc.real()(i,j) << "+ I (" << Mc.imag()(i,j);
if(j==2*size-1) fout << ") ";
else fout << "),";
}
if(i==2*size-1) fout << "} ";
else fout << "},";
}
fout << "}]]];" << endl;
fout.close();
}
void make_exec(string str)
{
const char *scriptname = str.c_str();
chmod(scriptname, S_IRWXU);
cout << "To generate the eigenvalues using Mathematica for verification, run "<< str << endl;
}
void generate_wlscript(MatrixXcf Mc, ofstream& fout)
{
int size = Mc.rows()/2;
string scriptname;
generate_scriptname(scriptname);
eigenvalues_Mathematica(Mc, fout, scriptname);
make_exec(scriptname);
}
void progress_percent_desc(double initial_temp, double final_temp, double temperature)
{
int progress_percent;
progress_percent=int((final_temp-temperature)*100/(final_temp-initial_temp));
cout.flush();
cout << "\r [ "<< progress_percent+1 << "% ] ";
for(int i=0; i<progress_percent; i++)
{
cout << "#";
}
}
void progress_percent_asc(double initial_temp, double final_temp, double temperature)
{
int progress_percent;
progress_percent=int((temperature-initial_temp)*100/(final_temp-initial_temp));
cout.flush();
cout << "\r [ "<< progress_percent+1 << "% ] ";
for(int i=0; i<progress_percent; i++)
{
cout << "#";
}
}
void spinarrangement_Mathematica_output(MatrixXd M, ofstream& fout)
{
double lattice_separation = 1.0;
// cout << "Enter lattice separation (a): ";
// cin >> lattice_separation;
fout << "Show[Graphics3D[{" << endl;
for(int i=0; i< M.rows(); i++)
{
fout << "Arrow[{{" << lattice_separation*i << ", 0, 0}, {" << M(i,0)+lattice_separation*i << "," << M(i,1) << "," << M(i,2) << "}}]";
if(i!=M.rows()-1) fout << ",\n";
}
fout <<"}] ]" << endl << endl;
}
void show_time(milliseconds begin_ms, milliseconds end_ms, string s)
{
long int t = (end_ms.count()-begin_ms.count())/1000;
if (t<=60)
{ cout << s << " took " << t << " seconds." << endl; }
else if (t>60 && t<3600)
{
int minutes=int(t/60); int seconds= t%minutes;
cout << s << " took " << minutes << " minute and " << seconds << " seconds." << endl;
}
else if(t>=3600)
{
int hrs= int(t/3600); int minutes=int((t-3600*hrs)/60); int seconds= int(t-3600*hrs-60*minutes);
cout << s << " took " << hrs << " hour, " << minutes << " minutes and " << seconds << " seconds. ";
}
else
{cout << s << " took " << t << "time. Wrong t received.\n"; }
}
#endif