aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/daophot/daolib/pctile.f
diff options
context:
space:
mode:
Diffstat (limited to 'noao/digiphot/daophot/daolib/pctile.f')
-rw-r--r--noao/digiphot/daophot/daolib/pctile.f91
1 files changed, 91 insertions, 0 deletions
diff --git a/noao/digiphot/daophot/daolib/pctile.f b/noao/digiphot/daophot/daolib/pctile.f
new file mode 100644
index 00000000..e8a3f2d7
--- /dev/null
+++ b/noao/digiphot/daophot/daolib/pctile.f
@@ -0,0 +1,91 @@
+c function pctile (datum, n, npct)
+c
+c This is a modification of a quick-sorting algorithm, which is intended
+c to take in a vector of numbers, and return the value of the npct-th
+c element in that vector:
+c
+c dataum input vector
+c n number of elements in dataum
+c npct npct-th element
+c pctile output value of function
+c
+c
+c The array datum contains randomly ordered data
+c
+c
+ real function pctile (datum, n, npct)
+c
+ implicit none
+ integer n, npct
+ real datum(1)
+ integer min0, max0
+ real dkey
+ integer lo, hi, limlo, limhi
+c
+c Initialize the pointers.
+c
+ npct = max0 (1, min0 (n,npct))
+ limlo = 1
+ limhi = n
+c
+c Compare all elements in the sub-vector between limlo and limhi with
+c the current key datum.
+c
+ 100 dkey = datum (limlo)
+ lo = limlo
+ hi = limhi
+c
+c If lo equals hi, we have tested all the elements in the current search
+c interval.
+c
+ 101 continue
+ if (lo .eq. hi) go to 200
+ if (datum(hi) .le. dkey) go to 109
+c
+c The pointer hi is to be left pointing at a datum SMALLER than the
+c key, which is intended to be overwritten.
+c
+ hi = hi - 1
+c
+ goto 101
+ 109 datum(lo) = datum(hi)
+ lo = lo + 1
+ 110 continue
+ if (lo .eq. hi) goto 200
+ if (datum(lo) .ge. dkey) go to 119
+ lo = lo + 1
+c
+ goto 110
+ 119 datum(hi) = datum(lo)
+c
+c The pointer LO is to be left pointing at a datum LARGER than the
+c key, which is intended to be overwritten.
+c
+ hi = hi - 1
+c
+ go to 101
+c
+c lo and hi are equal, and point at a value which is intended to
+c be overwritten. Since all values below this point are less than
+c the key and all values above this point are greater than the key,
+c this is where we stick the key back into the vector.
+c
+ 200 continue
+c
+c At this point in the subroutine, all data between limlo and lo-1,
+c inclusive, are less than datum (lo), and all data between lo+1 and
+c limhi are larger than dataum(lo). If lo = npct, then datum(lo) is
+c the value we are looking for. If npct < lo, then we want to sort the
+c values of datum from limlo to lo-1, inclusive, whereas if npct > lo,
+c then we want to sort the values of datum from lo+1 to limhi,
+c inclusive.
+c
+ datum(lo) = dkey
+ if (npct - lo) 300, 900, 400
+ 300 limhi = lo - 1
+ go to 100
+ 400 limlo = lo + 1
+ go to 100
+ 900 pctile = datum(lo)
+ return
+ end