diff --git a/src/kinetics/arrhenius.hpp b/src/kinetics/arrhenius.hpp index 9a338c3..253f20a 100644 --- a/src/kinetics/arrhenius.hpp +++ b/src/kinetics/arrhenius.hpp @@ -35,6 +35,9 @@ struct ArrheniusOptionsImpl { virtual std::string name() const { return "arrhenius"; } virtual ~ArrheniusOptionsImpl() = default; + std::shared_ptr clone() const { + return std::make_shared(*this); + } void report(std::ostream& os) const { os << "* reactions = " << fmt::format("{}", reactions()) << "\n" << "* Tref = " << Tref() << " K\n" diff --git a/src/kinetics/coagulation.hpp b/src/kinetics/coagulation.hpp index ee90021..57691e3 100644 --- a/src/kinetics/coagulation.hpp +++ b/src/kinetics/coagulation.hpp @@ -27,6 +27,9 @@ struct CoagulationOptionsImpl final : public ArrheniusOptionsImpl { CoagulationOptionsImpl(const ArrheniusOptionsImpl& arrhenius) : ArrheniusOptionsImpl(arrhenius) {} + std::shared_ptr clone() const { + return std::make_shared(*this); + } void report(std::ostream& os) const { ArrheniusOptionsImpl::report(os); } }; using CoagulationOptions = std::shared_ptr; diff --git a/src/kinetics/evaporation.hpp b/src/kinetics/evaporation.hpp index 47be363..3fe347c 100644 --- a/src/kinetics/evaporation.hpp +++ b/src/kinetics/evaporation.hpp @@ -37,6 +37,9 @@ struct EvaporationOptionsImpl final : public NucleationOptionsImpl { EvaporationOptionsImpl(const NucleationOptionsImpl& nucleation) : NucleationOptionsImpl(nucleation) {} + std::shared_ptr clone() const { + return std::make_shared(*this); + } void report(std::ostream& os) const { NucleationOptionsImpl::report(os); os << "* Tref = " << Tref() << " K\n" diff --git a/src/kinetics/kinetics.hpp b/src/kinetics/kinetics.hpp index f0fa3fa..73595de 100644 --- a/src/kinetics/kinetics.hpp +++ b/src/kinetics/kinetics.hpp @@ -33,6 +33,13 @@ struct KineticsOptionsImpl final : public SpeciesThermoImpl { static std::shared_ptr from_yaml( YAML::Node const& config, bool verbose = false); + std::shared_ptr clone() const { + auto op = std::make_shared(*this); + if (arrhenius()) op->arrhenius() = arrhenius()->clone(); + if (coagulation()) op->coagulation() = coagulation()->clone(); + if (evaporation()) op->evaporation() = evaporation()->clone(); + return op; + } void report(std::ostream& os) const { os << "-- kinetics options --\n"; os << "* Tref = " << Tref() << " K\n" diff --git a/src/kinetics/rate_constant.hpp b/src/kinetics/rate_constant.hpp index adc4408..ccea843 100644 --- a/src/kinetics/rate_constant.hpp +++ b/src/kinetics/rate_constant.hpp @@ -19,6 +19,10 @@ struct RateConstantOptionsImpl { static std::shared_ptr create() { return std::make_shared(); } + std::shared_ptr clone() const { + return std::make_shared(*this); + } + ADD_ARG(std::vector, types) = {}; ADD_ARG(std::string, reaction_file) = ""; }; diff --git a/src/thermo/nucleation.hpp b/src/thermo/nucleation.hpp index c0fbf99..3709212 100644 --- a/src/thermo/nucleation.hpp +++ b/src/thermo/nucleation.hpp @@ -31,6 +31,9 @@ struct NucleationOptionsImpl { virtual std::string name() const { return "nucleation"; } virtual ~NucleationOptionsImpl() = default; + std::shared_ptr clone() const { + return std::make_shared(*this); + } void report(std::ostream& os) const { os << "* reactions = " << fmt::format("{}", reactions()) << "\n" << "* minT = " << fmt::format("{}", minT()) << " K\n" diff --git a/src/thermo/thermo.hpp b/src/thermo/thermo.hpp index 7edf731..271855f 100644 --- a/src/thermo/thermo.hpp +++ b/src/thermo/thermo.hpp @@ -55,6 +55,13 @@ struct ThermoOptionsImpl final : public SpeciesThermoImpl { static std::shared_ptr from_yaml(YAML::Node const& config, bool verbose = false); + std::shared_ptr clone() const { + auto op = std::make_shared(*this); + if (nucleation() != nullptr) { + op->nucleation() = nucleation()->clone(); + } + return op; + } void report(std::ostream& os) const { os << "-- thermodynamics options --\n"; os << "* Tref = " << Tref() << " K\n"