diff --git a/include/cantera/kinetics/KineticsFactory.h b/include/cantera/kinetics/KineticsFactory.h index 2a70a570c..3ffb3befb 100644 --- a/include/cantera/kinetics/KineticsFactory.h +++ b/include/cantera/kinetics/KineticsFactory.h @@ -59,7 +59,14 @@ shared_ptr newKinetics(const string& model); * @param rootNode The root node of the file containing the phase definition, * which will be treated as the default source for reactions */ -shared_ptr newKinetics(const std::vector& phases, +shared_ptr newKinetics(const vector>& phases, + const AnyMap& phaseNode, + const AnyMap& rootNode=AnyMap()); + +//! @copydoc KineticsFactory::newKinetics(const vector>&, const AnyMap&, const AnyMap&) +//! @deprecated To be removed after Cantera 3.0; +//! superseded by newKinetics() returning shared_ptr +unique_ptr newKinetics(const std::vector& phases, const AnyMap& phaseNode, const AnyMap& rootNode=AnyMap()); @@ -74,7 +81,14 @@ shared_ptr newKinetics(const std::vector& phases, * @param phase_name The name of the reacting phase in the input file (that is, the * name of the first phase in the `phases` vector) */ -shared_ptr newKinetics(const std::vector& phases, +shared_ptr newKinetics(const vector>& phases, + const string& filename, + const string& phase_name); + +//! @copydoc KineticsFactory::newKinetics(const vector>&, const string&, const string&) +//! @deprecated To be removed after Cantera 3.0; +//! superseded by newKinetics() returning shared_ptr +unique_ptr newKinetics(const std::vector& phases, const std::string& filename, const std::string& phase_name); diff --git a/src/base/Solution.cpp b/src/base/Solution.cpp index d2c0406c1..9b45a4c2a 100644 --- a/src/base/Solution.cpp +++ b/src/base/Solution.cpp @@ -300,10 +300,10 @@ shared_ptr newSolution(const AnyMap& phaseNode, } // kinetics - std::vector phases; - phases.push_back(sol->thermo().get()); + vector> phases; + phases.push_back(sol->thermo()); for (size_t i = 0; i < sol->nAdjacent(); i++) { - phases.push_back(sol->adjacent(i)->thermo().get()); + phases.push_back(sol->adjacent(i)->thermo()); } sol->setKinetics(newKinetics(phases, phaseNode, rootNode)); diff --git a/src/clib/ct.cpp b/src/clib/ct.cpp index 6c01377c8..ad264aedc 100644 --- a/src/clib/ct.cpp +++ b/src/clib/ct.cpp @@ -1013,16 +1013,16 @@ extern "C" { int neighbor3, int neighbor4) { try { - vector phases; - phases.push_back(ThermoCabinet::at(reactingPhase).get()); + vector> phases; + phases.push_back(ThermoCabinet::at(reactingPhase)); if (neighbor1 >= 0) { - phases.push_back(ThermoCabinet::at(neighbor1).get()); + phases.push_back(ThermoCabinet::at(neighbor1)); if (neighbor2 >= 0) { - phases.push_back(ThermoCabinet::at(neighbor2).get()); + phases.push_back(ThermoCabinet::at(neighbor2)); if (neighbor3 >= 0) { - phases.push_back(ThermoCabinet::at(neighbor3).get()); + phases.push_back(ThermoCabinet::at(neighbor3)); if (neighbor4 >= 0) { - phases.push_back(ThermoCabinet::at(neighbor4).get()); + phases.push_back(ThermoCabinet::at(neighbor4)); } } } diff --git a/src/kinetics/KineticsFactory.cpp b/src/kinetics/KineticsFactory.cpp index f46cd1036..5755de325 100644 --- a/src/kinetics/KineticsFactory.cpp +++ b/src/kinetics/KineticsFactory.cpp @@ -67,7 +67,7 @@ shared_ptr newKinetics(const string& model) return kin; } -shared_ptr newKinetics(const vector& phases, +shared_ptr newKinetics(const vector>& phases, const AnyMap& phaseNode, const AnyMap& rootNode) { @@ -96,10 +96,54 @@ shared_ptr newKinetics(const vector& phases, return kin; } -shared_ptr newKinetics(const std::vector& phases, +unique_ptr newKinetics(const vector& phases, + const AnyMap& phaseNode, + const AnyMap& rootNode) +{ + warn_deprecated("newKinetics", + "To be removed after Cantera 3.0; superseded by\nnewKinetics" + "(const vector>&, const AnyMap&, const AnyMap&)."); + std::string kinType = phaseNode.getString("kinetics", "none"); + kinType = KineticsFactory::factory()->canonicalize(kinType); + if (kinType == "none") { + // determine phase with minimum number of dimensions + size_t nDim = 3; + for (auto& phase : phases) { + nDim = std::min(phase->nDim(), nDim); + } + // change kinetics type as necessary + if (nDim == 2) { + kinType = "surface"; + } else if (nDim == 1) { + kinType = "edge"; + } + } + + unique_ptr kin(KineticsFactory::factory()->newKinetics(kinType)); + for (auto& phase : phases) { + kin->addPhase(*phase); + } + kin->init(); + addReactions(*kin, phaseNode, rootNode); + return kin; +} + +shared_ptr newKinetics(const vector>& phases, + const string& filename, + const string& phase_name) +{ + AnyMap root = AnyMap::fromYamlFile(filename); + AnyMap& phaseNode = root["phases"].getMapWhere("name", phase_name); + return newKinetics(phases, phaseNode, root); +} + +unique_ptr newKinetics(const std::vector& phases, const std::string& filename, const std::string& phase_name) { + warn_deprecated("newKinetics", + "To be removed after Cantera 3.0; superseded by\nnewKinetics" + "(const vector>&, const string&, const string&)."); AnyMap root = AnyMap::fromYamlFile(filename); AnyMap& phaseNode = root["phases"].getMapWhere("name", phase_name); return newKinetics(phases, phaseNode, root);