Improved parameter parsing from config file
This commit is contained in:
parent
cd282cc406
commit
bb9a343763
4 changed files with 127 additions and 25 deletions
97
io.cpp
97
io.cpp
|
|
@ -1,9 +1,12 @@
|
||||||
#include <unordered_map>
|
#include "phigrape.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <stdexcept>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
using Dictionary = std::unordered_map<std::string,std::string>;
|
||||||
|
|
||||||
std::string strip(const std::string str)
|
std::string strip(const std::string str)
|
||||||
{
|
{
|
||||||
std::string str_new = str;
|
std::string str_new = str;
|
||||||
|
|
@ -14,15 +17,11 @@ std::string strip(const std::string str)
|
||||||
return str_new;
|
return str_new;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
Dictionary read_config_file(const std::string file_name)
|
||||||
{
|
{
|
||||||
std::unordered_map<std::string,std::string> dictionary;
|
std::unordered_map<std::string,std::string> dictionary;
|
||||||
std::string file_name = "phigrape.conf";
|
|
||||||
std::ifstream file(file_name);
|
std::ifstream file(file_name);
|
||||||
if (!file.good()) {
|
if (!file.good()) throw std::runtime_error("File not found.");
|
||||||
std::cout << "Not found!" << std::endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
std::string str;
|
std::string str;
|
||||||
int line_number = 0;
|
int line_number = 0;
|
||||||
while (std::getline(file, str)) {
|
while (std::getline(file, str)) {
|
||||||
|
|
@ -32,19 +31,93 @@ int main()
|
||||||
str = strip(str);
|
str = strip(str);
|
||||||
if (str.size() == 0) continue;
|
if (str.size() == 0) continue;
|
||||||
pos = str.find_first_of("=");
|
pos = str.find_first_of("=");
|
||||||
if (pos == std::string::npos) {
|
if (pos == std::string::npos) throw std::runtime_error("Error: expected a key-value pair in line " + std::to_string(line_number) + " of file " + file_name);
|
||||||
std::cerr << "Error: expected a key-value pair in line " << line_number << " of file " << file_name << std::endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
std::string key = strip(str.substr(0, pos));
|
std::string key = strip(str.substr(0, pos));
|
||||||
pos = str.find_first_not_of(" \t", pos+1);
|
pos = str.find_first_not_of(" \t", pos+1);
|
||||||
std::string val = strip(str.substr(pos, str.size()));
|
std::string val = strip(str.substr(pos, str.size()));
|
||||||
dictionary[key] = val;
|
dictionary[key] = val;
|
||||||
}
|
}
|
||||||
|
return dictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T> T string_cast(const std::string str);
|
||||||
|
|
||||||
|
template<> std::string string_cast(const std::string str)
|
||||||
|
{
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> double string_cast(const std::string str)
|
||||||
|
{
|
||||||
|
size_t idx;
|
||||||
|
auto value = std::stod(str, &idx);
|
||||||
|
if (idx == str.size()) return value;
|
||||||
|
else throw std::runtime_error("Cannot convert \"" + str + "\" into a double");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> int string_cast(const std::string str)
|
||||||
|
{
|
||||||
|
size_t idx;
|
||||||
|
auto value = std::stoi(str, &idx);
|
||||||
|
if (idx == str.size()) return value;
|
||||||
|
else throw std::runtime_error("Cannot convert \"" + str + "\" into an int");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> bool string_cast(const std::string str)
|
||||||
|
{
|
||||||
|
if ((str=="true") || (str=="True") || (str=="yes") || (str=="Yes") || (str=="1")) return true;
|
||||||
|
else if ((str=="false") || (str=="False") || (str=="no") || (str=="No") || (str=="0")) return false;
|
||||||
|
throw std::runtime_error("Cannot convert \"" + str + "\" into a bool");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// For mandatory parameters
|
||||||
|
template<typename T>
|
||||||
|
T get_parameter(Dictionary dictionary, std::string name)
|
||||||
|
{
|
||||||
|
auto item = dictionary.find(name);
|
||||||
|
if (item==dictionary.end()) throw std::runtime_error("Mandatory parameter " + name + " must be defined");
|
||||||
|
else return string_cast<T>((*item).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For optional parameters
|
||||||
|
template<typename T>
|
||||||
|
T get_parameter(Dictionary dictionary, std::string name, T default_value)
|
||||||
|
{
|
||||||
|
auto item = dictionary.find(name);
|
||||||
|
if (item==dictionary.end()) return default_value;
|
||||||
|
else return string_cast<T>((*item).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
auto dictionary = read_config_file("phigrape.conf");
|
||||||
|
|
||||||
for (auto key_value : dictionary) {
|
for (auto key_value : dictionary) {
|
||||||
auto key = key_value.first;
|
auto key = key_value.first;
|
||||||
auto value = key_value.second;
|
auto value = key_value.second;
|
||||||
printf("dictionary[\"%s\"] = \"%s\"\n", key.c_str(), value.c_str());
|
printf("dictionary[\"%s\"] = \"%s\"\n", key.c_str(), value.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Parameters parameters;
|
||||||
|
|
||||||
|
// TODO check if dt_disk and dt_contr are powers of two
|
||||||
|
parameters.dt_bh = get_parameter<double>(dictionary, "eps");
|
||||||
|
parameters.t_end = get_parameter<double>(dictionary, "t_end");
|
||||||
|
parameters.dt_disk = get_parameter<double>(dictionary, "dt_disk");
|
||||||
|
parameters.dt_contr = get_parameter<double>(dictionary, "dt_contr");
|
||||||
|
parameters.dt_bh = get_parameter<double>(dictionary, "dt_bh", parameters.dt_contr);
|
||||||
|
parameters.eta = get_parameter<double>(dictionary, "eta");
|
||||||
|
parameters.input_file_name = get_parameter<std::string>(dictionary, "dt_bh", "data.con");
|
||||||
|
parameters.dt_min_warning = get_parameter<bool>(dictionary, "dt_min_warning", false);
|
||||||
|
parameters.live_smbh_count = get_parameter<int>(dictionary, "live_smbh_count", 0);
|
||||||
|
parameters.live_smbh_custom_eps = get_parameter<double>(dictionary, "live_smbh_custom_eps", -1);
|
||||||
|
parameters.live_smbh_output = get_parameter<bool>(dictionary, "live_smbh_output", false);
|
||||||
|
parameters.live_smbh_neighbor_output = get_parameter<bool>(dictionary, "live_smbh_neighbor_output", false);
|
||||||
|
parameters.live_smbh_neighbor_number = get_parameter<int>(dictionary, "live_smbh_neighbor_number", 10);
|
||||||
|
parameters.binary_smbh_pn = get_parameter<bool>(dictionary, "binary_smbh_pn", false);
|
||||||
|
parameters.binary_smbh_influence_sphere_output = get_parameter<bool>(dictionary, "binary_smbh_influence_sphere_output", false);
|
||||||
|
parameters.binary_smbh_influence_radius_factor = get_parameter<double>(dictionary, "binary_smbh_influence_radius_factor", 10.);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
# GENERAL PARAMETERS #
|
# GENERAL PARAMETERS #
|
||||||
######################
|
######################
|
||||||
|
|
||||||
|
|
||||||
# Plummer softening parameter (can be even 0)
|
# Plummer softening parameter (can be even 0)
|
||||||
eps = 1E-4
|
eps = 1E-4
|
||||||
|
|
||||||
|
|
@ -27,7 +26,7 @@ inp_data = data.con
|
||||||
|
|
||||||
##### NOT IMPLEMENTED #######################
|
##### NOT IMPLEMENTED #######################
|
||||||
output_format = HDF5
|
output_format = HDF5
|
||||||
dt_min_warning = true
|
dt_min_warning = false
|
||||||
#############################################
|
#############################################
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
|
|
|
||||||
31
phigrape.cpp
31
phigrape.cpp
|
|
@ -53,18 +53,27 @@ Coded by : Peter Berczik
|
||||||
Version number : 19.04
|
Version number : 19.04
|
||||||
Last redaction : 2019.04.16 12:55
|
Last redaction : 2019.04.16 12:55
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
#include "phigrape.h"
|
||||||
|
Parameters parameters;
|
||||||
|
|
||||||
struct Parameters {
|
// struct Parameters {
|
||||||
int live_smbh_count = 2; // ADD_BH1 or ADD_BH2
|
// double eps = 1E-4;
|
||||||
double live_smbh_custom_eps = 0; // ADD_N_BH
|
// double t_end = 1;
|
||||||
bool live_smbh_output = true; // BH_OUT
|
// double dt_disk = 0.125;
|
||||||
bool live_smbh_neighbor_output = true; // BH_OUT_NB // NOTE needs `live_smbh_neighbor_number`
|
// double dt_contr = 0.125;
|
||||||
bool binary_smbh_influence_sphere_output = true; // BBH_INF // NOTE needs `binary_smbh_influence_radius_factor`
|
// double dt_bh = 0.125;
|
||||||
double binary_smbh_influence_radius_factor = 3.162277660168379497918067e+03; // R_INF
|
// double eta = 0.01;
|
||||||
int live_smbh_neighbor_number = 10; // TODO make sure it's smaller than N? or just warn if it's not
|
// std::string input_file_name = "data.con";
|
||||||
bool binary_smbh_pn = true; // ADD_PN_BH
|
// bool dt_min_warning = true; // DT_MIN_WARNING
|
||||||
bool dt_min_warning = true; // DT_MIN_WARNING
|
// int live_smbh_count = 2; // ADD_BH1 or ADD_BH2
|
||||||
} parameters;
|
// double live_smbh_custom_eps = 0; // ADD_N_BH
|
||||||
|
// bool live_smbh_output = true; // BH_OUT
|
||||||
|
// bool live_smbh_neighbor_output = true; // BH_OUT_NB // NOTE needs `live_smbh_neighbor_number`
|
||||||
|
// int live_smbh_neighbor_number = 10; // TODO make sure it's smaller than N? or just warn if it's not
|
||||||
|
// bool binary_smbh_pn = true; // ADD_PN_BH
|
||||||
|
// bool binary_smbh_influence_sphere_output = true; // BBH_INF // NOTE needs `binary_smbh_influence_radius_factor`
|
||||||
|
// double binary_smbh_influence_radius_factor = 3.162277660168379497918067e+03; // R_INF
|
||||||
|
// } parameters;
|
||||||
|
|
||||||
//#define NORM // Physical normalization
|
//#define NORM // Physical normalization
|
||||||
|
|
||||||
|
|
|
||||||
21
phigrape.h
Normal file
21
phigrape.h
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
struct Parameters {
|
||||||
|
double eps;
|
||||||
|
double t_end;
|
||||||
|
double dt_disk;
|
||||||
|
double dt_contr;
|
||||||
|
double dt_bh;
|
||||||
|
double eta;
|
||||||
|
std::string input_file_name;
|
||||||
|
bool dt_min_warning;
|
||||||
|
int live_smbh_count;
|
||||||
|
double live_smbh_custom_eps;
|
||||||
|
bool live_smbh_output;
|
||||||
|
bool live_smbh_neighbor_output;
|
||||||
|
int live_smbh_neighbor_number;
|
||||||
|
bool binary_smbh_pn;
|
||||||
|
bool binary_smbh_influence_sphere_output;
|
||||||
|
double binary_smbh_influence_radius_factor;
|
||||||
|
};
|
||||||
Loading…
Add table
Add a link
Reference in a new issue