Index: trunk/psLib/src/mathtypes/psVector.c
===================================================================
--- trunk/psLib/src/mathtypes/psVector.c	(revision 18300)
+++ trunk/psLib/src/mathtypes/psVector.c	(revision 18311)
@@ -10,6 +10,6 @@
 *  @author Joshua Hoblitt, University of Hawaii
 *
-*  @version $Revision: 1.101 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2007-11-29 21:46:54 $
+*  @version $Revision: 1.102 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2008-06-24 21:32:52 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -463,4 +463,69 @@
 }
 
+// Selection for different vector types
+#define PSVECTOR_SELECT_CASE(TYPE, COMPAREFUNC, SWAPFUNC, SWAPTYPE) \
+case PS_TYPE_##TYPE: { \
+    ps##TYPE *value = vector->data.TYPE; \
+    PSSELECT(vector->n, rank, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, SWAPTYPE); \
+    break; \
+}
+
+
+bool psVectorSelectInPlace(psVector *vector, long rank)
+{
+    PS_ASSERT_VECTOR_NON_NULL(vector, false);
+    PS_ASSERT_INT_NONNEGATIVE(rank, false);
+    PS_ASSERT_INT_LESS_THAN(rank, vector->n, false);
+
+    if (vector->n < 2) {
+        // Already sorted!
+        return true;
+    }
+
+    switch (vector->type.type) {
+        PSVECTOR_SELECT_CASE(U8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U8 );
+        PSVECTOR_SELECT_CASE(U16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U16);
+        PSVECTOR_SELECT_CASE(U32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U32);
+        PSVECTOR_SELECT_CASE(U64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U64);
+        PSVECTOR_SELECT_CASE(S8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S8 );
+        PSVECTOR_SELECT_CASE(S16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S16);
+        PSVECTOR_SELECT_CASE(S32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S32);
+        PSVECTOR_SELECT_CASE(S64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S64);
+        PSVECTOR_SELECT_CASE(F32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, F32);
+        PSVECTOR_SELECT_CASE(F64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, F64);
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                _("Input psVector is an unsupported type (0x%x)."),
+                vector->type.type);
+        return false;
+    }
+    return true;
+}
+
+psVector *psVectorSelect(psVector *out, const psVector *in, long rank)
+{
+    PS_ASSERT_VECTOR_NON_NULL(in, NULL);
+    PS_ASSERT_INT_NONNEGATIVE(rank, false);
+    PS_ASSERT_INT_LESS_THAN(rank, in->n, false);
+
+    if (out != in) {
+        out = psVectorCopy(out, in, in->type.type);
+        if (!out) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to copy vector to select.");
+            return NULL;
+        }
+    }
+
+    if (!psVectorSelectInPlace(out, rank)) {
+        if (out != in) {
+            // It was allocated here.
+            psFree(out);
+        }
+        return NULL;
+    }
+
+    return out;
+}
+
 psString psVectorToString(const psVector* vector,
                           int maxLength)
Index: trunk/psLib/src/mathtypes/psVector.h
===================================================================
--- trunk/psLib/src/mathtypes/psVector.h	(revision 18300)
+++ trunk/psLib/src/mathtypes/psVector.h	(revision 18311)
@@ -10,6 +10,6 @@
  * @author Joshua Hoblitt, University of Hawaii
  *
- * @version $Revision: 1.70 $ $Name: not supported by cvs2svn $
- * @date $Date: 2007-09-28 20:59:37 $
+ * @version $Revision: 1.71 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2008-06-24 21:32:52 $
  * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
  */
@@ -247,4 +247,23 @@
 );
 
+
+/// Select a ranked element within a vector; operations are performed in-place
+///
+/// Selection orders the vector so that the element of the nominated rank is in the correct place.  No
+/// guarantee is made about other elements.
+bool psVectorSelectInPlace(psVector *vector, ///< Vector from which to select
+                           long rank    ///< Rank of interest
+    );
+
+/// Select a ranked element within a vector; operations are performed on a copy
+///
+/// Selection orders the vector so that the element of the nominated rank is in the correct place.  No
+/// guarantee is made about other elements.
+psVector *psVectorSelect(psVector *out, ///< Output vector, or NULL
+                         const psVector *in, ///< Vector from which to select
+                         long rank      ///< Rank of interest
+    );
+
+
 /** Creates a string from a psVector's values in the form "[x0,x1,x2]".
  *
