32 for (
size_t k = 0; k <
nSpecies(); k++) {
52 return Units(1.0, 0, -
static_cast<double>(
nDim()), 0, 0, 0, 1);
63 for (
size_t k = 0; k <
nSpecies(); k++) {
71 for (
size_t k = 0; k <
m_kk; k++) {
72 lnac[k] = std::log(lnac[k]);
80 for (
size_t k = 0; k <
m_kk; k++) {
137 "To be removed after Cantera 3.0. Replaceable by calls to "
138 "setMoleFractions and setState_DP.");
146 "To be removed after Cantera 3.0. Replaceable by calls to "
147 "setMoleFractionsByName and setState_DP.");
155 "To be removed after Cantera 3.0. Replaceable by calls to "
156 "setMoleFractionsByName and setState_DP.");
164 "To be removed after Cantera 3.0. Replaceable by calls to "
165 "setMassFractions and setState_DP.");
173 "To be removed after Cantera 3.0. Replaceable by calls to "
174 "setMassFractionsByName and setState_DP.");
182 "To be removed after Cantera 3.0. Replaceable by calls to "
183 "setMassFractionsByName and setState_DP.");
191 "To be removed after Cantera 3.0. Renamed to setState_DP.");
197 warn_deprecated(
"ThermoPhase::setState_PX",
"To be removed after Cantera 3.0. "
198 "Call 'setMoleFractions' and 'setPressure' instead.");
205 warn_deprecated(
"ThermoPhase::setState_PX",
"To be removed after Cantera 3.0. "
206 "Call 'setMassFractions' and 'setPressure' instead.");
224 AnyMap state = input_state;
227 if (state.
hasKey(
"mass-fractions")) {
228 state[
"Y"] = state[
"mass-fractions"];
229 state.
erase(
"mass-fractions");
231 if (state.
hasKey(
"mole-fractions")) {
232 state[
"X"] = state[
"mole-fractions"];
233 state.
erase(
"mole-fractions");
235 if (state.
hasKey(
"temperature")) {
236 state[
"T"] = state[
"temperature"];
238 if (state.
hasKey(
"pressure")) {
239 state[
"P"] = state[
"pressure"];
241 if (state.
hasKey(
"enthalpy")) {
242 state[
"H"] = state[
"enthalpy"];
244 if (state.
hasKey(
"int-energy")) {
245 state[
"U"] = state[
"int-energy"];
247 if (state.
hasKey(
"internal-energy")) {
248 state[
"U"] = state[
"internal-energy"];
250 if (state.
hasKey(
"specific-volume")) {
251 state[
"V"] = state[
"specific-volume"];
253 if (state.
hasKey(
"entropy")) {
254 state[
"S"] = state[
"entropy"];
256 if (state.
hasKey(
"density")) {
257 state[
"D"] = state[
"density"];
259 if (state.
hasKey(
"vapor-fraction")) {
260 state[
"Q"] = state[
"vapor-fraction"];
265 if (state[
"X"].is<string>()) {
271 }
else if (state.
hasKey(
"Y")) {
272 if (state[
"Y"].is<string>()) {
280 if (state.
size() == 0) {
283 double T = state.
convert(
"T",
"K");
284 double P = state.
convert(
"P",
"Pa");
320 }
else if (state.
hasKey(
"T")) {
322 }
else if (state.
hasKey(
"P")) {
326 "'state' did not specify a recognized set of properties.\n"
327 "Keys provided were: {}", input_state.
keys_str());
340 double rtol,
bool doUV)
350 "Input specific volume is too small or negative. v = {}", v);
356 "Input pressure is too small or negative. p = {}", p);
369 }
else if (Tnew < Tmin) {
383 bool ignoreBounds =
false;
386 bool unstablePhase =
false;
389 double Tunstable = -1.0;
390 bool unstablePhaseNew =
false;
393 for (
int n = 0; n < 500; n++) {
398 unstablePhase =
true;
402 dt =
clip((Htarget - Hold)/cpd, -100.0, 100.0);
409 if ((dt > 0.0 && unstablePhase) || (dt <= 0.0 && !unstablePhase)) {
410 if (Hbot < Htarget && Tnew < (0.75 * Tbot + 0.25 * Told)) {
411 dt = 0.75 * (Tbot - Told);
414 }
else if (Htop > Htarget && Tnew > (0.75 * Ttop + 0.25 * Told)) {
415 dt = 0.75 * (Ttop - Told);
420 if (Tnew > Tmax && !ignoreBounds) {
423 if (Hmax >= Htarget) {
424 if (Htop < Htarget) {
433 if (Tnew < Tmin && !ignoreBounds) {
436 if (Hmin <= Htarget) {
437 if (Hbot > Htarget) {
450 for (
int its = 0; its < 10; its++) {
452 if (Tnew < Told / 3.0) {
454 dt = -2.0 * Told / 3.0;
465 unstablePhaseNew =
true;
468 unstablePhaseNew =
false;
471 if (unstablePhase ==
false && unstablePhaseNew ==
true) {
476 if (Hnew == Htarget) {
478 }
else if (Hnew > Htarget && (Htop < Htarget || Hnew < Htop)) {
481 }
else if (Hnew < Htarget && (Hbot > Htarget || Hnew > Hbot)) {
486 double Herr = Htarget - Hnew;
487 double acpd = std::max(fabs(cpd), 1.0E-5);
488 double denom = std::max(fabs(Htarget), acpd * Tnew);
489 double HConvErr = fabs((Herr)/denom);
490 if (HConvErr < rtol || fabs(dt/Tnew) < rtol) {
498 string ErrString =
"No convergence in 500 iterations\n";
500 ErrString += fmt::format(
501 "\tTarget Internal Energy = {}\n"
502 "\tCurrent Specific Volume = {}\n"
503 "\tStarting Temperature = {}\n"
504 "\tCurrent Temperature = {}\n"
505 "\tCurrent Internal Energy = {}\n"
506 "\tCurrent Delta T = {}\n",
507 Htarget, v, Tinit, Tnew, Hnew, dt);
509 ErrString += fmt::format(
510 "\tTarget Enthalpy = {}\n"
511 "\tCurrent Pressure = {}\n"
512 "\tStarting Temperature = {}\n"
513 "\tCurrent Temperature = {}\n"
514 "\tCurrent Enthalpy = {}\n"
515 "\tCurrent Delta T = {}\n",
516 Htarget, p, Tinit, Tnew, Hnew, dt);
519 ErrString += fmt::format(
520 "\t - The phase became unstable (Cp < 0) T_unstable_last = {}\n",
524 throw CanteraError(
"ThermoPhase::setState_HPorUV (UV)", ErrString);
526 throw CanteraError(
"ThermoPhase::setState_HPorUV (HP)", ErrString);
542 double rtol,
bool doSV)
550 "Input specific volume is too small or negative. v = {}", v);
556 "Input pressure is too small or negative. p = {}", p);
569 }
else if (Tnew < Tmin) {
583 bool ignoreBounds =
false;
586 bool unstablePhase =
false;
587 double Tunstable = -1.0;
588 bool unstablePhaseNew =
false;
591 for (
int n = 0; n < 500; n++) {
596 unstablePhase =
true;
600 dt =
clip((Starget - Sold)*Told/cpd, -100.0, 100.0);
604 if ((dt > 0.0 && unstablePhase) || (dt <= 0.0 && !unstablePhase)) {
605 if (Sbot < Starget && Tnew < Tbot) {
606 dt = 0.75 * (Tbot - Told);
609 }
else if (Stop > Starget && Tnew > Ttop) {
610 dt = 0.75 * (Ttop - Told);
615 if (Tnew > Tmax && !ignoreBounds) {
618 if (Smax >= Starget) {
619 if (Stop < Starget) {
627 }
else if (Tnew < Tmin && !ignoreBounds) {
630 if (Smin <= Starget) {
631 if (Sbot > Starget) {
644 for (
int its = 0; its < 10; its++) {
650 unstablePhaseNew =
true;
653 unstablePhaseNew =
false;
656 if (unstablePhase ==
false && unstablePhaseNew ==
true) {
661 if (Snew == Starget) {
663 }
else if (Snew > Starget && (Stop < Starget || Snew < Stop)) {
666 }
else if (Snew < Starget && (Sbot > Starget || Snew > Sbot)) {
671 double Serr = Starget - Snew;
672 double acpd = std::max(fabs(cpd), 1.0E-5);
673 double denom = std::max(fabs(Starget), acpd * Tnew);
674 double SConvErr = fabs((Serr * Tnew)/denom);
675 if (SConvErr < rtol || fabs(dt/Tnew) < rtol) {
683 string ErrString =
"No convergence in 500 iterations\n";
685 ErrString += fmt::format(
686 "\tTarget Entropy = {}\n"
687 "\tCurrent Specific Volume = {}\n"
688 "\tStarting Temperature = {}\n"
689 "\tCurrent Temperature = {}\n"
690 "\tCurrent Entropy = {}\n"
691 "\tCurrent Delta T = {}\n",
692 Starget, v, Tinit, Tnew, Snew, dt);
694 ErrString += fmt::format(
695 "\tTarget Entropy = {}\n"
696 "\tCurrent Pressure = {}\n"
697 "\tStarting Temperature = {}\n"
698 "\tCurrent Temperature = {}\n"
699 "\tCurrent Entropy = {}\n"
700 "\tCurrent Delta T = {}\n",
701 Starget, p, Tinit, Tnew, Snew, dt);
704 ErrString += fmt::format(
"\t - The phase became unstable (Cp < 0) T_unstable_last = {}\n",
708 throw CanteraError(
"ThermoPhase::setState_SPorSV (SV)", ErrString);
710 throw CanteraError(
"ThermoPhase::setState_SPorSV (SP)", ErrString);
723 for (
size_t k = 0; k !=
m_kk; ++k) {
727 o2req += x *
nAtoms(k, iC);
730 o2req += x *
nAtoms(k, iS);
733 o2req += x * 0.25 *
nAtoms(k, iH);
738 "No composition specified");
748 for (
size_t k = 0; k !=
m_kk; ++k) {
754 "No composition specified");
756 return 0.5 * o2pres / sum;
772 parseCompString(fuelComp.find(
":") != string::npos ? fuelComp : fuelComp+
":1.0"),
773 parseCompString(oxComp.find(
":") != string::npos ? oxComp : oxComp+
":1.0"),
778 const double* oxComp,
781 vector<double> fuel, ox;
782 if (basis == ThermoBasis::molar) {
787 fuelComp = fuel.data();
794 if (o2_required_fuel < 0.0 || o2_required_ox > 0.0) {
796 "Fuel composition contains too much oxygen or "
797 "oxidizer contains not enough oxygen. "
798 "Fuel and oxidizer composition mixed up?");
801 if (o2_required_ox == 0.0) {
802 return std::numeric_limits<double>::infinity();
805 return o2_required_fuel / (-o2_required_ox);
813 "Equivalence ratio phi must be >= 0");
818 vector<double> fuel, ox;
819 if (basis == ThermoBasis::molar) {
824 fuelComp = fuel.data();
830 double sum_f = std::accumulate(fuelComp, fuelComp+
m_kk, 0.0);
831 double sum_o = std::accumulate(oxComp, oxComp+
m_kk, 0.0);
833 vector<double> y(
m_kk);
834 for (
size_t k = 0; k !=
m_kk; ++k) {
835 y[k] = phi * fuelComp[k]/sum_f + AFR_st * oxComp[k]/sum_o;
846 parseCompString(fuelComp.find(
":") != string::npos ? fuelComp : fuelComp+
":1.0"),
847 parseCompString(oxComp.find(
":") != string::npos ? oxComp : oxComp+
":1.0"),
864 if (o2_present == 0.0) {
865 return std::numeric_limits<double>::infinity();
868 return o2_required / o2_present;
884 parseCompString(fuelComp.find(
":") != string::npos ? fuelComp : fuelComp+
":1.0"),
885 parseCompString(oxComp.find(
":") != string::npos ? oxComp : oxComp+
":1.0"),
890 const double* oxComp,
900 return std::numeric_limits<double>::infinity();
903 vector<double> fuel, ox;
904 if (basis == ThermoBasis::molar) {
909 fuelComp = fuel.data();
915 return std::max(Z / (1.0 - Z) * AFR_st, 0.0);
930 parseCompString(fuelComp.find(
":") != string::npos ? fuelComp : fuelComp+
":1.0"),
931 parseCompString(oxComp.find(
":") != string::npos ? oxComp : oxComp+
":1.0"),
938 if (mixFrac < 0.0 || mixFrac > 1.0) {
940 "Mixture fraction must be between 0 and 1");
943 vector<double> fuel, ox;
944 if (basis == ThermoBasis::molar) {
949 fuelComp = fuel.data();
953 double sum_yf = std::accumulate(fuelComp, fuelComp+
m_kk, 0.0);
954 double sum_yo = std::accumulate(oxComp, oxComp+
m_kk, 0.0);
956 if (sum_yf == 0.0 || sum_yo == 0.0) {
958 "No fuel and/or oxidizer composition specified");
963 vector<double> y(
m_kk);
965 for (
size_t k = 0; k !=
m_kk; ++k) {
966 y[k] = mixFrac * fuelComp[k]/sum_yf + (1.0-mixFrac) * oxComp[k]/sum_yo;
976 const string& element)
const
987 parseCompString(fuelComp.find(
":") != string::npos ? fuelComp : fuelComp+
":1.0"),
988 parseCompString(oxComp.find(
":") != string::npos ? oxComp : oxComp+
":1.0"),
995 vector<double> fuel, ox;
996 if (basis == ThermoBasis::molar) {
1001 fuelComp = fuel.data();
1005 if (element ==
"Bilger")
1011 if (o2_required_fuel < 0.0 || o2_required_ox > 0.0) {
1013 "Fuel composition contains too much oxygen or "
1014 "oxidizer contains not enough oxygen. "
1015 "Fuel and oxidizer composition mixed up?");
1018 double denominator = o2_required_fuel - o2_required_ox;
1020 if (denominator == 0.0) {
1022 "Fuel and oxidizer have the same composition");
1025 double Z = (o2_required_mix - o2_required_ox) / denominator;
1027 return std::min(std::max(Z, 0.0), 1.0);
1030 double sum_yf = std::accumulate(fuelComp, fuelComp+
m_kk, 0.0);
1031 double sum_yo = std::accumulate(oxComp, oxComp+
m_kk, 0.0);
1033 if (sum_yf == 0.0 || sum_yo == 0.0) {
1035 "No fuel and/or oxidizer composition specified");
1038 auto elementalFraction = [
this](
size_t m,
const double* y) {
1040 for (
size_t k = 0; k !=
m_kk; ++k) {
1047 double Z_m_fuel = elementalFraction(m, fuelComp)/sum_yf;
1048 double Z_m_ox = elementalFraction(m, oxComp)/sum_yo;
1051 if (Z_m_fuel == Z_m_ox) {
1053 "Fuel and oxidizer have the same composition for element {}",
1056 double Z = (Z_m_mix - Z_m_ox) / (Z_m_fuel - Z_m_ox);
1057 return std::min(std::max(Z, 0.0), 1.0);
1074 if (inputFile.empty()) {
1078 size_t dot = inputFile.find_last_of(
".");
1081 extension = inputFile.substr(
dot+1);
1083 if (extension ==
"xml" || extension ==
"cti") {
1085 "The CTI and XML formats are no longer supported.");
1089 auto& phase = root[
"phases"].getMapWhere(
"name",
id);
1098 "Missing species thermo data");
1110 "Temperature ({}), pressure ({}) and vapor fraction ({}) "
1111 "are inconsistent, above the critical temperature.",
1117 if (std::abs(Psat / P - 1) < 1e-6) {
1119 }
else if ((Q == 0 && P >= Psat) || (Q == 1 && P <= Psat)) {
1123 "Temperature ({}), pressure ({}) and vapor fraction ({}) "
1124 "are inconsistent.\nPsat at this T: {}\n"
1125 "Consider specifying the state using two fully independent "
1126 "properties (for example, temperature and density)",
1133 if (!spec->thermo) {
1135 "Species {} has no thermo data", spec->name);
1139 spec->thermo->validate(spec->name);
1147 if (!spec->thermo) {
1149 "Species {} has no thermo data", spec->name);
1154 "New species '{}' does not match existing species '{}' at index {}",
1157 spec->thermo->validate(spec->name);
1178 phaseNode[
"name"] =
name();
1181 for (
size_t i = 0; i <
nElements(); i++) {
1189 if (stateVars.count(
"T")) {
1193 if (stateVars.count(
"D")) {
1194 state[
"density"].setQuantity(
density(),
"kg/m^3");
1195 }
else if (stateVars.count(
"P")) {
1196 state[
"P"].setQuantity(
pressure(),
"Pa");
1199 if (stateVars.count(
"Y")) {
1200 map<string, double> Y;
1201 for (
size_t k = 0; k <
m_kk; k++) {
1209 }
else if (stateVars.count(
"X")) {
1210 map<string, double> X;
1211 for (
size_t k = 0; k <
m_kk; k++) {
1221 phaseNode[
"state"] = std::move(state);
1225 phaseNode[
"__type__"] =
"Phase";
1245 double rtol,
int max_steps,
int max_iter,
1246 int estimate_equil,
int log_level)
1248 if (solver ==
"auto" || solver ==
"element_potential") {
1249 vector<double> initial_state;
1251 debuglog(
"Trying ChemEquil solver\n", log_level);
1256 int ret = E.
equilibrate(*
this, XY.c_str(), log_level-1);
1259 "ChemEquil solver failed. Return code: {}", ret);
1261 debuglog(
"ChemEquil solver succeeded\n", log_level);
1263 }
catch (std::exception& err) {
1264 debuglog(
"ChemEquil solver failed.\n", log_level);
1267 if (solver ==
"auto") {
1274 if (solver ==
"auto" || solver ==
"vcs" || solver ==
"gibbs") {
1278 M.
equilibrate(XY, solver, rtol, max_steps, max_iter,
1279 estimate_equil, log_level);
1283 if (solver !=
"auto") {
1285 "Invalid solver specified: '{}'", solver);
1291 for (
size_t m = 0; m <
m_kk; m++) {
1292 for (
size_t k = 0; k <
m_kk; k++) {
1293 dlnActCoeffdlnN[ld * k + m] = 0.0;
1299void ThermoPhase::getdlnActCoeffdlnN_numderiv(
const size_t ld,
1300 double*
const dlnActCoeffdlnN)
1302 double deltaMoles_j = 0.0;
1306 vector<double> ActCoeff_Base(
m_kk);
1308 vector<double> Xmol_Base(
m_kk);
1312 vector<double> ActCoeff(
m_kk);
1313 vector<double> Xmol(
m_kk);
1314 double v_totalMoles = 1.0;
1315 double TMoles_base = v_totalMoles;
1318 for (
size_t j = 0; j <
m_kk; j++) {
1324 double moles_j_base = v_totalMoles * Xmol_Base[j];
1325 deltaMoles_j = 1.0E-7 * moles_j_base + v_totalMoles * 1.0E-13 + 1.0E-150;
1329 v_totalMoles = TMoles_base + deltaMoles_j;
1330 for (
size_t k = 0; k <
m_kk; k++) {
1331 Xmol[k] = Xmol_Base[k] * TMoles_base / v_totalMoles;
1333 Xmol[j] = (moles_j_base + deltaMoles_j) / v_totalMoles;
1341 double*
const lnActCoeffCol = dlnActCoeffdlnN + ld * j;
1342 for (
size_t k = 0; k <
m_kk; k++) {
1343 lnActCoeffCol[k] = (2*moles_j_base + deltaMoles_j) *(ActCoeff[k] - ActCoeff_Base[k]) /
1344 ((ActCoeff[k] + ActCoeff_Base[k]) * deltaMoles_j);
1347 v_totalMoles = TMoles_base;
1356 if (
type() ==
"none") {
1358 "Not implemented for thermo model 'none'");
1361 fmt::memory_buffer b;
1363 int name_width = 18;
1365 string blank_leader = fmt::format(
"{:{}}",
"", name_width);
1367 string string_property = fmt::format(
"{{:>{}}} {{}}\n", name_width);
1369 string one_property = fmt::format(
"{{:>{}}} {{:<.5g}} {{}}\n", name_width);
1371 string two_prop_header =
"{} {:^15} {:^15}\n";
1372 string kg_kmol_header = fmt::format(
1373 two_prop_header, blank_leader,
"1 kg",
"1 kmol"
1375 string Y_X_header = fmt::format(
1376 two_prop_header, blank_leader,
"mass frac. Y",
"mole frac. X"
1378 string two_prop_sep = fmt::format(
1379 "{} {:-^15} {:-^15}\n", blank_leader,
"",
""
1381 string two_property = fmt::format(
1382 "{{:>{}}} {{:15.5g}} {{:15.5g}} {{}}\n", name_width
1385 string three_prop_header = fmt::format(
1386 "{} {:^15} {:^15} {:^15}\n", blank_leader,
"mass frac. Y",
1387 "mole frac. X",
"chem. pot. / RT"
1389 string three_prop_sep = fmt::format(
1390 "{} {:-^15} {:-^15} {:-^15}\n", blank_leader,
"",
"",
""
1392 string three_property = fmt::format(
1393 "{{:>{}}} {{:15.5g}} {{:15.5g}} {{:15.5g}}\n", name_width
1409 fmt_append(b, one_property,
"potential", phi,
"V");
1433 "heat capacity c_v",
"<not implemented>");
1437 vector<double> x(
m_kk);
1438 vector<double> y(
m_kk);
1439 vector<double> mu(
m_kk);
1444 double xMinor = 0.0;
1445 double yMinor = 0.0;
1450 for (
size_t k = 0; k <
m_kk; k++) {
1451 if (abs(x[k]) >= threshold) {
1467 for (
size_t k = 0; k <
m_kk; k++) {
1468 if (abs(x[k]) >= threshold) {
1478 string minor = fmt::format(
"[{:+5d} minor]", nMinor);
1479 fmt_append(b, two_property, minor, yMinor, xMinor,
"");
1482 return to_string(b) + err.
what();
1484 return to_string(b);
1489 warn_deprecated(
"ThermoPhase::reportCSV",
"To be removed after Cantera 3.0.");
1492 csvFile.precision(8);
1495 vector<string> pNames;
1496 vector<vector<double>> data;
1499 csvFile << setw(tabS) <<
"Species,";
1500 for (
size_t i = 0; i < pNames.size(); i++) {
1501 csvFile << setw(tabM) << pNames[i] <<
",";
1504 for (
size_t k = 0; k <
nSpecies(); k++) {
1507 for (
size_t i = 0; i < pNames.size(); i++) {
1508 csvFile << setw(tabM) << data[i][k] <<
",";
1512 for (
size_t i = 0; i < pNames.size(); i++) {
1513 csvFile << setw(tabM) << 0 <<
",";
1521 vector<vector<double>>& data)
const
1523 warn_deprecated(
"ThermoPhase::getCsvReportData",
"To be removed after Cantera 3.0.");
1525 data.assign(10, vector<double>(
nSpecies()));
1527 names.push_back(
"X");
1530 names.push_back(
"Y");
1533 names.push_back(
"Chem. Pot (J/kmol)");
1536 names.push_back(
"Activity");
1539 names.push_back(
"Act. Coeff.");
1542 names.push_back(
"Part. Mol Enthalpy (J/kmol)");
1545 names.push_back(
"Part. Mol. Entropy (J/K/kmol)");
1548 names.push_back(
"Part. Mol. Energy (J/kmol)");
1551 names.push_back(
"Part. Mol. Cp (J/K/kmol");
1554 names.push_back(
"Part. Mol. Cv (J/K/kmol)");
Headers for the MultiPhase object that is used to set up multiphase equilibrium problems (see Chemica...
Pure Virtual Base class for individual species reference state thermodynamic managers and text for th...
Declaration for class Cantera::Species.
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
Header file for class ThermoPhase, the base class for phases with thermodynamic properties,...
A map of string keys to values whose type can vary at runtime.
size_t size() const
Returns the number of elements in this map.
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
double convert(const string &key, const string &units) const
Convert the item stored by the given key to the units specified in units.
void setFlowStyle(bool flow=true)
Use "flow" style when outputting this AnyMap to YAML.
void erase(const string &key)
Erase the value held by key.
static AnyMap fromYamlFile(const string &name, const string &parent_name="")
Create an AnyMap from a YAML file.
void update(const AnyMap &other, bool keepExisting=true)
Add items from other to this AnyMap.
static bool addOrderingRules(const string &objectType, const vector< vector< string > > &specs)
Add global rules for setting the order of elements when outputting AnyMap objects to YAML.
string keys_str() const
Return a string listing the keys in this AnyMap, for use in error messages, for example.
Base class for exceptions thrown by Cantera classes.
const char * what() const override
Get a description of the error.
Class ChemEquil implements a chemical equilibrium solver for single-phase solutions.
int equilibrate(ThermoPhase &s, const char *XY, int loglevel=0)
Equilibrate a phase, holding the elemental composition fixed at the initial value found within the Th...
EquilOpt options
Options controlling how the calculation is carried out.
double relTolerance
Relative tolerance.
int maxIterations
Maximum number of iterations.
string canonicalize(const string &name)
Get the canonical name registered for a type.
A class for multiphase mixtures.
void init()
Process phases and build atomic composition array.
void addPhase(ThermoPhase *p, double moles)
Add a phase to the mixture.
A species thermodynamic property manager for a phase.
bool ready(size_t nSpecies)
Check if data for all species (0 through nSpecies-1) has been installed.
virtual void install_STIT(size_t index, shared_ptr< SpeciesThermoInterpType > stit)
Install a new species thermodynamic property parameterization for one species.
virtual void modifySpecies(size_t index, shared_ptr< SpeciesThermoInterpType > spec)
Modify the species thermodynamic property parameterization for a species.
virtual void resetHf298(const size_t k)
Restore the original heat of formation of one or more species.
An error indicating that an unimplemented function has been called.
double massFraction(size_t k) const
Return the mass fraction of a single species.
virtual bool addSpecies(shared_ptr< Species > spec)
Add a Species to this Phase.
virtual void setMoleFractions(const double *const x)
Set the mole fractions to the specified values.
void assertCompressible(const string &setter) const
Ensure that phase is compressible.
void restoreState(const vector< double > &state)
Restore a state saved on a previous call to saveState.
size_t nSpecies() const
Returns the number of species in the phase.
virtual void setMassFractions_NoNorm(const double *const y)
Set the mass fractions to the specified values without normalizing.
virtual map< string, size_t > nativeState() const
Return a map of properties defining the native state of a substance.
size_t m_kk
Number of species in the phase.
virtual void modifySpecies(size_t k, shared_ptr< Species > spec)
Modify the thermodynamic data associated with a species.
size_t nDim() const
Returns the number of spatial dimensions (1, 2, or 3)
void setState_TD(double t, double rho)
Set the internally stored temperature (K) and density (kg/m^3)
double temperature() const
Temperature (K).
virtual void setPressure(double p)
Set the internally stored pressure (Pa) at constant temperature and composition.
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
void moleFractionsToMassFractions(const double *X, double *Y) const
Converts a mixture composition from mass fractions to mole fractions.
void saveState(vector< double > &state) const
Save the current internal state of the phase.
size_t elementIndex(const string &name) const
Return the index of element named 'name'.
void setMassFractionsByName(const Composition &yMap)
Set the species mass fractions by name.
string speciesName(size_t k) const
Name of the species with index k.
virtual void setDensity(const double density_)
Set the internally stored density (kg/m^3) of the phase.
vector< double > getCompositionFromMap(const Composition &comp) const
Converts a Composition to a vector with entries for each species Species that are not specified are s...
void getMoleFractions(double *const x) const
Get the species mole fraction vector.
void setMoleFractionsByName(const Composition &xMap)
Set the species mole fractions by name.
const double * massFractions() const
Return a const pointer to the mass fraction array.
const vector< double > & molecularWeights() const
Return a const reference to the internal vector of molecular weights.
double moleFraction(size_t k) const
Return the mole fraction of a single species.
const vector< string > & elementNames() const
Return a read-only reference to the vector of element names.
virtual double density() const
Density (kg/m^3).
double nAtoms(size_t k, size_t m) const
Number of atoms of element m in species k.
virtual void setTemperature(double temp)
Set the internally stored temperature of the phase (K).
size_t nElements() const
Number of elements.
virtual void setMassFractions(const double *const y)
Set the mass fractions to the specified values and normalize them.
const vector< string > & speciesNames() const
Return a const reference to the vector of species names.
double molecularWeight(size_t k) const
Molecular weight of species k.
virtual void invalidateCache()
Invalidate any cached values which are normally updated only when a change in state is detected.
void getMassFractions(double *const y) const
Get the species mass fractions.
virtual double pressure() const
Return the thermodynamic pressure (Pa).
string elementName(size_t m) const
Name of the element with index m.
double charge(size_t k) const
Dimensionless electrical charge of a single molecule of species k The charge is normalized by the the...
string name() const
Return the name of the phase.
static ThermoFactory * factory()
Static function that creates a static instance of the factory.
int m_ssConvention
Contains the standard state convention.
virtual void getPartialMolarEnthalpies(double *hbar) const
Returns an array of partial molar enthalpies for the species in the mixture.
virtual double critTemperature() const
Critical temperature (K).
virtual void setState_HP(double h, double p, double tol=1e-9)
Set the internally stored specific enthalpy (J/kg) and pressure (Pa) of the phase.
virtual void setState_PX(double p, double *x)
Set the pressure (Pa) and mole fractions.
double electricPotential() const
Returns the electric potential of this phase (V).
virtual void setState_UV(double u, double v, double tol=1e-9)
Set the specific internal energy (J/kg) and specific volume (m^3/kg).
virtual double cp_mole() const
Molar heat capacity at constant pressure. Units: J/kmol/K.
double equivalenceRatio() const
Compute the equivalence ratio for the current mixture from available oxygen and required oxygen.
virtual void setParameters(const AnyMap &phaseNode, const AnyMap &rootNode=AnyMap())
Set equation of state parameters from an AnyMap phase description.
virtual void getParameters(AnyMap &phaseNode) const
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
virtual double enthalpy_mole() const
Molar enthalpy. Units: J/kmol.
virtual void setState_TP(double t, double p)
Set the temperature (K) and pressure (Pa)
virtual double standardConcentration(size_t k=0) const
Return the standard concentration for the kth species.
virtual void setState_TV(double t, double v, double tol=1e-9)
Set the temperature (K) and specific volume (m^3/kg).
virtual double logStandardConc(size_t k=0) const
Natural logarithm of the standard concentration of the kth species.
double o2Present(const double *y) const
Helper function for computing the amount of oxygen available in the current mixture.
virtual void setState_PV(double p, double v, double tol=1e-9)
Set the pressure (Pa) and specific volume (m^3/kg).
virtual void setState(const AnyMap &state)
Set the state using an AnyMap containing any combination of properties supported by the thermodynamic...
virtual double minTemp(size_t k=npos) const
Minimum temperature for which the thermodynamic data for the species or phase are valid.
virtual void setState_RPY(double rho, double p, const double *y)
Set the density (kg/m**3), pressure (Pa) and mass fractions.
virtual void setState_TPX(double t, double p, const double *x)
Set the temperature (K), pressure (Pa), and mole fractions.
virtual void getCsvReportData(vector< string > &names, vector< vector< double > > &data) const
Fills names and data with the column names and species thermo properties to be included in the output...
void setState_SPorSV(double s, double p, double tol=1e-9, bool doSV=false)
Carry out work in SP and SV calculations.
double RT() const
Return the Gas Constant multiplied by the current temperature.
virtual void setState_RPX(double rho, double p, const double *x)
Set the density (kg/m**3), pressure (Pa) and mole fractions.
virtual void getPartialMolarCp(double *cpbar) const
Return an array of partial molar heat capacities for the species in the mixture.
virtual double critPressure() const
Critical pressure (Pa).
virtual void setState_TPY(double t, double p, const double *y)
Set the internally stored temperature (K), pressure (Pa), and mass fractions of the phase.
double m_tlast
last value of the temperature processed by reference state
virtual void setState_ST(double s, double t, double tol=1e-9)
Set the specific entropy (J/kg/K) and temperature (K).
void setState_HPorUV(double h, double p, double tol=1e-9, bool doUV=false)
Carry out work in HP and UV calculations.
double gibbs_mass() const
Specific Gibbs function. Units: J/kg.
virtual void getActivityConcentrations(double *c) const
This method returns an array of generalized concentrations.
double stoichAirFuelRatio(const double *fuelComp, const double *oxComp, ThermoBasis basis=ThermoBasis::molar) const
Compute the stoichiometric air to fuel ratio (kg oxidizer / kg fuel) given fuel and oxidizer composit...
string type() const override
String indicating the thermodynamic model implemented.
AnyMap parameters(bool withInput=true) const
Returns the parameters of a ThermoPhase object such that an identical one could be reconstructed usin...
virtual string report(bool show_thermo=true, double threshold=-1e-14) const
returns a summary of the state of the phase as a string
virtual void getPartialMolarIntEnergies(double *ubar) const
Return an array of partial molar internal energies for the species in the mixture.
virtual double maxTemp(size_t k=npos) const
Maximum temperature for which the thermodynamic data for the species are valid.
double mixtureFraction(const double *fuelComp, const double *oxComp, ThermoBasis basis=ThermoBasis::molar, const string &element="Bilger") const
Compute the mixture fraction = kg fuel / (kg oxidizer + kg fuel) for the current mixture given fuel a...
double o2Required(const double *y) const
Helper function for computing the amount of oxygen required for complete oxidation.
void getElectrochemPotentials(double *mu) const
Get the species electrochemical potentials.
virtual void getdlnActCoeffdlnN(const size_t ld, double *const dlnActCoeffdlnN)
Get the array of derivatives of the log activity coefficients with respect to the log of the species ...
void setState_RP(double rho, double p)
Set the density (kg/m**3) and pressure (Pa) at constant composition.
virtual void getActivityCoefficients(double *ac) const
Get the array of non-dimensional molar-based activity coefficients at the current solution temperatur...
virtual string phaseOfMatter() const
String indicating the mechanical phase of the matter in this Phase.
virtual void setState_Tsat(double t, double x)
Set the state to a saturated system at a particular temperature.
virtual double entropy_mole() const
Molar entropy. Units: J/kmol/K.
double cv_mass() const
Specific heat at constant volume. Units: J/kg/K.
virtual int activityConvention() const
This method returns the convention used in specification of the activities, of which there are curren...
virtual void initThermo()
Initialize the ThermoPhase object after all species have been set up.
virtual void setState_PY(double p, double *y)
Set the internally stored pressure (Pa) and mass fractions.
double entropy_mass() const
Specific entropy. Units: J/kg/K.
virtual MultiSpeciesThermo & speciesThermo(int k=-1)
Return a changeable reference to the calculation manager for species reference-state thermodynamic pr...
virtual void setState_UP(double u, double p, double tol=1e-9)
Set the specific internal energy (J/kg) and pressure (Pa).
void initThermoFile(const string &inputFile, const string &id)
Initialize a ThermoPhase object using an input file.
virtual void setState_SP(double s, double p, double tol=1e-9)
Set the specific entropy (J/kg/K) and pressure (Pa).
virtual int standardStateConvention() const
This method returns the convention used in specification of the standard state, of which there are cu...
void modifySpecies(size_t k, shared_ptr< Species > spec) override
Modify the thermodynamic data associated with a species.
virtual void setState_SH(double s, double h, double tol=1e-9)
Set the specific entropy (J/kg/K) and the specific enthalpy (J/kg)
void invalidateCache() override
Invalidate any cached values which are normally updated only when a change in state is detected.
virtual void getActivities(double *a) const
Get the array of non-dimensional activities at the current solution temperature, pressure,...
void setMixtureFraction(double mixFrac, const double *fuelComp, const double *oxComp, ThermoBasis basis=ThermoBasis::molar)
Set the mixture composition according to the mixture fraction = kg fuel / (kg oxidizer + kg fuel)
virtual void resetHf298(const size_t k=npos)
Restore the original heat of formation of one or more species.
virtual void getChemPotentials(double *mu) const
Get the species chemical potentials. Units: J/kmol.
double cp_mass() const
Specific heat at constant pressure. Units: J/kg/K.
virtual void setState_TH(double t, double h, double tol=1e-9)
Set the temperature (K) and the specific enthalpy (J/kg)
virtual void getLnActivityCoefficients(double *lnac) const
Get the array of non-dimensional molar-based ln activity coefficients at the current solution tempera...
double intEnergy_mass() const
Specific internal energy. Units: J/kg.
virtual Units standardConcentrationUnits() const
Returns the units of the "standard concentration" for this phase.
virtual double cv_mole() const
Molar heat capacity at constant volume. Units: J/kmol/K.
MultiSpeciesThermo m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
virtual double satPressure(double t)
Return the saturation pressure given the temperature.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
AnyMap m_input
Data supplied via setParameters.
virtual double intEnergy_mole() const
Molar internal energy. Units: J/kmol.
virtual void reportCSV(std::ofstream &csvFile) const
returns a summary of the state of the phase to a comma separated file.
virtual void setState_DP(double rho, double p)
Set the density (kg/m**3) and pressure (Pa) at constant composition.
void setEquivalenceRatio(double phi, const double *fuelComp, const double *oxComp, ThermoBasis basis=ThermoBasis::molar)
Set the mixture composition according to the equivalence ratio.
void setState_TPQ(double T, double P, double Q)
Set the temperature, pressure, and vapor fraction (quality).
virtual void setState_VH(double v, double h, double tol=1e-9)
Set the specific volume (m^3/kg) and the specific enthalpy (J/kg)
virtual void getPartialMolarEntropies(double *sbar) const
Returns an array of partial molar entropies of the species in the solution.
virtual double gibbs_mole() const
Molar Gibbs function. Units: J/kmol.
virtual void setState_SV(double s, double v, double tol=1e-9)
Set the specific entropy (J/kg/K) and specific volume (m^3/kg).
const AnyMap & input() const
Access input data associated with the phase description.
virtual void setState_Psat(double p, double x)
Set the state to a saturated system at a particular pressure.
void setState_conditional_TP(double t, double p, bool set_p)
Helper function used by setState_HPorUV and setState_SPorSV.
virtual void getPartialMolarVolumes(double *vbar) const
Return an array of partial molar volumes for the species in the mixture.
double enthalpy_mass() const
Specific enthalpy. Units: J/kg.
A representation of the units associated with a dimensional quantity.
void fmt_append(fmt::memory_buffer &b, Args... args)
Versions 6.2.0 and 6.2.1 of fmtlib do not include this define before they include windows....
Composition parseCompString(const string &ss, const vector< string > &names)
Parse a composition string into a map consisting of individual key:composition pairs.
void equilibrate(const string &XY, const string &solver="auto", double rtol=1e-9, int max_steps=50000, int max_iter=100, int estimate_equil=0, int log_level=0)
Equilibrate a ThermoPhase object.
void debuglog(const string &msg, int loglevel)
Write a message to the log only if loglevel > 0.
double dot(InputIter x_begin, InputIter x_end, InputIter2 y_begin)
Function that calculates a templated inner product.
T clip(const T &value, const T &lower, const T &upper)
Clip value such that lower <= value <= upper.
const double Faraday
Faraday constant [C/kmol].
const double OneAtm
One atmosphere [Pa].
void setupPhase(ThermoPhase &thermo, const AnyMap &phaseNode, const AnyMap &rootNode)
Initialize a ThermoPhase object.
Namespace for the Cantera kernel.
const size_t npos
index returned by functions to indicate "no position"
const int cAC_CONVENTION_MOLAR
Standard state uses the molar convention.
const double SmallNumber
smallest number to compare to zero.
ThermoBasis
Differentiate between mole fractions and mass fractions for input mixture composition.
void warn_deprecated(const string &source, const AnyBase &node, const string &message)
A deprecation warning for syntax in an input file.
map< string, double > Composition
Map from string names to doubles.
Contains declarations for string manipulation functions within Cantera.