Implement faster fallback for non-canonical/lowercase name lookup

This commit is contained in:
Ingmar Schoegl 2019-09-23 17:59:11 -05:00 committed by Ray Speth
parent 5e692e893a
commit 9ce255302e
2 changed files with 21 additions and 11 deletions

View file

@ -859,6 +859,9 @@ private:
//! Map of species names to indices //! Map of species names to indices
std::map<std::string, size_t> m_speciesIndices; std::map<std::string, size_t> m_speciesIndices;
//! Map of lower-case species names to indices
std::map<std::string, size_t> m_speciesLower;
size_t m_mm; //!< Number of elements. size_t m_mm; //!< Number of elements.
vector_fp m_atomicWeights; //!< element atomic weights (kg kmol-1) vector_fp m_atomicWeights; //!< element atomic weights (kg kmol-1)
vector_int m_atomicNumbers; //!< element atomic numbers vector_int m_atomicNumbers; //!< element atomic numbers

View file

@ -175,18 +175,18 @@ void Phase::getAtoms(size_t k, double* atomArray) const
size_t Phase::findSpeciesLower(const std::string& name) const size_t Phase::findSpeciesLower(const std::string& name) const
{ {
size_t loc = npos;
std::string nLower = toLowerCopy(name); std::string nLower = toLowerCopy(name);
for (const auto& k : m_speciesIndices) { size_t loc = npos;
if (toLowerCopy(k.first) == nLower) { auto it = m_speciesLower.find(nLower);
if (loc == npos) { if (it == m_speciesLower.end()) {
loc = k.second; return npos;
} else { } else {
throw CanteraError("Phase::findSpeciesLower", loc = it->second;
"Lowercase species name '{}' is not unique. " if (loc == npos) {
"Set Phase::caseSensitiveSpecies to true to " throw CanteraError("Phase::findSpeciesLower",
"enforce case sensitive species names", nLower); "Lowercase species name '{}' is not unique. "
} "Set Phase::caseSensitiveSpecies to true to "
"enforce case sensitive species names", nLower);
} }
} }
return loc; return loc;
@ -766,6 +766,13 @@ bool Phase::addSpecies(shared_ptr<Species> spec) {
m_speciesCharge.push_back(spec->charge); m_speciesCharge.push_back(spec->charge);
size_t ne = nElements(); 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; double wt = 0.0;
const vector_fp& aw = atomicWeights(); const vector_fp& aw = atomicWeights();
if (spec->charge != 0.0) { if (spec->charge != 0.0) {