-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInputOutput.cpp
More file actions
268 lines (232 loc) · 12 KB
/
InputOutput.cpp
File metadata and controls
268 lines (232 loc) · 12 KB
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
//
// Created by maximilian on 30.08.21.
//
#include "InputOutput.h"
/**
* Parses all Options from command-args
* @param argc - argc from main methpd
* @param argv - argv from main method
* @return Returns a full parameter-struct with all values parsed.
*/
Parameters getParametersFromProgramOptions(char **argc, int argv) {
namespace po = boost::program_options;
using namespace std;
Parameters parameters;
po::options_description desc("Available options", 100,50);
desc.add_options()
("help,h", "prints this help message")
;
po::options_description description_latticeOptions("Lattice options", 100,50);
description_latticeOptions.add_options()
("sites,N", po::value<unsigned int>(¶meters.sites)->default_value(64), "set number of sites to use (one dimension)")
("dimension,D", po::value<unsigned int>(¶meters.dimension)->default_value(2), "set dimension (currently only D=2 is supported)")
;
desc.add(description_latticeOptions);
po::options_description description_simulationAndMeasurement("Simulation and Measurement", 100,50);
description_simulationAndMeasurement.add_options()
("nos,A", po::value<unsigned int>(¶meters.number_of_simulations)->default_value(10), "Number of simulations")
("output,o", po::value<string>(¶meters.outFileName)->default_value("measurements"), "output file prefix to store results")
("printAllSteps,p", po::bool_switch(¶meters.flag_printEveryStep), "print observables for each iteration")
("measureTime", po::value<unsigned int>(¶meters.measure_time)->default_value(1), "Time-Steps for measurements after system is thermalized")
("seed", po::value<unsigned long long>(¶meters.seed)->default_value(std::chrono::high_resolution_clock::now().time_since_epoch().count(), "current time"), "Seed for the random number generator.")
;
desc.add(description_simulationAndMeasurement);
po::options_description description_thermalizationOptions("Thermalization options", 100,50);
description_thermalizationOptions.add_options()
("timeDelta,t", po::value<TFloat>(¶meters.integrator_timeDelta)->default_value(0.05,"0.05"), "TimeStep for integration")
("thermTime1", po::value<unsigned int>(¶meters.thermalization_time_1)->default_value(1500), "Thermalization time-steps: sigma(ModelA), n(ModelA), (symmetryBreaking J active)")
("symmetryBreakingJ,S", po::value<TFloat>(¶meters.symmetryBreakingJ)->default_value(0), "External constant field for thermalization phase 1. (If set to zero, the value is +-0.1")
("thermTime2", po::value<unsigned int>(¶meters.thermalization_time_2)->default_value(25000), "Thermalization time-steps: sigma(ModelA), n(ModelA), (symmetryBreaking J = 0)")
("fastTherm", po::bool_switch(¶meters.fastThermalization), "Use larger time-steps for the first half of thermalization phase 2")
("dynamicChangeMode", po::value<unsigned int>(¶meters.dynamicChangeMode)->default_value(DYNAMIC_CHANGE_MODE_RE_INIT), "Specify how to treat nu-field on dynamic change\n0: Re-Init nu-field\n1: Subtract average\n2: Set field to zero")
("thermTime3", po::value<unsigned int>(¶meters.thermalization_time_3)->default_value(25000), "Thermalization time-steps: sigma(ModelA), n(ModelB)")
;
desc.add(description_thermalizationOptions);
po::options_description description_parameters("Physical parameters", 100,50);
description_parameters.add_options()
("temperature,T", po::value<TFloat>(¶meters.temperature)->default_value(4), "physical parameter: Temperature")
("couplingConstant,C", po::value<TFloat>(¶meters.C)->default_value(0.1,"0.1"), "Coupling constant to couple both fields")
("parJ,J", po::value<TFloat>(¶meters.J)->default_value(0), "External constant field")
("msqA", po::value<TFloat>(¶meters.msq_A)->default_value(-1), "Square mass for Model-A field")
("lambdaA", po::value<TFloat>(¶meters.lambda_A)->default_value(1), "Lambda (quartic term) for Model-A field")
("gammaA", po::value<TFloat>(¶meters.gamma_A)->default_value(0.1, "0.1"), "Langevin-Damping for Model-A field")
("gammaB", po::value<TFloat>(¶meters.gamma_B)->default_value(0.1, "0.1"), "Langevin-Damping for Model-B field")
("msqB", po::value<TFloat>(¶meters.msq_B)->default_value(1), "Square mass for Model-B field")
("mu", po::value<TFloat>(¶meters.mu)->default_value(1), "Mobility coefficient for n-Field")
;
desc.add(description_parameters);
po::variables_map vm;
po::store(po::parse_command_line(argv, argc, desc), vm);
po::notify(vm);
if( vm.count( "help" ) ) { std::cout << desc << std::endl << std::endl; exit(0); }
if(parameters.dynamicChangeMode > 2) {std::cerr << "Error: Invalid dynamicChangeMode" << std::endl; exit(1);}
parameters.volume = parameters.dimension == 3 ? POWER_THREE(parameters.sites) : POWER_TWO(parameters.sites);
parameters.standard_deviation_A = std::sqrt(2* parameters.gamma_A * parameters.temperature);
parameters.standard_deviation_B = std::sqrt(2* parameters.gamma_B * parameters.temperature * parameters.mu);
parameters.integrator_timeDelta_SQRT = std::sqrt(parameters.integrator_timeDelta);
return parameters;
}
/**
* Pretty output for console
* @param observables
*/
void printObservables(Observables observables) {
std::cout
<< "sigma: "
<< std::setfill(' ') << std::setw(8)
<< std::fixed << std::setprecision(5)
<< observables.sigma_avg
<< " sigma^2: "
<< std::setfill(' ') << std::setw(8)
<< std::fixed << std::setprecision(5)
<< observables.sigma_sq_avg
<< " n: "
<< std::setfill(' ') << std::setw(8)
<< std::fixed << std::setprecision(5)
<< observables.n_avg
<< " n^2: "
<< std::setfill(' ') << std::setw(8)
<< std::fixed << std::setprecision(5)
<< observables.n_sq_avg
<< std::endl;
}
/**
* Pretty output for console
* printed before start to show selected options
* @param parameters
*/
void printParameters(const Parameters& parameters) {
std::cout << "grid: ";
for(int k = 0; k < parameters.dimension-1; k++) {
std::cout << parameters.sites << "x";
}
std::cout << parameters.sites << " Simulations: " << parameters.number_of_simulations
<< " Seed: " << parameters.seed
<< std::endl;
std::cout << "ThermTime (1): " << parameters.thermalization_time_1
<< " ThermTime (2): " << parameters.thermalization_time_2
<< " ThermTime (3): " << parameters.thermalization_time_3
<< "\nMeasureTime: " << parameters.measure_time << " TimeStep: " << parameters.integrator_timeDelta
<< " fastTherm: ";
if(parameters.fastThermalization) {
std::cout << "On";
}else {
std:: cout << "Off";
};
std::cout << std::endl;
std::cout << "T=" << parameters.temperature << " C=" << parameters.C
<< " J=" << parameters.J << " symmetryBreakingJ=";
if(parameters.symmetryBreakingJ == 0) {
std::cout << "random";
}else {
std::cout << parameters.symmetryBreakingJ;
}
std::cout << std::endl;
}
/**
* Format time-millis
* @param milliSeconds
*/
void printRuntime(unsigned long long milliSeconds) {
if(milliSeconds < 10000) {
std::cout << "Runtime: " << milliSeconds << " ms" << std::endl;
}else if(milliSeconds < 1000 * 60) {
std::cout << "Runtime: " << milliSeconds/1000 << " seconds" << std::endl;
}else {
unsigned long long hr = milliSeconds / 3600000;
milliSeconds -= 3600000 * hr;
unsigned long long min = milliSeconds / 60000;
milliSeconds -= 60000 * min;
unsigned long long sec = milliSeconds / 1000;
std::cout << "Runtime: "
<< std::setfill('0') << std::setw(2) << hr
<< ":"
<< std::setfill('0') << std::setw(2) << min
<< ":"
<< std::setfill('0') << std::setw(2) << sec
<< std::endl;
}
}
void writeListToFileLine(TFloat parameter_T, TFloat parameter_C, const std::string& name, const std::vector<TFloat>& floatList) {
std::ofstream outfile;
outfile.open(name, std::ios_base::app); // append instead of overwrite
outfile << parameter_T << " " << parameter_C;
for(auto obs : floatList) {
outfile << " " << obs;
}
outfile << std::endl;
outfile.close();
}
void writeParametersToFile(std::basic_ofstream<char> &outfile, const Parameters ¶meters) {
//Write parameters
outfile << "\"N\": " << parameters.sites
<< ", \"T\": " << parameters.temperature
<< ", \"C\": " << parameters.C
<< ", \"D\": " << parameters.dimension
<< ", \"t\": " << parameters.integrator_timeDelta
<< ", \"msq_A\": " << parameters.msq_A
<< ", \"lambda_A\": " << parameters.lambda_A
<< ", \"gamma_A\": " << parameters.gamma_A
<< ", \"msq_B\": " << parameters.msq_B
<< ", \"gamma_B\": " << parameters.gamma_B
<< ", \"J\": " << parameters.J
<< ", \"mu\": " << parameters.mu
<< ", \"fastTherm\": " << (parameters.fastThermalization ? "true" : "false")
<< ", \"thermTime1\": " << parameters.thermalization_time_1
<< ", \"thermTime2\": " << parameters.thermalization_time_2
<< ", \"thermTime3\": " << parameters.thermalization_time_3
<< ", \"dynamicChangeMode\": " << (parameters.dynamicChangeMode == DYNAMIC_CHANGE_MODE_RE_INIT ?"\"ReInit\"" :
parameters.dynamicChangeMode == DYNAMIC_CHANGE_MODE_ZERO ? "\"Zero\"" : "\"Subtract\"")
<< ", \"measure_time\": " << parameters.measure_time
<< ", \"p\": " << (parameters.flag_printEveryStep ? "true" : "false")
<< ", \"seed\": " << parameters.seed
<< ", \"A\": " << parameters.number_of_simulations
<< ", \"S\": " << parameters.symmetryBreakingJ;
}
//void writeAllSteps(const Parameters& parameters, const std::string& name, const std::vector<std::vector<TFloat>>& stepList) {
void writeAllSteps(const Parameters& parameters, const std::map<std::string, std::vector<TFloat>>& stepMap) {
// writeListToFileLine(parameters.temperature, parameters.C, parameters.outFileName + "-allSteps_" + name + ".txt", floatList);
std::ofstream outfile;
outfile.open(parameters.outFileName + "-allSteps.yaml", std::ios_base::app); // append instead of overwrite
//Begin Json-like object
outfile << "{";
writeParametersToFile(outfile, parameters);
//Write observable arrays
for (const auto& entry: stepMap) {
outfile << ", \"" << entry.first << "\": [";
for(auto obs : (entry.second)) {outfile << obs << ", ";}
outfile << "]";
}
//Close Json-like object
outfile << "}," << std::endl;
outfile.close();
}
/**
* Write observables to files.
* The format is JSON-like.
* Although you should use a yaml-parser to load the file in other programs
* @param parameters
* @param observablesList
*/
void writeToDatabase(Parameters parameters, const std::vector<Observables>& observablesList) {
std::ofstream outfile;
outfile.open(parameters.outFileName + ".yaml", std::ios_base::app); // append instead of overwrite
//Begin Json-like object
outfile << "{";
parameters.flag_printEveryStep = false;
parameters.measure_time = 1;
writeParametersToFile(outfile, parameters);
//Write observable arrays
outfile << ",\"sigma\": [";
for(auto obs : observablesList) {outfile << obs.sigma_avg << ", ";}
outfile << "], \"n\": [";
for(auto obs : observablesList) {outfile << obs.n_avg << ", ";}
outfile << "], \"sigma_sq\": [";
for(auto obs : observablesList) {outfile << obs.sigma_sq_avg << ", ";}
outfile << "], \"n_sq\": [";
for(auto obs : observablesList) {outfile << obs.n_sq_avg << ", ";}
outfile << "],";
//Close Json-like object
outfile << "}," << std::endl;
outfile.close();
}