diff --git a/Cantera/src/LatticeSolidPhase.cpp b/Cantera/src/LatticeSolidPhase.cpp index 79c08c03d..61bd55146 100644 --- a/Cantera/src/LatticeSolidPhase.cpp +++ b/Cantera/src/LatticeSolidPhase.cpp @@ -94,6 +94,36 @@ namespace Cantera { m_cp0_R.resize(leng); m_s0_R.resize(leng); setMolarDensity(m_molar_density); + + const vector& spnames = speciesNames(); + int n, k, kl, namesize; + int nl = m_sitedens.size(); + string s; + m_lattice.resize(m_kk,-1); + vector_fp conc(m_kk, 0.0); + + compositionMap xx; + for (n = 0; n < nl; n++) { + for (k = 0; k < m_kk; k++) { + xx[speciesName(k)] = -1.0; + } + parseCompString(m_sp[n], xx); + for (k = 0; k < m_kk; k++) { + if (xx[speciesName(k)] != -1.0) { + conc[k] = m_sitedens[n]*xx[speciesName(k)]; + m_lattice[k] = n; + } + } + + } + for (k = 0; k < m_kk; k++) { + if (m_lattice[k] == -1) { + throw CanteraError("LatticeSolidPhase::" + "setParametersFromXML","Species "+speciesName(k) + +" not a member of any lattice."); + } + } + setMoleFractions(DATA_PTR(conc)); } @@ -125,10 +155,13 @@ namespace Cantera { doublereal site_density; string vacancy; doublereal sum = 0.0; + string s; for (n = 0; n < nl; n++) { XML_Node& i = *lattices[n]; site_density = getFloat(i, "site_density", "-"); vacancy = getString(i, "vacancy_species"); + s = getString(i, "species"); + m_sp.push_back(s); m_vac.push_back(vacancy); m_sitedens.push_back(site_density); sum += site_density; diff --git a/Cantera/src/LatticeSolidPhase.h b/Cantera/src/LatticeSolidPhase.h index 26dfd7919..bac65af91 100644 --- a/Cantera/src/LatticeSolidPhase.h +++ b/Cantera/src/LatticeSolidPhase.h @@ -96,6 +96,10 @@ namespace Cantera { // new methods defined here + double latticeMoleFraction(int k) { + return moleFraction(k)*molarDensity()/m_sitedens[m_lattice[k]]; + } + const array_fp& enthalpy_RT() const { _updateThermo(); return m_h0_RT; @@ -144,7 +148,8 @@ namespace Cantera { vector m_vac; vector_fp m_sitedens; doublereal m_molar_density; - + vector m_lattice; + vector m_sp; private: void _updateThermo() const;