Eliminated "heapsort" function in favor of using std::sort

This commit is contained in:
Ray Speth 2012-01-18 03:42:52 +00:00
parent 1ff7c23860
commit 4cdac9a90f
4 changed files with 15 additions and 159 deletions

View file

@ -13,7 +13,6 @@
#include "ct_defs.h"
#include "global.h"
#include "sort.h"
#include "PropertyCalculator.h"
#include "ctexceptions.h"
#include "vec_functions.h"

View file

@ -6,7 +6,6 @@
#ifdef WITH_ELECTROLYTES
#include "MolalityVPSSTP.h"
#endif
#include "sort.h"
#include "global.h"
#include <math.h>
@ -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<std::pair<double, size_t> > 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) {

View file

@ -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<size_t>& 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;
}
}
}

View file

@ -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<size_t>& 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