void installElements(Phase& th, const XML_Node& phaseNode) { // get the declared element names if (!phaseNode.hasChild("elementArray")) { throw CanteraError("installElements", "phase XML node doesn't have \"elementArray\" XML Node"); } XML_Node& elements = phaseNode.child("elementArray"); vector<string> enames; getStringArray(elements, enames); // // element database defaults to elements.xml string element_database = "elements.xml"; if (elements.hasAttrib("datasrc")) { element_database = elements["datasrc"]; } XML_Node* doc = get_XML_File(element_database); XML_Node* dbe = &doc->child("elementData"); XML_Node& root = phaseNode.root(); XML_Node* local_db = 0; if (root.hasChild("elementData")) { local_db = &root.child("elementData"); } for (size_t i = 0; i < enames.size(); i++) { // Find the element data XML_Node* e = 0; if (local_db) { e = local_db->findByAttr("name",enames[i]); } if (!e) { e = dbe->findByAttr("name",enames[i]); } if (!e) { throw CanteraError("addElementsFromXML","no data for element " +enames[i]); } // Add the element doublereal weight = 0.0; if (e->hasAttrib("atomicWt")) { weight = fpValue(e->attrib("atomicWt")); } int anum = 0; if (e->hasAttrib("atomicNumber")) { anum = intValue(e->attrib("atomicNumber")); } string symbol = e->attrib("name"); doublereal entropy298 = ENTROPY298_UNKNOWN; if (e->hasChild("entropy298")) { XML_Node& e298Node = e->child("entropy298"); if (e298Node.hasAttrib("value")) { entropy298 = fpValueCheck(e298Node["value"]); } } th.addElement(symbol, weight, anum, entropy298); } }
void getString(const XML_Node& node, const std::string& titleString, std::string& valueString, std::string& typeString) { XML_Node* s = getByTitle(node, titleString); if (s && s->name() == "string") { valueString = s->value(); typeString = s->attrib("type"); } else { valueString = ""; typeString = ""; } }
void MineralEQ3::initThermoXML(XML_Node& phaseNode, const std::string& id_) { // Find the Thermo XML node if (!phaseNode.hasChild("thermo")) { throw CanteraError("HMWSoln::initThermoXML", "no thermo XML node"); } const XML_Node* xsp = speciesData()[0]; XML_Node* aStandardState = 0; if (xsp->hasChild("standardState")) { aStandardState = &xsp->child("standardState"); } else { throw CanteraError("MineralEQ3::initThermoXML", "no standard state mode"); } doublereal volVal = 0.0; if (aStandardState->attrib("model") != "constantVolume") { throw CanteraError("MineralEQ3::initThermoXML", "wrong standard state mode"); } if (aStandardState->hasChild("V0_Pr_Tr")) { XML_Node& aV = aStandardState->child("V0_Pr_Tr"); double Afactor = toSI("cm3/gmol"); if (aV.hasAttrib("units")) { Afactor = toSI(aV.attrib("units")); } volVal = getFloat(*aStandardState, "V0_Pr_Tr"); m_V0_pr_tr= volVal; volVal *= Afactor; } else { throw CanteraError("MineralEQ3::initThermoXML", "wrong standard state mode"); } setDensity(molecularWeight(0) / volVal); const XML_Node& MinEQ3node = xsp->child("thermo").child("MinEQ3"); m_deltaG_formation_pr_tr = getFloat(MinEQ3node, "DG0_f_Pr_Tr", "actEnergy") / actEnergyToSI("cal/gmol"); m_deltaH_formation_pr_tr = getFloat(MinEQ3node, "DH0_f_Pr_Tr", "actEnergy") / actEnergyToSI("cal/gmol"); m_Entrop_pr_tr = getFloat(MinEQ3node, "S0_Pr_Tr", "toSI") / toSI("cal/gmol/K"); m_a = getFloat(MinEQ3node, "a", "toSI") / toSI("cal/gmol/K"); m_b = getFloat(MinEQ3node, "b", "toSI") / toSI("cal/gmol/K2"); m_c = getFloat(MinEQ3node, "c", "toSI") / toSI("cal-K/gmol"); convertDGFormation(); }
/*! * * @param spDataNodeList, This vector contains a list * of species XML nodes that will be in the phase * * @todo Make sure that spDadta_node is species Data XML node by checking its name is speciesData */ static void getSpeciesThermoTypes(std::vector<XML_Node *> & spDataNodeList, int& has_nasa, int& has_shomate, int& has_simple, int &has_other) { size_t ns = spDataNodeList.size(); for (size_t n = 0; n < ns; n++) { XML_Node* spNode = spDataNodeList[n]; if (spNode->hasChild("standardState")) { const XML_Node& ss = spNode->child("standardState"); string mname = ss["model"]; if (mname == "water" || mname == "waterIAPWS") { has_other = 1; continue; } } if (spNode->hasChild("thermo")) { const XML_Node& th = spNode->child("thermo"); if (th.hasChild("NASA")) { has_nasa = 1; } else if (th.hasChild("Shomate")) { has_shomate = 1; } else if (th.hasChild("MinEQ3")) { has_shomate = 1; } else if (th.hasChild("const_cp")) { has_simple = 1; } else if (th.hasChild("poly")) { if (th.child("poly")["order"] == "1") has_simple = 1; else throw CanteraError("newSpeciesThermo", "poly with order > 1 not yet supported"); } else if (th.hasChild("Mu0")) { has_other = 1; } else if (th.hasChild("NASA9")) { has_other = 1; } else if (th.hasChild("NASA9MULTITEMP")) { has_other = 1; } else if (th.hasChild("adsorbate")) { has_other = 1; } else { has_other = 1; //throw UnknownSpeciesThermoModel("getSpeciesThermoTypes:", // spNode->attrib("name"), "missing"); } } else { throw CanteraError("getSpeciesThermoTypes:", spNode->attrib("name") + " is missing the thermo XML node"); } } }
void RedlichKisterVPSSTP::readXMLBinarySpecies(XML_Node& xmLBinarySpecies) { std::string xname = xmLBinarySpecies.name(); if (xname != "binaryNeutralSpeciesParameters") { throw CanteraError("RedlichKisterVPSSTP::readXMLBinarySpecies", "Incorrect name for processing this routine: " + xname); } size_t Npoly = 0; vector_fp hParams, sParams; std::string iName = xmLBinarySpecies.attrib("speciesA"); if (iName == "") { throw CanteraError("RedlichKisterVPSSTP::readXMLBinarySpecies", "no speciesA attrib"); } std::string jName = xmLBinarySpecies.attrib("speciesB"); if (jName == "") { throw CanteraError("RedlichKisterVPSSTP::readXMLBinarySpecies", "no speciesB attrib"); } /* * Find the index of the species in the current phase. It's not * an error to not find the species. This means that the interaction doesn't occur for the current * implementation of the phase. */ size_t iSpecies = speciesIndex(iName); if (iSpecies == npos) { return; } string ispName = speciesName(iSpecies); if (charge(iSpecies) != 0) { throw CanteraError("RedlichKisterVPSSTP::readXMLBinarySpecies", "speciesA charge problem"); } size_t jSpecies = speciesIndex(jName); if (jSpecies == npos) { return; } std::string jspName = speciesName(jSpecies); if (charge(jSpecies) != 0) { throw CanteraError("RedlichKisterVPSSTP::readXMLBinarySpecies", "speciesB charge problem"); } /* * Ok we have found a valid interaction */ numBinaryInteractions_++; size_t iSpot = numBinaryInteractions_ - 1; m_pSpecies_A_ij.resize(numBinaryInteractions_); m_pSpecies_B_ij.resize(numBinaryInteractions_); m_pSpecies_A_ij[iSpot] = iSpecies; m_pSpecies_B_ij[iSpot] = jSpecies; for (size_t iChild = 0; iChild < xmLBinarySpecies.nChildren(); iChild++) { XML_Node& xmlChild = xmLBinarySpecies.child(iChild); string nodeName = lowercase(xmlChild.name()); /* * Process the binary species interaction child elements */ if (nodeName == "excessenthalpy") { /* * Get the string containing all of the values */ getFloatArray(xmlChild, hParams, true, "toSI", "excessEnthalpy"); Npoly = std::max(hParams.size(), Npoly); } if (nodeName == "excessentropy") { /* * Get the string containing all of the values */ getFloatArray(xmlChild, sParams, true, "toSI", "excessEntropy"); Npoly = std::max(sParams.size(), Npoly); } } hParams.resize(Npoly, 0.0); sParams.resize(Npoly, 0.0); m_HE_m_ij.push_back(hParams); m_SE_m_ij.push_back(sParams); m_N_ij.push_back(Npoly); resizeNumInteractions(numBinaryInteractions_); }
/* * Examine the types of species thermo parameterizations, * and return a flag indicating the type of parameterization * needed by the species. * * @param spData_node Species Data XML node. This node contains a list * of species XML nodes underneath it. * * @todo Make sure that spDadta_node is species Data XML node by checking * its name is speciesData */ static void getVPSSMgrTypes(std::vector<XML_Node *> & spDataNodeList, int &has_nasa_idealGas, int &has_nasa_constVol, int& has_shomate_idealGas, int& has_shomate_constVol, int& has_simple_idealGas, int& has_simple_constVol, int &has_water, int &has_tpx, int &has_hptx, int &has_other) { XML_Node *ss_ptr = 0; string ssModel = "idealGas"; size_t ns = spDataNodeList.size(); for (size_t n = 0; n < ns; n++) { bool ifound = false; XML_Node* spNode = spDataNodeList[n]; if (spNode->hasChild("standardState")) { const XML_Node& ssN = spNode->child("standardState"); string mm = ssN["model"]; if (mm == "waterIAPWS" || mm == "waterPDSS") { has_water++; ifound = true; } if (mm == "HKFT") { has_hptx++; ifound = true; } } if (!ifound) { if (spNode->hasChild("thermo")) { const XML_Node& th = spNode->child("thermo"); if (spNode->hasChild("standardState")) { ss_ptr = &(spNode->child("standardState")); ssModel = ss_ptr->attrib("model"); } if (th.hasChild("NASA")) { if (ssModel == "idealGas") { has_nasa_idealGas++; } else if (ssModel == "constant_incompressible" || ssModel == "constantVolume") { has_nasa_constVol++; } else { throw UnknownVPSSMgrModel("getVPSSMgrTypes:", spNode->attrib("name")); } ifound = true; } if (th.hasChild("Shomate")) { if (ssModel == "idealGas") { has_shomate_idealGas++; } else if (ssModel == "constant_incompressible" || ssModel == "constantVolume") { has_shomate_constVol++; } else { throw UnknownVPSSMgrModel("getVPSSMgrTypes:", spNode->attrib("name")); } ifound = true; } if (th.hasChild("const_cp")){ if (ssModel == "idealGas") { has_simple_idealGas++; } else if (ssModel == "constant_incompressible" || ssModel == "constantVolume") { has_simple_constVol++; } else { throw UnknownVPSSMgrModel("getVPSSMgrTypes:", spNode->attrib("name")); } ifound = true; } if (th.hasChild("poly")) { if (th.child("poly")["order"] == "1") { has_simple_constVol = 1; ifound = true; } else throw CanteraError("newSpeciesThermo", "poly with order > 1 not yet supported"); } if (th.hasChild("Mu0")) { has_other++; ifound = true; } if (th.hasChild("NASA9")) { has_other++; ifound = true; } if (th.hasChild("NASA9MULTITEMP")) { has_other++; ifound = true; } if (th.hasChild("adsorbate")) { has_other++; ifound = true; } if (th.hasChild("HKFT")) { has_hptx++; ifound = true; } } else { throw UnknownVPSSMgrModel("getVPSSMgrTypes:", spNode->attrib("name")); } } } }
void MixedSolventElectrolyte::readXMLBinarySpecies(XML_Node& xmLBinarySpecies) { string xname = xmLBinarySpecies.name(); if (xname != "binaryNeutralSpeciesParameters") { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies", "Incorrect name for processing this routine: " + xname); } string stemp; size_t nParamsFound; vector_fp vParams; string iName = xmLBinarySpecies.attrib("speciesA"); if (iName == "") { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies", "no speciesA attrib"); } string jName = xmLBinarySpecies.attrib("speciesB"); if (jName == "") { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies", "no speciesB attrib"); } /* * Find the index of the species in the current phase. It's not * an error to not find the species */ size_t iSpecies = speciesIndex(iName); if (iSpecies == npos) { return; } string ispName = speciesName(iSpecies); if (charge(iSpecies) != 0) { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies", "speciesA charge problem"); } size_t jSpecies = speciesIndex(jName); if (jSpecies == npos) { return; } string jspName = speciesName(jSpecies); if (charge(jSpecies) != 0) { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies", "speciesB charge problem"); } resizeNumInteractions(numBinaryInteractions_ + 1); size_t iSpot = numBinaryInteractions_ - 1; m_pSpecies_A_ij[iSpot] = iSpecies; m_pSpecies_B_ij[iSpot] = jSpecies; size_t num = xmLBinarySpecies.nChildren(); for (size_t iChild = 0; iChild < num; iChild++) { XML_Node& xmlChild = xmLBinarySpecies.child(iChild); stemp = xmlChild.name(); string nodeName = lowercase(stemp); /* * Process the binary species interaction child elements */ if (nodeName == "excessenthalpy") { /* * Get the string containing all of the values */ ctml::getFloatArray(xmlChild, vParams, true, "toSI", "excessEnthalpy"); nParamsFound = vParams.size(); if (nParamsFound != 2) { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies::excessEnthalpy for " + ispName + "::" + jspName, "wrong number of params found"); } m_HE_b_ij[iSpot] = vParams[0]; m_HE_c_ij[iSpot] = vParams[1]; } if (nodeName == "excessentropy") { /* * Get the string containing all of the values */ ctml::getFloatArray(xmlChild, vParams, true, "toSI", "excessEntropy"); nParamsFound = vParams.size(); if (nParamsFound != 2) { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies::excessEntropy for " + ispName + "::" + jspName, "wrong number of params found"); } m_SE_b_ij[iSpot] = vParams[0]; m_SE_c_ij[iSpot] = vParams[1]; } if (nodeName == "excessvolume_enthalpy") { /* * Get the string containing all of the values */ ctml::getFloatArray(xmlChild, vParams, true, "toSI", "excessVolume_Enthalpy"); nParamsFound = vParams.size(); if (nParamsFound != 2) { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies::excessVolume_Enthalpy for " + ispName + "::" + jspName, "wrong number of params found"); } m_VHE_b_ij[iSpot] = vParams[0]; m_VHE_c_ij[iSpot] = vParams[1]; } if (nodeName == "excessvolume_entropy") { /* * Get the string containing all of the values */ ctml::getFloatArray(xmlChild, vParams, true, "toSI", "excessVolume_Entropy"); nParamsFound = vParams.size(); if (nParamsFound != 2) { throw CanteraError("MixedSolventElectrolyte::readXMLBinarySpecies::excessVolume_Entropy for " + ispName + "::" + jspName, "wrong number of params found"); } m_VSE_b_ij[iSpot] = vParams[0]; m_VSE_c_ij[iSpot] = vParams[1]; } } }
void MargulesVPSSTP::readXMLBinarySpecies(XML_Node& xmLBinarySpecies) { string xname = xmLBinarySpecies.name(); if (xname != "binaryNeutralSpeciesParameters") { throw CanteraError("MargulesVPSSTP::readXMLBinarySpecies", "Incorrect name for processing this routine: " + xname); } string aName = xmLBinarySpecies.attrib("speciesA"); if (aName == "") { throw CanteraError("MargulesVPSSTP::readXMLBinarySpecies", "no speciesA attrib"); } string bName = xmLBinarySpecies.attrib("speciesB"); if (bName == "") { throw CanteraError("MargulesVPSSTP::readXMLBinarySpecies", "no speciesB attrib"); } vector_fp vParams; double h0 = 0.0; double h1 = 0.0; double s0 = 0.0; double s1 = 0.0; double vh0 = 0.0; double vh1 = 0.0; double vs0 = 0.0; double vs1 = 0.0; for (size_t iChild = 0; iChild < xmLBinarySpecies.nChildren(); iChild++) { XML_Node& xmlChild = xmLBinarySpecies.child(iChild); string nodeName = toLowerCopy(xmlChild.name()); // Process the binary species interaction parameters. // They are in subblocks labeled: // excessEnthalpy // excessEntropy // excessVolume_Enthalpy // excessVolume_Entropy // Other blocks are currently ignored. // @TODO determine a policy about ignoring blocks that should or shouldn't be there. if (nodeName == "excessenthalpy") { // Get the string containing all of the values getFloatArray(xmlChild, vParams, true, "toSI", "excessEnthalpy"); if (vParams.size() != 2) { throw CanteraError("MargulesVPSSTP::readXMLBinarySpecies" "excessEnthalpy for {} : {}: wrong number of params found." " Need 2", aName, bName); } h0 = vParams[0]; h1 = vParams[1]; } else if (nodeName == "excessentropy") { // Get the string containing all of the values getFloatArray(xmlChild, vParams, true, "toSI", "excessEntropy"); if (vParams.size() != 2) { throw CanteraError("MargulesVPSSTP::readXMLBinarySpecies" "excessEntropy for {} : {}: wrong number of params found." " Need 2", aName, bName); } s0 = vParams[0]; s1 = vParams[1]; } else if (nodeName == "excessvolume_enthalpy") { // Get the string containing all of the values getFloatArray(xmlChild, vParams, true, "toSI", "excessVolume_Enthalpy"); if (vParams.size() != 2) { throw CanteraError("MargulesVPSSTP::readXMLBinarySpecies" "excessVolume_Enthalpy for {} : {}: wrong number of params" " found. Need 2", aName, bName); } vh0 = vParams[0]; vh1 = vParams[1]; } else if (nodeName == "excessvolume_entropy") { // Get the string containing all of the values getFloatArray(xmlChild, vParams, true, "toSI", "excessVolume_Entropy"); if (vParams.size() != 2) { throw CanteraError("MargulesVPSSTP::readXMLBinarySpecies" "excessVolume_Entropy for {} : {}: wrong number of params" " found. Need 2", aName, bName); } vs0 = vParams[0]; vs1 = vParams[1]; } } addBinaryInteraction(aName, bName, h0, h1, s0, s1, vh0, vh1, vs0, vs1); }