2024-08-16 17:55:27 +00:00
|
|
|
//
|
|
|
|
// Created by dominik on 8/14/24.
|
|
|
|
//
|
|
|
|
#include "io.h"
|
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
#include <fstream>
|
|
|
|
#include <iostream>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <vector>
|
|
|
|
#include <iomanip>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <map>
|
|
|
|
#include <string>
|
2024-08-18 11:21:27 +00:00
|
|
|
#include <filesystem>
|
2024-08-16 17:55:27 +00:00
|
|
|
|
|
|
|
|
2024-08-20 15:51:49 +00:00
|
|
|
|
|
|
|
Arguments parse_args(const int argc, char **argv) {
|
2024-11-10 14:52:54 +00:00
|
|
|
if (argc < 3) {
|
2024-08-20 15:51:49 +00:00
|
|
|
throw std::runtime_error("Not enough arguments: missing parameter file");
|
|
|
|
}
|
|
|
|
|
|
|
|
Arguments args;
|
|
|
|
|
|
|
|
for (int i=1; i<argc; i++) {
|
|
|
|
if (std::string arg = argv[i]; arg[0] == '-') {
|
2024-11-09 16:59:37 +00:00
|
|
|
if (arg == "--ste") {
|
2024-08-20 15:51:49 +00:00
|
|
|
args.ste = true;
|
2024-11-09 16:59:37 +00:00
|
|
|
} else if (arg == "--spectrum") {
|
2024-08-20 15:51:49 +00:00
|
|
|
args.spectrum = true;
|
|
|
|
} else {
|
|
|
|
throw std::runtime_error("Unrecognized option: " + arg);
|
|
|
|
}
|
|
|
|
} else if (args.parameter_file.empty()) {
|
|
|
|
args.parameter_file = arg;
|
2024-11-09 16:59:37 +00:00
|
|
|
} else if (args.motion_type.empty()) {
|
|
|
|
args.motion_type = arg;
|
2024-08-20 15:51:49 +00:00
|
|
|
} else {
|
2024-11-09 16:59:37 +00:00
|
|
|
throw std::invalid_argument("Too many options for parameter file");
|
2024-08-20 15:51:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (args.parameter_file.empty()) {
|
2024-11-09 16:59:37 +00:00
|
|
|
throw std::invalid_argument("Missing parameter file");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (args.motion_type.empty()) {
|
|
|
|
throw std::invalid_argument("Missing motion model");
|
2024-08-20 15:51:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::unordered_map<std::string, double> read_parameter(const std::filesystem::path& infile) {
|
2024-08-18 11:21:27 +00:00
|
|
|
if (!std::filesystem::exists(infile)) {
|
|
|
|
std::cerr << "File " << infile << " does not exist" << std::endl;
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2024-08-16 17:55:27 +00:00
|
|
|
std::ifstream instream(infile);
|
|
|
|
|
|
|
|
std::unordered_map<std::string, double> parameter;
|
|
|
|
|
|
|
|
std::string line;
|
|
|
|
std::string delim = "=";
|
|
|
|
std::string key;
|
|
|
|
std::string value;
|
|
|
|
size_t delim_pos;
|
|
|
|
|
|
|
|
while (std::getline(instream, line)) {
|
2024-11-10 14:52:54 +00:00
|
|
|
// skip comment lines starting with #, and empty lines
|
2024-08-20 15:51:49 +00:00
|
|
|
if (line[0] == '#' || line.length() == 1) continue;
|
|
|
|
|
2024-11-10 14:52:54 +00:00
|
|
|
// strip spaces from line to have always key=value
|
2024-08-16 17:55:27 +00:00
|
|
|
line.erase(std::remove(line.begin(), line.end(), ' '), line.end());
|
2024-11-10 14:52:54 +00:00
|
|
|
|
|
|
|
// split at '=' character and add to map
|
2024-08-16 17:55:27 +00:00
|
|
|
delim_pos = line.find('=');
|
|
|
|
key = line.substr(0, delim_pos);
|
|
|
|
value = line.substr(delim_pos+1);
|
|
|
|
parameter[key] = std::stod(value);
|
|
|
|
}
|
|
|
|
|
2024-11-10 14:52:54 +00:00
|
|
|
// print result
|
2024-08-16 17:55:27 +00:00
|
|
|
std::cout << "Found parameter\n";
|
|
|
|
for (const auto& [key, value]: parameter) {
|
|
|
|
std::cout << " " << key << ": " << std::to_string(value) << "\n";
|
|
|
|
}
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
return parameter;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void fid_write_out(const std::string& filename, const std::vector<double>& x, const std::vector<double>& y, const double tau, const double t_evo) {
|
|
|
|
auto size = x.size();
|
|
|
|
|
|
|
|
std::ostringstream sfile;
|
|
|
|
sfile << filename << "_";
|
|
|
|
sfile << std::setprecision(6) << std::scientific;
|
|
|
|
sfile << "tau=" << tau << "_tevo=" << t_evo << ".dat";
|
|
|
|
{
|
|
|
|
std::string outfile = sfile.str();
|
|
|
|
std::ofstream fid_file(outfile, std::ios::out);
|
|
|
|
for (unsigned int i = 0; i < size; i++) {
|
|
|
|
fid_file << x[i] << "\t" << y[i] << "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void fid_write_out(const std::string& filename, const std::vector<double>& x, const std::map<double, std::vector<double>>& y, const double tau) {
|
|
|
|
auto size = x.size();
|
|
|
|
|
|
|
|
std::ostringstream sfile;
|
|
|
|
sfile << filename << "_";
|
|
|
|
sfile << std::setprecision(6) << std::scientific;
|
|
|
|
sfile << "tau=" << tau << ".dat";
|
|
|
|
{
|
|
|
|
std::string outfile = sfile.str();
|
|
|
|
std::ofstream fid_file(outfile, std::ios::out);
|
|
|
|
fid_file << "#";
|
|
|
|
for (const auto& [t_echo_j, _] : y) {
|
|
|
|
fid_file << t_echo_j << "\t";
|
|
|
|
}
|
|
|
|
fid_file << std::endl;
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < size; i++) {
|
|
|
|
fid_file << x[i];
|
|
|
|
for (const auto& [_, fid_j] : y) {
|
|
|
|
fid_file << "\t" << fid_j[i];
|
|
|
|
}
|
|
|
|
fid_file << "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|