diff --git a/include/cantera/thermo/Phase.h b/include/cantera/thermo/Phase.h index 37ab5d5de..a82e69d78 100644 --- a/include/cantera/thermo/Phase.h +++ b/include/cantera/thermo/Phase.h @@ -859,6 +859,9 @@ private: //! Map of species names to indices std::map m_speciesIndices; + //! Map of lower-case species names to indices + std::map m_speciesLower; + size_t m_mm; //!< Number of elements. vector_fp m_atomicWeights; //!< element atomic weights (kg kmol-1) vector_int m_atomicNumbers; //!< element atomic numbers diff --git a/src/thermo/Phase.cpp b/src/thermo/Phase.cpp index a457c7ccb..a39cea996 100644 --- a/src/thermo/Phase.cpp +++ b/src/thermo/Phase.cpp @@ -175,18 +175,18 @@ void Phase::getAtoms(size_t k, double* atomArray) const size_t Phase::findSpeciesLower(const std::string& name) const { - size_t loc = npos; std::string nLower = toLowerCopy(name); - for (const auto& k : m_speciesIndices) { - if (toLowerCopy(k.first) == nLower) { - if (loc == npos) { - loc = k.second; - } else { - throw CanteraError("Phase::findSpeciesLower", - "Lowercase species name '{}' is not unique. " - "Set Phase::caseSensitiveSpecies to true to " - "enforce case sensitive species names", nLower); - } + size_t loc = npos; + auto it = m_speciesLower.find(nLower); + if (it == m_speciesLower.end()) { + return npos; + } else { + loc = it->second; + if (loc == npos) { + throw CanteraError("Phase::findSpeciesLower", + "Lowercase species name '{}' is not unique. " + "Set Phase::caseSensitiveSpecies to true to " + "enforce case sensitive species names", nLower); } } return loc; @@ -766,6 +766,13 @@ bool Phase::addSpecies(shared_ptr spec) { m_speciesCharge.push_back(spec->charge); size_t ne = nElements(); + std::string nLower = toLowerCopy(spec->name); + if (m_speciesLower.find(nLower) == m_speciesLower.end()) { + m_speciesLower[nLower] = m_kk; + } else { + m_speciesLower[nLower] = npos; + } + double wt = 0.0; const vector_fp& aw = atomicWeights(); if (spec->charge != 0.0) {