Fixed some indexing problems in the equilibrium solvers

The expression (m_nsp - m_nel) where both of the variables are
unsigned types was being used as an array size and an upper bound for
some loop indices, neither of which work when there are more elements
than species.
This commit is contained in:
Ray Speth 2012-04-12 21:35:47 +00:00
parent d51bd82787
commit 22806f2896
3 changed files with 20 additions and 19 deletions

View file

@ -50,7 +50,7 @@ public:
void getStoichVector(index_t rxn, vector_fp& nu) {
index_t k;
nu.resize(m_nsp, 0.0);
if (rxn > m_nsp - m_nel) {
if (rxn > nFree()) {
return;
}
for (k = 0; k < m_nsp; k++) {
@ -123,6 +123,11 @@ protected:
m_mix->speciesName(m_species[m_order[n]]);
}
//! Number of degrees of freedom
index_t nFree() const {
return (m_nsp > m_nel) ? m_nsp - m_nel : 0;
}
index_t m_nel_mix, m_nsp_mix, m_np;
index_t m_nel, m_nsp;
index_t m_eloc;

View file

@ -103,10 +103,6 @@ void ChemEquil::initialize(thermo_t& s)
m_kk = s.nSpecies();
m_mm = s.nElements();
m_nComponents = m_mm;
//if (m_kk < m_mm) {
//throw CanteraError("ChemEquil::initialize",
// "number of species cannot be less than the number of elements.");
//}
// allocate space in internal work arrays within the ChemEquil object
m_molefractions.resize(m_kk);

View file

@ -156,7 +156,7 @@ MultiPhaseEquil::MultiPhaseEquil(MultiPhase* mix, bool start, int loglevel) : m_
// number of moles of each species
m_moles.resize(m_nsp);
m_lastmoles.resize(m_nsp);
m_dxi.resize(m_nsp - m_nel);
m_dxi.resize(nFree());
// initialize the mole numbers to the mixture composition
index_t ik;
@ -165,15 +165,15 @@ MultiPhaseEquil::MultiPhaseEquil(MultiPhase* mix, bool start, int loglevel) : m_
}
// Delta G / RT for each reaction
m_deltaG_RT.resize(m_nsp - m_nel, 0.0);
m_deltaG_RT.resize(nFree(), 0.0);
m_majorsp.resize(m_nsp);
m_sortindex.resize(m_nsp,0);
m_lastsort.resize(m_nel);
m_solnrxn.resize(m_nsp - m_nel);
m_solnrxn.resize(nFree());
m_A.resize(m_nel, m_nsp, 0.0);
m_N.resize(m_nsp, m_nsp - m_nel);
m_order.resize(m_nsp, 0);
m_N.resize(m_nsp, nFree());
m_order.resize(std::max(m_nsp, m_nel), 0);
for (k = 0; k < m_nsp; k++) {
m_order[k] = k;
}
@ -189,7 +189,7 @@ MultiPhaseEquil::MultiPhaseEquil(MultiPhase* mix, bool start, int loglevel) : m_
// Take a very small step in composition space, so that no
// species has precisely zero moles.
vector_fp dxi(m_nsp - m_nel, 1.0e-20);
vector_fp dxi(nFree(), 1.0e-20);
if (!dxi.empty()) {
multiply(m_N, DATA_PTR(dxi), DATA_PTR(m_work));
unsort(m_work);
@ -325,7 +325,7 @@ int MultiPhaseEquil::setInitialMoles(int loglevel)
}
// loop over all reactions
for (j = 0; j < m_nsp - m_nel; j++) {
for (j = 0; j < nFree(); j++) {
dg_rt = 0.0;
dxi_min = 1.0e10;
for (ik = 0; ik < m_nsp; ik++) {
@ -502,11 +502,11 @@ void MultiPhaseEquil::getComponents(const std::vector<size_t>& order)
// create stoichometric coefficient matrix.
for (size_t n = 0; n < m_nsp; n++) {
if (n < m_nel)
for (k = 0; k < m_nsp - m_nel; k++) {
for (k = 0; k < nFree(); k++) {
m_N(n, k) = -m_A(n, k + m_nel);
}
else {
for (k = 0; k < m_nsp - m_nel; k++) {
for (k = 0; k < nFree(); k++) {
m_N(n, k) = 0.0;
}
m_N(n, n - m_nel) = 1.0;
@ -514,7 +514,7 @@ void MultiPhaseEquil::getComponents(const std::vector<size_t>& order)
}
// find reactions involving solution phase species
for (j = 0; j < m_nsp - m_nel; j++) {
for (j = 0; j < nFree(); j++) {
m_solnrxn[j] = false;
for (k = 0; k < m_nsp; k++) {
if (m_N(k, j) != 0)
@ -570,7 +570,7 @@ void MultiPhaseEquil::printInfo(int loglevel)
addLogEntry("Error",fp2str(error()));
beginLogGroup("Delta G / RT");
}
for (k = 0; k < m_nsp - m_nel; k++) {
for (k = 0; k < nFree(); k++) {
if (loglevel > 0) {
addLogEntry(reactionString(k), fp2str(m_deltaG_RT[k]));
}
@ -764,12 +764,12 @@ doublereal MultiPhaseEquil::computeReactionSteps(vector_fp& dxi)
const doublereal TINY = 1.0e-20;
doublereal grad = 0.0;
dxi.resize(m_nsp - m_nel);
dxi.resize(nFree());
computeN();
doublereal not_mu = 1.0e12;
m_mix->getValidChemPotentials(not_mu, DATA_PTR(m_mu));
for (j = 0; j < m_nsp - m_nel; j++) {
for (j = 0; j < nFree(); j++) {
// get stoichiometric vector
getStoichVector(j, nu);
@ -892,7 +892,7 @@ doublereal MultiPhaseEquil::error()
doublereal err, maxerr = 0.0;
// examine every reaction
for (size_t j = 0; j < m_nsp - m_nel; j++) {
for (size_t j = 0; j < nFree(); j++) {
size_t ik = j + m_nel;
// don't require formation reactions for solution species