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;
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") {
501 "The value for key \"" + std::string(
key_) +
502 "\" should be \"All\", \"Elastic\", \"NN_to_NR\", \"NN_to_DR\"," 503 "\"KN_to_KN\", \"KN_to_KDelta\" or \"strangeness_exchange\"," 504 " or any combination of these.");
517 operator std::set<ThermodynamicQuantity>()
const {
518 const std::vector<std::string> v =
operator std::vector<std::string>();
519 std::set<ThermodynamicQuantity> s;
520 for (
const auto &x : v) {
521 if (x ==
"rho_eckart") {
523 }
else if (x ==
"tmn") {
525 }
else if (x ==
"tmn_landau") {
527 }
else if (x ==
"landau_velocity") {
531 "The value for key \"" + std::string(
key_) +
532 "\" should be \"rho_eckart\", \"tmn\"" 533 ", \"tmn_landau\" or \"landau_velocity\".");
547 const std::string s =
operator std::string();
548 if (s ==
"center of velocity") {
551 if (s ==
"center of mass") {
554 if (s ==
"fixed target") {
558 "The value for key \"" + std::string(
key_) +
559 "\" should be \"center of velocity\" or \"center of mass\" " 560 "or \"fixed target\".");
571 const std::string s =
operator std::string();
582 "The value for key \"" + std::string(
key_) +
583 "\" should be \"off\" or \"on\" or \"frozen\".");
594 const std::string s =
operator std::string();
601 if (s ==
"baryonic isospin") {
612 "\" should be \"hadron\" or \"baryon\" " 613 "or \"baryonic isospin\" or \"pion\" " 625 const std::string s =
operator std::string();
626 if (s ==
"NoExpansion") {
629 if (s ==
"MasslessFRW") {
632 if (s ==
"MassiveFRW") {
635 if (s ==
"Exponential") {
639 "The value for key \"" + std::string(
key_) +
640 "\" should be \"NoExpansion\", \"MasslessFRW\"," +
641 "\"MassiveFRW\" or \"Exponential\".");
652 const std::string s =
operator std::string();
661 "\" should be \"None\" or \"Fixed\".");
672 const std::string s =
operator std::string();
673 if (s ==
"thermal momenta") {
676 if (s ==
"peaked momenta") {
680 "The value for key \"" + std::string(
key_) +
681 "\" should be \"thermal momenta\" or \"peaked momenta\".");
692 const std::string s =
operator std::string();
693 if (s ==
"thermal momenta") {
705 if (s ==
"IC_Massive") {
709 "The value for key \"" + std::string(
key_) +
710 "\" should be \"thermal momenta\", \"IC_ES\", " +
711 "\"IC_1M\", \"IC_2M\" or" +
"\"IC_Massive\".");
722 const std::string s =
operator std::string();
723 if (s ==
"no annihilation") {
726 if (s ==
"resonances") {
729 if (s ==
"strings") {
733 "The value for key \"" + std::string(
key_) +
"\" should be " +
734 "\"no annihilation\", \"detailed balance\", or \"strings\".");
745 const std::string s =
operator std::string();
746 if (s ==
"quadratic") {
752 if (s ==
"uniform") {
756 "The value for key \"" + std::string(
key_) +
757 "\" should be \"quadratic\", \"uniform\" or \"custom\".");
768 const std::string s =
operator std::string();
769 if (s ==
"mode sampling") {
772 if (s ==
"biased BF") {
775 if (s ==
"unbiased BF") {
779 "The value for key \"" + std::string(
key_) +
780 "\" should be \"mode sampling\", \"biased BF\" or \"unbiased BF\".");
798 explicit Configuration(
const bf::path &path,
const bf::path &filename);
858 Value
take(std::initializer_list<const char *> keys);
861 template <
typename T>
862 T
take(std::initializer_list<const char *> keys, T default_value) {
866 return default_value;
883 Value
read(std::initializer_list<const char *> keys)
const;
886 template <
typename T>
887 T
read(std::initializer_list<const char *> keys, T default_value) {
891 return default_value;
915 template <
typename T>
927 template <
typename T>
938 std::initializer_list<const char *> keys)
const;
943 bool has_value(std::initializer_list<const char *> keys)
const;
973 #endif // SRC_INCLUDE_CONFIGURATION_H_ Configuration(const YAML::Node &node)
Creates a subobject that has its root node at the given node.
Value read(std::initializer_list< const char *> keys) const
Additional interface for SMASH to read configuration values without removing them.
std::string unused_values_report() const
Returns a string listing the key/value pairs that have not been taken yet.
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. ...
const char *const key_
The key to be interpreted.
Configuration(const bf::path &path)
Reads config.yaml from the specified path.
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)
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.
std::vector< std::string > list_upmost_nodes()
Lists all YAML::Nodes from the configuration setup.
bool has_value(std::initializer_list< const char *> keys) const
Returns whether there is a non-empty value behind the requested keys.
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.
elastic scattering: particles remain the same, only momenta change
void merge_yaml(const std::string &yaml)
Merge the configuration in yaml into the existing tree.
Configuration & operator=(const Configuration &)=default
If you want to copy this you're doing it wrong.
CalculationFrame
The calculation frame.
TimeStepMode
The time step mode.
Sample from custom, user-defined distribution.
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.
void remove_all_but(const std::string &key)
Removes all entries in the map except for key.
std::bitset< 6 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
T read(std::initializer_list< const char *> keys, T default_value)
Value & operator=(const Value &)=delete
If you want to copy this you're doing it wrong.
Use fermi motion without potentials.
Use string fragmentation.
Use intermediate Resonances.
ExpansionMode
Defines properties of expansion for the metric (e.g.
bool has_value_including_empty(std::initializer_list< const char *> keys) const
Returns if there is a (maybe empty) value behind the requested keys.
T take(std::initializer_list< const char *> keys, T default_value)
Sampling
Possible methods of impact parameter sampling.
Thrown when the types in the config file and C++ don't match.
Value take(std::initializer_list< const char *> keys)
The default interface for SMASH to read configuration values.
T convert_for(const T &) const
Convert the value to the type of the supplied argument.
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.
std::string to_string() const
Returns a YAML string of the current tree.
Use fermi motion in combination with potentials.