All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
cksord.f
Go to the documentation of this file.
1 CDECK ID>, CKSORD.
2  SUBROUTINE cksord (ISZ,ARY,KIX,COPT)
3 *.*********************************************************
4 *. ------
5 *. CKSORV: TAKEN FROM OPAL PX-LIBRARY
6 *. ------
7 *. SOURCE: HERWIG (B.Webber,G.Marchesini)
8 *. Sort a real array into assending order based on
9 *. the magnitude of its elements; provide an
10 *. integer "index array" which specifies the ordering
11 *. of the array.
12 *. Usage :
13 *.
14 *. PARAMETER (NDIM=1.or.more)
15 *. REAL ARY (NDIM)
16 *. INTEGER KIX (NDIM)
17 *. INTEGER ISIZ
18 *. CHARACTER*1 COPT
19 *.
20 *. ISIZ = 1.to.NDIM
21 *. COPT = 'I'
22 *. CALL PXSORV (ISIZ,ARY,KIX,COPT)
23 *.
24 *. INPUT : ISIZ The dimension of the input array
25 *. INPUT : ARY The input array
26 *. OUTPUT : KIX The index array
27 *. CONTROL : COPT Control of output vector ARY
28 *. = ' ' : return sorted ARY and index array KIX
29 *. = 'I' : return index array KIX only, don't
30 *. modify ARY
31 *.
32 *.mod: S. BENTVELSEN OCT-97
33 *. CHANGE CODE TO BE ABLE TO SORT DOUBLE PRECISION
34 *. ARRAYS, AND ARRAY IS ORDERED IN DESENDING VALUES.
35 *.*********************************************************
36  IMPLICIT NONE
37  INTEGER mxsz
38  parameter(mxsz=500)
39  INTEGER isz,ix,jx
40  INTEGER kix (*),il (mxsz),ir (mxsz)
41  double precision ary (*),bry (mxsz)
42  CHARACTER*1 copt
43 
44  do ix=1,isz
45  ary(ix)=-ary(ix)
46  enddo
47 
48 
49  IF (isz.GT.mxsz) THEN
50  WRITE (6,fmt='('' PXSORT: Error,'',
51  + '' Max array size ='',I6)') mxsz
52  kix(1) = -1
53  go to 990
54  END IF
55  il(1) = 0
56  ir(1) = 0
57  DO 10 ix = 2,isz
58  il(ix) = 0
59  ir(ix) = 0
60  jx = 1
61  2 IF (ary(ix).GT.ary(jx)) go to 5
62  3 IF (il(jx).EQ.0) go to 4
63  jx = il(jx)
64  go to 2
65  4 ir(ix) = -jx
66  il(jx) = ix
67  go to 10
68  5 IF (ir(jx).LE.0) go to 6
69  jx = ir(jx)
70  go to 2
71  6 ir(ix) = ir(jx)
72  ir(jx) = ix
73  10 CONTINUE
74  ix = 1
75  jx = 1
76  go to 8
77  20 jx = il(jx)
78  8 IF (il(jx).GT.0) go to 20
79  9 kix(ix) = jx
80  bry(ix) = ary(jx)
81  ix = ix + 1
82  IF (ir(jx)) 12,30,13
83  13 jx = ir(jx)
84  go to 8
85  12 jx = -ir(jx)
86  go to 9
87  30 continue
88  do ix=1,isz
89  ary(ix)=-ary(ix)
90  enddo
91  IF (copt.EQ.'I') RETURN
92  DO 31 ix = 1,isz
93  31 ary(ix) = bry(ix)
94  990 continue
95  RETURN
96  END
subroutine cksord(ISZ, ARY, KIX, COPT)
Definition: cksord.f:2