From 4cdac9a90f046cd41ce878c28a1344a824578b84 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Wed, 18 Jan 2012 03:42:52 +0000 Subject: [PATCH] Eliminated "heapsort" function in favor of using std::sort --- Cantera/src/equil/ChemEquil.cpp | 1 - Cantera/src/equil/MultiPhaseEquil.cpp | 39 ++++----- Cantera/src/numerics/sort.cpp | 112 -------------------------- Cantera/src/numerics/sort.h | 22 ----- 4 files changed, 15 insertions(+), 159 deletions(-) delete mode 100755 Cantera/src/numerics/sort.cpp delete mode 100755 Cantera/src/numerics/sort.h diff --git a/Cantera/src/equil/ChemEquil.cpp b/Cantera/src/equil/ChemEquil.cpp index 005dfcf12..2e6c2d185 100755 --- a/Cantera/src/equil/ChemEquil.cpp +++ b/Cantera/src/equil/ChemEquil.cpp @@ -13,7 +13,6 @@ #include "ct_defs.h" #include "global.h" -#include "sort.h" #include "PropertyCalculator.h" #include "ctexceptions.h" #include "vec_functions.h" diff --git a/Cantera/src/equil/MultiPhaseEquil.cpp b/Cantera/src/equil/MultiPhaseEquil.cpp index 0393fc4bf..7f2475b6a 100644 --- a/Cantera/src/equil/MultiPhaseEquil.cpp +++ b/Cantera/src/equil/MultiPhaseEquil.cpp @@ -6,7 +6,6 @@ #ifdef WITH_ELECTROLYTES #include "MolalityVPSSTP.h" #endif -#include "sort.h" #include "global.h" #include @@ -799,35 +798,27 @@ namespace Cantera { } void MultiPhaseEquil::computeN() { - index_t m, k; + // Sort the list of species by mole fraction (decreasing order) + std::vector > moleFractions(m_nsp); + for (size_t k = 0; k < m_nsp; k++) { + // use -Xk to generate reversed sort order + moleFractions[k].first = - m_mix->speciesMoles(m_species[k]); + moleFractions[k].second = k; + } + std::sort(moleFractions.begin(), moleFractions.end()); + for (size_t k = 0; k < m_nsp; k++) { + m_sortindex[k] = moleFractions[k].second; + } - // get the species moles - - // sort mole fractions - doublereal molesum = 0.0; - for (k = 0; k < m_nsp; k++) { - m_work[k] = m_mix->speciesMoles(m_species[k]); - m_sortindex[k] = k; - molesum += m_work[k]; - } - heapsort(m_work, m_sortindex); - - // reverse order in sort index - index_t itmp; - for (k = 0; k < m_nsp/2; k++) { - itmp = m_sortindex[m_nsp-k-1]; - m_sortindex[m_nsp-k-1] = m_sortindex[k]; - m_sortindex[k] = itmp; - } - index_t ik, ij; bool ok; - for (m = 0; m < m_nel; m++) { - for (ik = 0; ik < m_nsp; ik++) { + for (size_t m = 0; m < m_nel; m++) { + size_t k; + for (size_t ik = 0; ik < m_nsp; ik++) { k = m_sortindex[ik]; if (m_mix->nAtoms(m_species[k],m_element[m]) != 0) break; } ok = false; - for (ij = 0; ij < m_nel; ij++) { + for (size_t ij = 0; ij < m_nel; ij++) { if (k == m_order[ij]) ok = true; } if (!ok || m_force) { diff --git a/Cantera/src/numerics/sort.cpp b/Cantera/src/numerics/sort.cpp deleted file mode 100755 index 19648d570..000000000 --- a/Cantera/src/numerics/sort.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @file sort.cpp - */ - -#include "sort.h" - -namespace Cantera { - - // sort (x,y) pairs by x - - void heapsort(vector_fp& x, std::vector& y) { - size_t n = x.size(); - if (n < 2) return; - doublereal rra; - size_t rrb; - size_t ll = n/2; - size_t iret = n-1; - - while (1 > 0) { - if (ll > 0) { - ll--; - rra = x[ll]; - rrb = y[ll]; - } - else { - rra = x[iret]; - rrb = y[iret]; - x[iret] = x[0]; - y[iret] = y[0]; - iret--; - if (iret == 0) { - x[0] = rra; - y[0] = rrb; - return; - } - } - - size_t i = ll; - size_t j = ll + ll + 1; - - while (j <= iret) { - if (j < iret) { - if (x[j] < x[j+1]) - j++; - } - if (rra < x[j]) { - x[i] = x[j]; - y[i] = y[j]; - i = j; - j = j + j + 1; - } - else { - j = iret + 1; - } - } - x[i] = rra; - y[i] = rrb; - } - } - - void heapsort(vector_fp& x, vector_fp& y) { - size_t n = x.size(); - if (n < 2) return; - doublereal rra; - doublereal rrb; - size_t ll = n/2; - size_t iret = n-1; - - while (1 > 0) { - if (ll > 0) { - ll--; - rra = x[ll]; - rrb = y[ll]; - } - else { - rra = x[iret]; - rrb = y[iret]; - x[iret] = x[0]; - y[iret] = y[0]; - iret--; - if (iret == 0) { - x[0] = rra; - y[0] = rrb; - return; - } - } - - size_t i = ll; - size_t j = ll + ll + 1; - - while (j <= iret) { - if (j < iret) { - if (x[j] < x[j+1]) - j++; - } - if (rra < x[j]) { - x[i] = x[j]; - y[i] = y[j]; - i = j; - j = j + j + 1; - } - else { - j = iret + 1; - } - } - x[i] = rra; - y[i] = rrb; - } - } - -} - diff --git a/Cantera/src/numerics/sort.h b/Cantera/src/numerics/sort.h deleted file mode 100755 index 0c5390cef..000000000 --- a/Cantera/src/numerics/sort.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @file sort.h - */ - -#ifndef CT_SORT_H -#define CT_SORT_H - -#include "ct_defs.h" - -namespace Cantera { - - /// Given two arrays x and y, sort the (x,y) pairs by the x - /// values. This version is for floating-point x, and integer y. - void heapsort(vector_fp& x, std::vector& y); - - /// Given two arrays x and y, sort the (x,y) pairs by the x - /// values. This version is for floating-point x, and - /// floating-point y. - void heapsort(vector_fp& x, vector_fp& y); -} - -#endif