10 #ifndef SRC_INCLUDE_CONFIGURATION_H_ 11 #define SRC_INCLUDE_CONFIGURATION_H_ 20 #include <yaml-cpp/yaml.h> 42 static Node
encode(
const T &x) {
return Node{
static_cast<std::string
>(x)}; }
52 static bool decode(
const Node &node, T &x) {
53 if (!node.IsScalar()) {
56 x =
static_cast<T
>(node.Scalar());
320 using std::runtime_error::runtime_error;
327 using std::runtime_error::runtime_error;
335 using std::runtime_error::runtime_error;
359 Value(
const YAML::Node &
n,
const char *key) : node_(n), key_(key) {
360 if (!(n.IsScalar() || n.IsSequence() || n.IsMap())) {
361 std::stringstream err;
362 err <<
"Configuration value for \"" << key
363 <<
"\" is missing or invalid";
364 throw std::runtime_error(err.str());
400 template <
typename T>
413 template <
typename T>
416 return node_.as<T>();
417 }
catch (YAML::TypedBadConversion<T> &e) {
419 "The value for key \"" + std::string(key_) +
420 "\" cannot be converted to the requested type.");
429 template <
typename T>
430 operator std::vector<T>()
const {
432 return node_.as<std::vector<T>>();
433 }
catch (YAML::TypedBadConversion<T> &e) {
435 "One of the values in the sequence for key \"" + std::string(key_) +
436 "\" failed to convert to the requested type. E.g. [1 2] is a " 437 "sequence of one string \"1 2\" and [1, 2] is a sequence of two " 438 "integers. Often there is just a comma missing in the config " 440 }
catch (YAML::TypedBadConversion<std::vector<T>> &e) {
442 "The value for key \"" + std::string(key_) +
443 "\" cannot be converted to the requested type. A sequence was " 444 "expected but apparently not found.");
455 template <
typename T,
size_t N>
456 operator std::array<T, N>()
const {
457 const std::vector<T> vec =
operator std::vector<T>();
458 const size_t n_read = vec.size();
462 std::string(key_) +
"\". Expected " +
466 std::to_string(n_read) +
".");
468 std::array<T, N> arr;
469 std::copy_n(vec.begin(), N, arr.begin());
481 const std::vector<std::string> v =
operator std::vector<std::string>();
483 for (
const auto &x : v) {
487 }
else if (x ==
"Elastic") {
489 }
else if (x ==
"NN_to_NR") {
491 }
else if (x ==
"NN_to_DR") {
493 }
else if (x ==
"KN_to_KN") {
495 }
else if (x ==
"KN_to_KDelta") {
497 }
else if (x ==
"Strangeness_exchange") {
499 }
else if (x ==
"NNbar") {
501 }
else if (x ==
"PiDeuteron_to_NN") {
503 }
else if (x ==
"PiDeuteron_to_pidprime") {
505 }
else if (x ==
"NDeuteron_to_Ndprime") {
509 "The value for key \"" + std::string(key_) +
510 "\" should be \"All\", \"Elastic\", \"NN_to_NR\", \"NN_to_DR\"," 511 "\"KN_to_KN\", \"KN_to_KDelta\", \"PiDeuteron_to_NN\", " 512 "\"PiDeuteron_to_pidprime\", \"NDeuteron_to_Ndprime\", " 513 "\"Strangeness_exchange\" or " 514 "\"NNbar\", or any combination of these.");
527 operator std::set<ThermodynamicQuantity>()
const {
528 const std::vector<std::string> v =
operator std::vector<std::string>();
529 std::set<ThermodynamicQuantity> s;
530 for (
const auto &x : v) {
531 if (x ==
"rho_eckart") {
533 }
else if (x ==
"tmn") {
535 }
else if (x ==
"tmn_landau") {
537 }
else if (x ==
"landau_velocity") {
539 }
else if (x ==
"j_QBS") {
543 "The value for key \"" + std::string(key_) +
544 "\" should be \"rho_eckart\", \"tmn\"" 545 ", \"tmn_landau\", \"landau_velocity\" or \"j_QBS\".");
559 const std::string s =
operator std::string();
560 if (s ==
"center of velocity") {
563 if (s ==
"center of mass") {
566 if (s ==
"fixed target") {
570 "The value for key \"" + std::string(key_) +
571 "\" should be \"center of velocity\" or \"center of mass\" " 572 "or \"fixed target\".");
583 const std::string s =
operator std::string();
594 "The value for key \"" + std::string(key_) +
595 "\" should be \"off\" or \"on\" or \"frozen\".");
606 const std::string s =
operator std::string();
608 return DensityType::Hadron;
611 return DensityType::Baryon;
613 if (s ==
"baryonic isospin") {
614 return DensityType::BaryonicIsospin;
617 return DensityType::Pion;
619 if (s ==
"total isospin") {
620 return DensityType::Isospin3_tot;
623 return DensityType::None;
627 "\" should be \"hadron\" or \"baryon\" " 628 "or \"baryonic isospin\" or \"pion\" " 640 const std::string s =
operator std::string();
641 if (s ==
"NoExpansion") {
644 if (s ==
"MasslessFRW") {
647 if (s ==
"MassiveFRW") {
650 if (s ==
"Exponential") {
654 "The value for key \"" + std::string(key_) +
655 "\" should be \"NoExpansion\", \"MasslessFRW\"," +
656 "\"MassiveFRW\" or \"Exponential\".");
667 const std::string s =
operator std::string();
676 "\" should be \"None\" or \"Fixed\".");
687 const std::string s =
operator std::string();
688 if (s ==
"thermal momenta") {
691 if (s ==
"peaked momenta") {
695 "The value for key \"" + std::string(key_) +
696 "\" should be \"thermal momenta\" or \"peaked momenta\".");
707 const std::string s =
operator std::string();
708 if (s ==
"thermal momenta") {
720 if (s ==
"IC_Massive") {
724 "The value for key \"" + std::string(key_) +
725 "\" should be \"thermal momenta\", \"IC_ES\", " +
726 "\"IC_1M\", \"IC_2M\" or" +
"\"IC_Massive\".");
737 const std::string s =
operator std::string();
738 if (s ==
"no annihilation") {
741 if (s ==
"resonances") {
744 if (s ==
"strings") {
748 "The value for key \"" + std::string(key_) +
"\" should be " +
749 "\"no annihilation\", \"detailed balance\", or \"strings\".");
760 const std::string s =
operator std::string();
761 if (s ==
"quadratic") {
767 if (s ==
"uniform") {
771 "The value for key \"" + std::string(key_) +
772 "\" should be \"quadratic\", \"uniform\" or \"custom\".");
783 const std::string s =
operator std::string();
784 if (s ==
"mode sampling") {
787 if (s ==
"biased BF") {
790 if (s ==
"unbiased BF") {
794 "The value for key \"" + std::string(key_) +
795 "\" should be \"mode sampling\", \"biased BF\" or \"unbiased BF\".");
806 const std::string s =
operator std::string();
807 if (s ==
"Geometric") {
810 if (s ==
"Stochastic") {
814 std::string(key_) +
"\" should be " +
815 "\"Geometric\" or \"Stochastic\".");
833 explicit Configuration(
const bf::path &path,
const bf::path &filename);
867 void merge_yaml(
const std::string &yaml);
870 std::vector<std::string> list_upmost_nodes();
893 Value take(std::initializer_list<const char *> keys);
896 template <
typename T>
897 T
take(std::initializer_list<const char *> keys, T default_value) {
898 if (has_value(keys)) {
901 return default_value;
918 Value read(std::initializer_list<const char *> keys)
const;
921 template <
typename T>
922 T
read(std::initializer_list<const char *> keys, T default_value) {
923 if (has_value(keys)) {
926 return default_value;
934 void remove_all_but(
const std::string &key);
950 template <
typename T>
952 return root_node_[std::forward<T>(key)];
962 template <
typename T>
964 root_node_ = std::forward<T>(value);
972 bool has_value_including_empty(
973 std::initializer_list<const char *> keys)
const;
978 bool has_value(std::initializer_list<const char *> keys)
const;
983 std::string unused_values_report()
const;
990 std::string to_string()
const;
1000 : root_node_(node) {}
1008 #endif // SRC_INCLUDE_CONFIGURATION_H_ Configuration(const YAML::Node &node)
Creates a subobject that has its root node at the given node.
Thrown if the file does not exist.
ThermalizationAlgorithm
Defines the algorithm used for the forced thermalization.
FermiMotion
Option to use Fermi Motion.
Return type of Configuration::take that automatically determines the target type. ...
T convert_for(const T &) const
Convert the value to the type of the supplied argument.
(Default) geometric criterion.
const char *const key_
The key to be interpreted.
BoxInitialCondition
Initial condition for a particle in a box.
Value(const YAML::Node &n, const char *key)
Constructs the Value wrapper from a YAML::Node.
const YAML::Node node_
a YAML leaf node
Configuration(const char *yaml)
T take(std::initializer_list< const char * > keys, T default_value)
Interface to the SMASH configuration files.
Thrown for YAML parse errors.
NNbarTreatment
Treatment of N Nbar Annihilation.
Convert from YAML::Node to SMASH-readable (C++) format and vice versa.
static bool decode(const Node &node, T &x)
Deserialization: Converts a YAML::Node to any SMASH-readable data type and returns whether or not thi...
Sample from uniform distribution.
SphereInitialCondition
Initial condition for a particle in a sphere.
CollisionCriterion
Criteria used to check collisions.
CalculationFrame
The calculation frame.
TimeStepMode
The time step mode.
Sample from custom, user-defined distribution.
Don't use time steps; propagate from action to action.
Configuration operator[](T &&key)
Access to the YAML::Node behind the requested keys.
Sample from areal / quadratic distribution.
Configuration & operator=(T &&value)
Assignment overwrites the value of the current YAML node.
Don't use fermi motion.
std::bitset< 10 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
Use fermi motion without potentials.
Use string fragmentation.
Use intermediate Resonances.
ExpansionMode
Defines properties of expansion for the metric (e.g.
Sampling
Possible methods of impact parameter sampling.
Thrown when the types in the config file and C++ don't match.
YAML::Node root_node_
the general_config.yaml contents - fully parsed
DensityType
Allows to choose which kind of density to calculate.
static Node encode(const T &x)
Serialization: Converts x (of any type) to a YAML::Node.
T read(std::initializer_list< const char * > keys, T default_value)
Use fermi motion in combination with potentials.