From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- pkg/xtools/xtsort.x | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 pkg/xtools/xtsort.x (limited to 'pkg/xtools/xtsort.x') diff --git a/pkg/xtools/xtsort.x b/pkg/xtools/xtsort.x new file mode 100644 index 00000000..9d3535e8 --- /dev/null +++ b/pkg/xtools/xtsort.x @@ -0,0 +1,216 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +# XT_SORT2 -- Sort 2 dimensional vectors by the first component. + +procedure xt_sort2 (a1, a2, npts) + +real a1[npts], a2[npts] # Arrays to be sorted +int npts # Number of points + +int i, j +pointer sp, index, ptr + +int xts_compare() +extern xts_compare + +begin + call smark (sp) + call salloc (index, npts, TY_INT) + call salloc (ptr, npts, TY_REAL) + + do i = 1, npts + Memi[index+i-1] = ptr + i - 1 + + call amovr (a1, Memr[ptr], npts) + + call qsort (Memi[index], npts, xts_compare) + + do i = 1, npts { + j = Memi[index+i-1] + a1[i] = Memr[j] + } + + call amovr (a2, Memr[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a2[i] = Memr[j] + } + + call sfree (sp) +end + + +# XT_SORT3 -- Sort 3 dimensional vectors by the first component. + +procedure xt_sort3 (a1, a2, a3, npts) + +real a1[npts], a2[npts], a3[npts] # Arrays to be sorted +int npts # Number of points + +int i, j +pointer sp, index, ptr + +int xts_compare() +extern xts_compare + +begin + call smark (sp) + call salloc (index, npts, TY_INT) + call salloc (ptr, npts, TY_REAL) + + do i = 1, npts + Memi[index+i-1] = ptr + i - 1 + + call amovr (a1, Memr[ptr], npts) + + call qsort (Memi[index], npts, xts_compare) + + do i = 1, npts { + j = Memi[index+i-1] + a1[i] = Memr[j] + } + + call amovr (a2, Memr[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a2[i] = Memr[j] + } + + call amovr (a3, Memr[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a3[i] = Memr[j] + } + + call sfree (sp) +end + + +# XT_SORT4 -- Sort 4 dimensional vectors by the first component. + +procedure xt_sort4 (a1, a2, a3, a4, npts) + +real a1[npts], a2[npts], a3[npts], a4[npts] # Arrays to be sorted +int npts # Number of points + +int i, j +pointer sp, index, ptr + +int xts_compare() +extern xts_compare + +begin + call smark (sp) + call salloc (index, npts, TY_INT) + call salloc (ptr, npts, TY_REAL) + + do i = 1, npts + Memi[index+i-1] = ptr + i - 1 + + call amovr (a1, Memr[ptr], npts) + + call qsort (Memi[index], npts, xts_compare) + + do i = 1, npts { + j = Memi[index+i-1] + a1[i] = Memr[j] + } + + call amovr (a2, Memr[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a2[i] = Memr[j] + } + + call amovr (a3, Memr[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a3[i] = Memr[j] + } + + call amovr (a4, Memr[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a4[i] = Memr[j] + } + + call sfree (sp) +end + + +# XTS_COMPARE -- Compare two real values in the Memr array. + +int procedure xts_compare (i, j) + +pointer i, j # Array indices to be compared. + +begin + if (Memr[i] < Memr[j]) + return (-1) + else if (Memr[i] > Memr[j]) + return (1) + else + return (0) +end + + +# XT_SORT3D -- Sort 3 double precision vectors by the first component. + +procedure xt_sort3d (a1, a2, a3, npts) + +double a1[npts], a2[npts], a3[npts] # Arrays to be sorted +int npts # Number of points + +int i, j +pointer sp, index, ptr + +int xts_compared() +extern xts_compared + +begin + call smark (sp) + call salloc (index, npts, TY_INT) + call salloc (ptr, npts, TY_DOUBLE) + + do i = 1, npts + Memi[index+i-1] = ptr + i - 1 + + call amovd (a1, Memd[ptr], npts) + + call qsort (Memi[index], npts, xts_compared) + + do i = 1, npts { + j = Memi[index+i-1] + a1[i] = Memd[j] + } + + call amovd (a2, Memd[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a2[i] = Memd[j] + } + + call amovd (a3, Memd[ptr], npts) + do i = 1, npts { + j = Memi[index+i-1] + a3[i] = Memd[j] + } + + call sfree (sp) +end + + +# XTS_COMPARED -- Compare two double values in the Memd array. + +int procedure xts_compared (i, j) + +pointer i, j # Array indices to be compared. + +begin + if (Memd[i] < Memd[j]) + return (-1) + else if (Memd[i] > Memd[j]) + return (1) + else + return (0) +end -- cgit