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
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.
vector_fp m_atomicWeights; //!< element atomic weights (kg kmol-1)
vector_int m_atomicNumbers; //!< element atomic numbers

View file

@ -175,20 +175,20 @@ 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;
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<Species> 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) {