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); } }
MetalSHEelectrons::MetalSHEelectrons(const std::string& infile, std::string id_) : SingleSpeciesTP(), xdef_(0) { XML_Node* root; if (infile == "MetalSHEelectrons_default.xml") { xdef_ = MetalSHEelectrons::makeDefaultXMLTree(); root = xdef_; } else { root = get_XML_File(infile); } if (id_ == "-") { id_ = ""; } XML_Node* xphase = get_XML_NameID("phase", std::string("#")+id_, root); if (!xphase) { throw CanteraError("MetalSHEelectrons::MetalSHEelectrons", "Couldn't find phase name in file:" + id_); } // Check the model name to ensure we have compatibility const XML_Node& th = xphase->child("thermo"); std::string model = th["model"]; if (model != "MetalSHEelectrons") { throw CanteraError("MetalSHEelectrons::MetalSHEelectrons", "thermo model attribute must be MetalSHEelectrons"); } importPhase(*xphase, this); }
SurfPhase::SurfPhase(std::string infile, std::string id) : ThermoPhase(), m_n0(0.0), m_logn0(0.0), m_tmin(0.0), m_tmax(0.0), m_press(OneAtm), m_tlast(0.0) { XML_Node* root = get_XML_File(infile); if (id == "-") id = ""; XML_Node* xphase = get_XML_NameID("phase", std::string("#")+id, root); if (!xphase) { throw CanteraError("SurfPhase::SurfPhase", "Couldn't find phase name in file:" + id); } // Check the model name to ensure we have compatibility const XML_Node& th = xphase->child("thermo"); string model = th["model"]; if (model != "Surface" && model != "Edge") { throw CanteraError("SurfPhase::SurfPhase", "thermo model attribute must be Surface or Edge"); } importPhase(*xphase, this); }
static void SetUpTestCase() { XML_Node* phase_node = get_XML_File("../data/pdep-test.xml"); thermo_ = new IdealGasPhase(); kin_ = new GasKinetics(); buildSolutionFromXML(*phase_node, "gas", "phase", thermo_, kin_); }
void ThermoPhase::initThermoFile(const std::string& inputFile, const std::string& id) { XML_Node* fxml = get_XML_File(inputFile); XML_Node* fxml_phase = findXMLPhase(fxml, id); if (!fxml_phase) { throw CanteraError("ThermoPhase::initThermoFile", "ERROR: Can not find phase named {} in file" " named {}", id, inputFile); } importPhase(*fxml_phase, this); }
ThermoPhase* newPhase(const std::string& infile, std::string id) { XML_Node* root = get_XML_File(infile); if (id == "-") { id = ""; } XML_Node* xphase = get_XML_NameID("phase", "#"+id, root); if (!xphase) { throw CanteraError("newPhase", "Couldn't find phase named \"" + id + "\" in file, " + infile); } return newPhase(*xphase); }
ThermoPhase* newPhase(std::string infile, std::string id) { XML_Node* root = get_XML_File(infile); if (id == "-") id = ""; XML_Node* xphase = get_XML_NameID("phase", std::string("#")+id, root); if (!xphase) { throw CanteraError("newPhase", "Couldn't find phase named \"" + id + "\" in file, " + infile); } if (xphase) return newPhase(*xphase); else return (ThermoPhase *) 0; }
void Phase::addElementsFromXML(const XML_Node& phase) { // get the declared element names if (! phase.hasChild("elementArray")) { throw CanteraError("Elements::addElementsFromXML", "phase xml node doesn't have \"elementArray\" XML Node"); } XML_Node& elements = phase.child("elementArray"); vector<string> enames; ctml::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("ctml/elementData"); XML_Node& root = phase.root(); XML_Node* local_db = 0; if (root.hasChild("ctml")) { if (root.child("ctml").hasChild("elementData")) { local_db = &root.child("ctml/elementData"); } } int nel = static_cast<int>(enames.size()); int i; string enm; XML_Node* e = 0; for (i = 0; i < nel; i++) { e = 0; if (local_db) { //writelog("looking in local database."); e = local_db->findByAttr("name",enames[i]); //if (!e) writelog(enames[i]+" not found."); } if (!e) { e = dbe->findByAttr("name",enames[i]); } if (e) { addUniqueElement(*e); } else { throw CanteraError("addElementsFromXML","no data for element " +enames[i]); } } }
IdealSolnGasVPSS::IdealSolnGasVPSS(std::string infile, std::string id) : VPStandardStateTP(), m_idealGas(0), m_formGC(0) { XML_Node* root = get_XML_File(infile); if (id == "-") id = ""; XML_Node* xphase = get_XML_NameID("phase", std::string("#")+id, root); if (!xphase) { throw CanteraError("newPhase", "Couldn't find phase named \"" + id + "\" in file, " + infile); } importPhase(*xphase, this); }
/* * @param infile name of the input file * @param id name of the phase id in the file. * If this is blank, the first phase in the file is used. */ electrodeElectron::electrodeElectron(std::string infile, std::string id) : StoichSubstanceSSTP() { XML_Node* root = get_XML_File(infile); if (id == "-") id = ""; XML_Node* xphase = get_XML_NameID("phase", std::string("#")+id, root); if (!xphase) { throw CanteraError("electrodeElectron::electrodeElectron", "Couldn't find phase name in file:" + id); } // Check the model name to ensure we have compatibility const XML_Node& th = xphase->child("thermo"); std::string model = th["model"]; if (model != "electrodeElectron") { throw CanteraError("electrodeElectron::electrodeElectron", "thermo model attribute must be electrodeElectron"); } importPhase(*xphase, this); }
StoichSubstanceSSTP::StoichSubstanceSSTP(const std::string& infile, std::string id_) { XML_Node* root = get_XML_File(infile); if (id_ == "-") { id_ = ""; } XML_Node* xphase = get_XML_NameID("phase", std::string("#")+id_, root); if (!xphase) { throw CanteraError("StoichSubstanceSSTP::StoichSubstanceSSTP", "Couldn't find phase name in file:" + id_); } // Check the model name to ensure we have compatibility std::string model = xphase->child("thermo")["model"]; if (model != "StoichSubstance" && model != "StoichSubstanceSSTP") { throw CanteraError("StoichSubstanceSSTP::StoichSubstanceSSTP", "thermo model attribute must be StoichSubstance"); } importPhase(*xphase, this); }
XML_Node* get_XML_NameID(const std::string& nameTarget, const std::string& file_ID, XML_Node* root) { string fname, idTarget; XML_Node* db, *doc; split_at_pound(file_ID, fname, idTarget); if (fname == "") { if (!root) { return 0; } db = root->findNameID(nameTarget, idTarget); } else { doc = get_XML_File(fname); if (!doc) { return 0; } db = doc->findNameID(nameTarget, idTarget); } return db; }
XML_Node* get_XML_Node(const std::string& file_ID, XML_Node* root) { std::string fname, idstr; XML_Node* db, *doc; split_at_pound(file_ID, fname, idstr); if (fname == "") { if (!root) throw CanteraError("get_XML_Node", "no file name given. file_ID = "+file_ID); db = root->findID(idstr, 3); } else { doc = get_XML_File(fname); if (!doc) throw CanteraError("get_XML_Node", "get_XML_File failed trying to open "+fname); db = doc->findID(idstr, 3); } if (!db) { throw CanteraError("get_XML_Node", "id tag '"+idstr+"' not found."); } return db; }
/* * @param infile name of the input file * @param id name of the phase id in the file. * If this is blank, the first phase in the file is used. */ FixedChemPotSSTP::FixedChemPotSSTP(std::string infile, std::string id) : SingleSpeciesTP(), chemPot_(0.0) { XML_Node* root = get_XML_File(infile); if (id == "-") { id = ""; } XML_Node* xphase = get_XML_NameID("phase", std::string("#")+id, root); if (!xphase) { throw CanteraError("FixedChemPotSSTP::FixedChemPotSSTP", "Couldn't find phase name in file:" + id); } // Check the model name to ensure we have compatibility const XML_Node& th = xphase->child("thermo"); std::string model = th["model"]; if (model != "StoichSubstance" && model != "StoichSubstanceSSTP" && model != "FixedChemPot") { throw CanteraError("FixedChemPotSSTP::FixedChemPotSSTP", "thermo model attribute must be FixedChemPot or StoichSubstance"); } importPhase(*xphase, this); }
size_t Phase::addElement(const std::string& symbol, doublereal weight, int atomic_number, doublereal entropy298, int elem_type) { // Look up the atomic weight if not given if (weight == 0.0) { try { weight = getElementWeight(symbol); } catch (CanteraError&) { // assume this is just a custom element with zero atomic weight } } else if (weight == -12345.0) { weight = getElementWeight(symbol); } // Try to look up the standard entropy if not given. Fail silently. if (entropy298 == ENTROPY298_UNKNOWN) { try { XML_Node* db = get_XML_File("elements.xml"); XML_Node* elnode = db->findByAttr("name", symbol); if (elnode && elnode->hasChild("entropy298")) { entropy298 = fpValueCheck(elnode->child("entropy298")["value"]); } } catch (CanteraError&) { } } // Check for duplicates auto iter = find(m_elementNames.begin(), m_elementNames.end(), symbol); if (iter != m_elementNames.end()) { size_t m = iter - m_elementNames.begin(); if (m_atomicWeights[m] != weight) { throw CanteraError("Phase::addElement", "Duplicate elements ({}) have different weights", symbol); } else { // Ignore attempt to add duplicate element with the same weight return m; } } // Add the new element m_atomicWeights.push_back(weight); m_elementNames.push_back(symbol); m_atomicNumbers.push_back(atomic_number); m_entropy298.push_back(entropy298); if (symbol == "E") { m_elem_type.push_back(CT_ELEM_TYPE_ELECTRONCHARGE); } else { m_elem_type.push_back(elem_type); } m_mm++; // Update species compositions if (m_kk) { vector_fp old(m_speciesComp); m_speciesComp.resize(m_kk*m_mm, 0.0); for (size_t k = 0; k < m_kk; k++) { size_t m_old = m_mm - 1; for (size_t m = 0; m < m_old; m++) { m_speciesComp[k * m_mm + m] = old[k * (m_old) + m]; } m_speciesComp[k * (m_mm) + (m_mm-1)] = 0.0; } } return m_mm-1; }