60 output[
"description"] =
m_header[
"description"];
62 output[
"generator"] =
"YamlWriter";
63 output[
"cantera-version"] = CANTERA_VERSION;
65 time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
66 output[
"date"] =
trimCopy(std::ctime(&now));
68 output[
"description"].
setLoc(-6, 0);
70 output[
"generator"].
setLoc(-5, 0);
71 output[
"cantera-version"].
setLoc(-4, 0);
72 output[
"git-commit"].
setLoc(-3, 0);
73 output[
"date"].
setLoc(-2, 0);
76 set<string> exclude = {
77 "description",
"generator",
"cantera-version",
"git-commit",
"date"};
78 for (
const auto& [key, value] :
m_header) {
79 if (!exclude.count(key)) {
85 vector<AnyMap> phaseDefs(m_phases.size());
86 size_t nspecies_total = 0;
87 for (
size_t i = 0; i < m_phases.size(); i++) {
89 if (m_phases[i]->nAdjacent()) {
90 vector<string> adj_names;
91 for (
size_t j = 0; j < m_phases[i]->nAdjacent(); j++) {
92 adj_names.push_back(m_phases[i]->adjacent(j)->name());
94 phaseDefs[i][
"adjacent-phases"] = adj_names;
96 nspecies_total += m_phases[i]->thermo()->nSpecies();
98 output[
"phases"] = phaseDefs;
101 vector<AnyMap> speciesDefs;
102 speciesDefs.reserve(nspecies_total);
103 std::unordered_map<string, size_t> speciesDefIndex;
104 for (
const auto& phase : m_phases) {
105 const auto thermo = phase->thermo();
106 for (
const auto& name : thermo->speciesNames()) {
107 const auto& species = thermo->species(name);
110 if (speciesDefIndex.count(name) == 0) {
111 speciesDefs.emplace_back(speciesDef);
112 speciesDefIndex[name] = speciesDefs.
size() - 1;
113 }
else if (speciesDefs[speciesDefIndex[name]] != speciesDef) {
115 "Multiple species with different definitions are not "
116 "supported:\n>>>>>>\n{}\n======\n{}\n<<<<<<\n",
117 speciesDef.toYamlString(),
118 speciesDefs[speciesDefIndex[name]].toYamlString());
122 output[
"species"] = speciesDefs;
125 map<string, vector<AnyMap>> allReactions;
126 for (
const auto& phase : m_phases) {
127 const auto kin = phase->kinetics();
128 if (!kin || !kin->nReactions()) {
131 vector<AnyMap> reactions;
132 for (
size_t i = 0; i < kin->nReactions(); i++) {
135 allReactions[phase->name()] = std::move(reactions);
143 map<string, vector<string>> phaseGroups;
145 for (
const auto& phase : m_phases) {
146 const auto kin = phase->kinetics();
147 string name = phase->name();
148 if (!kin || !kin->nReactions()) {
152 for (
auto& [canonicalPhase, dependentPhases] : phaseGroups) {
153 if (allReactions[canonicalPhase] == allReactions[name]) {
154 dependentPhases.push_back(name);
155 allReactions.erase(name);
161 phaseGroups[name].push_back(name);
166 if (phaseGroups.size() == 1) {
167 output[
"reactions"] = std::move(allReactions[phaseGroups.begin()->first]);
169 for (
const auto& [canonicalPhase, dependentPhases] : phaseGroups) {
171 for (
auto& name : dependentPhases) {
172 groupName += name +
"-";
174 groupName +=
"reactions";
175 output[groupName] = std::move(allReactions[canonicalPhase]);
177 for (
auto& name : dependentPhases) {
178 AnyMap& phaseDef = output[
"phases"].getMapWhere(
"name", name);
179 phaseDef[
"reactions"] = vector<string>{groupName};
186 return output.toYamlString();