void FixedChemPotSSTP::setParametersFromXML(const XML_Node& eosdata) { std::string model = eosdata["model"]; if (model != "StoichSubstance" && model != "FixedChemPot" && model != "StoichSubstanceSSTP") { throw CanteraError("FixedChemPotSSTP::setParametersFromXML", "thermo model attribute must be FixedChemPot or StoichSubstance or StoichSubstanceSSTP"); } if (model == "FixedChemPotSSTP") { doublereal val = getFloatDefaultUnits(eosdata, "chemicalPotential", "J/kmol"); chemPot_ = val; } }
void StoichSubstanceSSTP::initThermoXML(XML_Node& phaseNode, std::string id) { /* * Find the Thermo XML node */ if (!phaseNode.hasChild("thermo")) { throw CanteraError("StoichSubstanceSSTP::initThermoXML", "no thermo XML node"); } XML_Node &tnode = phaseNode.child("thermo"); double dens = getFloatDefaultUnits(tnode, "density", "kg/m3"); setDensity(dens); SingleSpeciesTP::initThermoXML(phaseNode, id); }
/*! * This is called if a 'MinEQ3' node is found in the XML input. * * @param name name of the species * @param MinEQ3node The XML_Node containing the MinEQ3 parameterization */ SpeciesThermoInterpType* newShomateForMineralEQ3(const std::string& name, const XML_Node& MinEQ3node) { doublereal tmin0 = strSItoDbl(MinEQ3node["Tmin"]); doublereal tmax0 = strSItoDbl(MinEQ3node["Tmax"]); doublereal p0 = strSItoDbl(MinEQ3node["Pref"]); doublereal deltaG_formation_pr_tr = getFloatDefaultUnits(MinEQ3node, "DG0_f_Pr_Tr", "cal/gmol", "actEnergy"); doublereal deltaH_formation_pr_tr = getFloatDefaultUnits(MinEQ3node, "DH0_f_Pr_Tr", "cal/gmol", "actEnergy"); doublereal Entrop_pr_tr = getFloatDefaultUnits(MinEQ3node, "S0_Pr_Tr", "cal/gmol/K"); doublereal a = getFloatDefaultUnits(MinEQ3node, "a", "cal/gmol/K"); doublereal b = getFloatDefaultUnits(MinEQ3node, "b", "cal/gmol/K2"); doublereal c = getFloatDefaultUnits(MinEQ3node, "c", "cal-K/gmol"); doublereal dg = deltaG_formation_pr_tr * 4.184 * 1.0E3; doublereal DHjmol = deltaH_formation_pr_tr * 1.0E3 * 4.184; doublereal fac = DHjmol - dg - 298.15 * Entrop_pr_tr * 1.0E3 * 4.184; doublereal Mu0_tr_pr = fac + dg; doublereal e = Entrop_pr_tr * 1.0E3 * 4.184; doublereal Hcalc = Mu0_tr_pr + 298.15 * e; /* * Now calculate the shomate polynomials * * Cp first * * Shomate: (Joules / gmol / K) * Cp = As + Bs * t + Cs * t*t + Ds * t*t*t + Es / (t*t) * where * t = temperature(Kelvin) / 1000 */ double As = a * 4.184; double Bs = b * 4.184 * 1000.; double Cs = 0.0; double Ds = 0.0; double Es = c * 4.184 / (1.0E6); double t = 298.15 / 1000.; double H298smFs = As * t + Bs * t * t / 2.0 - Es / t; double HcalcS = Hcalc / 1.0E6; double Fs = HcalcS - H298smFs; double S298smGs = As * log(t) + Bs * t - Es/(2.0*t*t); double ScalcS = e / 1.0E3; double Gs = ScalcS - S298smGs; double c0[7] = {As, Bs, Cs, Ds, Es, Fs, Gs}; return newSpeciesThermoInterpType(SHOMATE1, tmin0, tmax0, p0, c0); }
void FixedChemPotSSTP::initThermoXML(XML_Node& phaseNode, const std::string& id_) { /* * Find the Thermo XML node */ if (!phaseNode.hasChild("thermo")) { throw CanteraError("FixedChemPotSSTP::initThermoXML", "no thermo XML node"); } XML_Node& tnode = phaseNode.child("thermo"); std::string model = tnode["model"]; if (model != "StoichSubstance" && model != "FixedChemPot" && model != "StoichSubstanceSSTP") { throw CanteraError("FixedChemPotSSTP::initThermoXML()", "thermo model attribute must be FixedChemPot or StoichSubstance or StoichSubstanceSSTP"); } SingleSpeciesTP::initThermoXML(phaseNode, id_); if (model == "FixedChemPot") { double val = getFloatDefaultUnits(tnode, "chemicalPotential", "J/kmol"); chemPot_ = val; } else { _updateThermo(); chemPot_ = (m_h0_RT[0] - m_s0_R[0]) * GasConstant * temperature(); } }
static void installMinEQ3asShomateThermoFromXML(std::string speciesName, ThermoPhase *th_ptr, SpeciesThermo& sp, int k, const XML_Node* MinEQ3node) { array_fp coef(15), c0(7, 0.0); std::string astring = (*MinEQ3node)["Tmin"]; doublereal tmin0 = strSItoDbl(astring); astring = (*MinEQ3node)["Tmax"]; doublereal tmax0 = strSItoDbl(astring); astring = (*MinEQ3node)["Pref"]; doublereal p0 = strSItoDbl(astring); doublereal deltaG_formation_pr_tr = getFloatDefaultUnits(*MinEQ3node, "DG0_f_Pr_Tr", "cal/gmol", "actEnergy"); doublereal deltaH_formation_pr_tr = getFloatDefaultUnits(*MinEQ3node, "DH0_f_Pr_Tr", "cal/gmol", "actEnergy"); doublereal Entrop_pr_tr = getFloatDefaultUnits(*MinEQ3node, "S0_Pr_Tr", "cal/gmol/K"); doublereal a = getFloatDefaultUnits(*MinEQ3node, "a", "cal/gmol/K"); doublereal b = getFloatDefaultUnits(*MinEQ3node, "b", "cal/gmol/K2"); doublereal c = getFloatDefaultUnits(*MinEQ3node, "c", "cal-K/gmol"); doublereal dg = deltaG_formation_pr_tr * 4.184 * 1.0E3; doublereal fac = convertDGFormation(k, th_ptr); doublereal Mu0_tr_pr = fac + dg; doublereal e = Entrop_pr_tr * 1.0E3 * 4.184; doublereal Hcalc = Mu0_tr_pr + 298.15 * e; doublereal DHjmol = deltaH_formation_pr_tr * 1.0E3 * 4.184; // If the discrepency is greater than 100 cal gmol-1, print // an error and exit. if (fabs(Hcalc -DHjmol) > 10.* 1.0E6 * 4.184) { throw CanteraError("installMinEQ3asShomateThermoFromXML()", "DHjmol is not consistent with G and S" + fp2str(Hcalc) + " vs " + fp2str(DHjmol)); } /* * Now calculate the shomate polynomials * * Cp first * * Shomate: (Joules / gmol / K) * Cp = As + Bs * t + Cs * t*t + Ds * t*t*t + Es / (t*t) * where * t = temperature(Kelvin) / 1000 */ double As = a * 4.184; double Bs = b * 4.184 * 1000.; double Cs = 0.0; double Ds = 0.0; double Es = c * 4.184 / (1.0E6); double t = 298.15 / 1000.; double H298smFs = As * t + Bs * t * t / 2.0 - Es / t; double HcalcS = Hcalc / 1.0E6; double Fs = HcalcS - H298smFs; double S298smGs = As * log(t) + Bs * t - Es/(2.0*t*t); double ScalcS = e / 1.0E3; double Gs = ScalcS - S298smGs; c0[0] = As; c0[1] = Bs; c0[2] = Cs; c0[3] = Ds; c0[4] = Es; c0[5] = Fs; c0[6] = Gs; coef[0] = tmax0 - 0.001; copy(c0.begin(), c0.begin()+7, coef.begin() + 1); copy(c0.begin(), c0.begin()+7, coef.begin() + 8); sp.install(speciesName, k, SHOMATE, &coef[0], tmin0, tmax0, p0); }