SURFEX v8.1
General documentation of Surfex
ssort.F
Go to the documentation of this file.
1 *DECK SSORT
2  SUBROUTINE ssort (DX, DY, N, KFLAG)
3 C***BEGIN PROLOGUE SSORT
4 C***PURPOSE SORT AN ARRAY AND OPTIONALLY MAKE THE SAME INTERCHANGES IN
5 C AN AUXILIARY ARRAY. THE ARRAY MAY BE SORTED IN INCREASING
6 C OR DECREASING ORDER. A SLIGHTLY MODIFIED QUICKSORT
7 C ALGORITHM IS USED.
8 C***LIBRARY SLATEC
9 C***CATEGORY N6A2B
10 C***TYPE REAL (SSORT-S, SSORT-D, ISORT-I)
11 C***KEYWORDS SINGLETON QUICKSORT, SORT, SORTING
12 C***AUTHOR JONES, R. E., (SNLA)
13 C WISNIEWSKI, J. A., (SNLA)
14 C***DESCRIPTION
15 C
16 C SSORT SORTS ARRAY DX AND OPTIONALLY MAKES THE SAME INTERCHANGES IN
17 C ARRAY DY. THE ARRAY DX MAY BE SORTED IN INCREASING ORDER OR
18 C DECREASING ORDER. A SLIGHTLY MODIFIED QUICKSORT ALGORITHM IS USED.
19 C
20 C DESCRIPTION OF PARAMETERS
21 C DX - ARRAY OF VALUES TO BE SORTED (USUALLY ABSCISSAS)
22 C DY - ARRAY TO BE (OPTIONALLY) CARRIED ALONG
23 C N - NUMBER OF VALUES IN ARRAY DX TO BE SORTED
24 C KFLAG - CONTROL PARAMETER
25 C = 2 MEANS SORT DX IN INCREASING ORDER AND CARRY DY ALONG.
26 C = 1 MEANS SORT DX IN INCREASING ORDER (IGNORING DY)
27 C = -1 MEANS SORT DX IN DECREASING ORDER (IGNORING DY)
28 C = -2 MEANS SORT DX IN DECREASING ORDER AND CARRY DY ALONG.
29 C
30 C***REFERENCES R. C. SINGLETON, ALGORITHM 347, AN EFFICIENT ALGORITHM
31 C FOR SORTING WITH MINIMAL STORAGE, COMMUNICATIONS OF
32 C THE ACM, 12, 3 (1969), PP. 185-187.
33 C***ROUTINES CALLED XERMSG
34 C***REVISION HISTORY (YYMMDD)
35 C 761101 DATE WRITTEN
36 C 761118 MODIFIED TO USE THE SINGLETON QUICKSORT ALGORITHM. (JAW)
37 C 890531 CHANGED ALL SPECIFIC INTRINSICS TO GENERIC. (WRB)
38 C 890831 MODIFIED ARRAY DECLARATIONS. (WRB)
39 C 891009 REMOVED UNREFERENCED STATEMENT LABELS. (WRB)
40 C 891024 CHANGED CATEGORY. (WRB)
41 C 891024 REVISION DATE FROM VERSION 3.2
42 C 891214 PROLOGUE CONVERTED TO VERSION 4.0 FORMAT. (BAB)
43 C 900315 CALLS TO XERROR CHANGED TO CALLS TO XERMSG. (THJ)
44 C 901012 DECLARED ALL VARIABLES; CHANGED X,Y TO DX,DY; CHANGED
45 C CODE TO PARALLEL SSORT. (M. MCCLAIN)
46 C 920501 REFORMATTED THE REFERENCES SECTION. (DWL, WRB)
47 C 920519 CLARIFIED ERROR MESSAGES. (DWL)
48 C 920801 DECLARATIONS SECTION REBUILT AND CODE RESTRUCTURED TO USE
49 C IF-THEN-ELSE-ENDIF. (RWC, WRB)
50 C***END PROLOGUE SSORT
51 C .. SCALAR ARGUMENTS ..
52  INTEGER KFLAG, N
53 C .. ARRAY ARGUMENTS ..
54  REAL DX(*), DY(*)
55 C .. LOCAL SCALARS ..
56  REAL R, T, TT, TTY, TY
57  INTEGER I, IJ, J, K, KK, L, M, NN
58 C .. LOCAL ARRAYS ..
59  INTEGER IL(21), IU(21)
60 C .. EXTERNAL SUBROUTINES ..
61 C EXTERNAL XERMSG
62 C .. INTRINSIC FUNCTIONS ..
63  INTRINSIC abs, int
64 C***FIRST EXECUTABLE STATEMENT SSORT
65  nn = n
66  IF (nn .LT. 1) THEN
67  WRITE(6,*)
68  + "The number of values to be sorted is not positive."
69 
70 C CALL XERMSG ('SLATEC', 'SSORT',
71 C + 'The number of values to be sorted is not positive.', 1, 1)
72 
73  RETURN
74  ENDIF
75 C
76  kk = abs(kflag)
77  IF (kk.NE.1 .AND. kk.NE.2) THEN
78 
79  WRITE(6,*)
80  + "The sort control parameter, K is bad."
81 C CALL XERMSG ('SLATEC', 'SSORT',
82 C + 'The sort control parameter, K, is not 2, 1, -1, or -2.', 2,
83 C + 1)
84  RETURN
85  ENDIF
86 C
87 C ALTER ARRAY DX TO GET DECREASING ORDER IF NEEDED
88 C
89  IF (kflag .LE. -1) THEN
90  DO 10 i=1,nn
91  dx(i) = -dx(i)
92  10 CONTINUE
93  ENDIF
94 C
95  IF (kk .EQ. 2) GO TO 100
96 C
97 C SORT DX ONLY
98 C
99  m = 1
100  i = 1
101  j = nn
102  r = 0.375d0
103 C
104  20 IF (i .EQ. j) GO TO 60
105  IF (r .LE. 0.5898437d0) THEN
106  r = r+3.90625d-2
107  ELSE
108  r = r-0.21875d0
109  ENDIF
110 C
111  30 k = i
112 C
113 C SELECT A CENTRAL ELEMENT OF THE ARRAY AND SAVE IT IN LOCATION T
114 C
115  ij = i + int((j-i)*r)
116  t = dx(ij)
117 C
118 C IF FIRST ELEMENT OF ARRAY IS GREATER THAN T, INTERCHANGE WITH T
119 C
120  IF (dx(i) .GT. t) THEN
121  dx(ij) = dx(i)
122  dx(i) = t
123  t = dx(ij)
124  ENDIF
125  l = j
126 C
127 C IF LAST ELEMENT OF ARRAY IS LESS THAN THAN T, INTERCHANGE WITH T
128 C
129  IF (dx(j) .LT. t) THEN
130  dx(ij) = dx(j)
131  dx(j) = t
132  t = dx(ij)
133 C
134 C IF FIRST ELEMENT OF ARRAY IS GREATER THAN T, INTERCHANGE WITH T
135 C
136  IF (dx(i) .GT. t) THEN
137  dx(ij) = dx(i)
138  dx(i) = t
139  t = dx(ij)
140  ENDIF
141  ENDIF
142 C
143 C FIND AN ELEMENT IN THE SECOND HALF OF THE ARRAY WHICH IS SMALLER
144 C THAN T
145 C
146  40 l = l-1
147  IF (dx(l) .GT. t) GO TO 40
148 C
149 C FIND AN ELEMENT IN THE FIRST HALF OF THE ARRAY WHICH IS GREATER
150 C THAN T
151 C
152  50 k = k+1
153  IF (dx(k) .LT. t) GO TO 50
154 C
155 C INTERCHANGE THESE ELEMENTS
156 C
157  IF (k .LE. l) THEN
158  tt = dx(l)
159  dx(l) = dx(k)
160  dx(k) = tt
161  GO TO 40
162  ENDIF
163 C
164 C SAVE UPPER AND LOWER SUBSCRIPTS OF THE ARRAY YET TO BE SORTED
165 C
166  IF (l-i .GT. j-k) THEN
167  il(m) = i
168  iu(m) = l
169  i = k
170  m = m+1
171  ELSE
172  il(m) = k
173  iu(m) = j
174  j = l
175  m = m+1
176  ENDIF
177  GO TO 70
178 C
179 C BEGIN AGAIN ON ANOTHER PORTION OF THE UNSORTED ARRAY
180 C
181  60 m = m-1
182  IF (m .EQ. 0) GO TO 190
183  i = il(m)
184  j = iu(m)
185 C
186  70 IF (j-i .GE. 1) GO TO 30
187  IF (i .EQ. 1) GO TO 20
188  i = i-1
189 C
190  80 i = i+1
191  IF (i .EQ. j) GO TO 60
192  t = dx(i+1)
193  IF (dx(i) .LE. t) GO TO 80
194  k = i
195 C
196  90 dx(k+1) = dx(k)
197  k = k-1
198  IF (t .LT. dx(k)) GO TO 90
199  dx(k+1) = t
200  GO TO 80
201 C
202 C SORT DX AND CARRY DY ALONG
203 C
204  100 m = 1
205  i = 1
206  j = nn
207  r = 0.375d0
208 C
209  110 IF (i .EQ. j) GO TO 150
210  IF (r .LE. 0.5898437d0) THEN
211  r = r+3.90625d-2
212  ELSE
213  r = r-0.21875d0
214  ENDIF
215 C
216  120 k = i
217 C
218 C SELECT A CENTRAL ELEMENT OF THE ARRAY AND SAVE IT IN LOCATION T
219 C
220  ij = i + int((j-i)*r)
221  t = dx(ij)
222  ty = dy(ij)
223 C
224 C IF FIRST ELEMENT OF ARRAY IS GREATER THAN T, INTERCHANGE WITH T
225 C
226  IF (dx(i) .GT. t) THEN
227  dx(ij) = dx(i)
228  dx(i) = t
229  t = dx(ij)
230  dy(ij) = dy(i)
231  dy(i) = ty
232  ty = dy(ij)
233  ENDIF
234  l = j
235 C
236 C IF LAST ELEMENT OF ARRAY IS LESS THAN T, INTERCHANGE WITH T
237 C
238  IF (dx(j) .LT. t) THEN
239  dx(ij) = dx(j)
240  dx(j) = t
241  t = dx(ij)
242  dy(ij) = dy(j)
243  dy(j) = ty
244  ty = dy(ij)
245 C
246 C IF FIRST ELEMENT OF ARRAY IS GREATER THAN T, INTERCHANGE WITH T
247 C
248  IF (dx(i) .GT. t) THEN
249  dx(ij) = dx(i)
250  dx(i) = t
251  t = dx(ij)
252  dy(ij) = dy(i)
253  dy(i) = ty
254  ty = dy(ij)
255  ENDIF
256  ENDIF
257 C
258 C FIND AN ELEMENT IN THE SECOND HALF OF THE ARRAY WHICH IS SMALLER
259 C THAN T
260 C
261  130 l = l-1
262  IF (dx(l) .GT. t) GO TO 130
263 C
264 C FIND AN ELEMENT IN THE FIRST HALF OF THE ARRAY WHICH IS GREATER
265 C THAN T
266 C
267  140 k = k+1
268  IF (dx(k) .LT. t) GO TO 140
269 C
270 C INTERCHANGE THESE ELEMENTS
271 C
272  IF (k .LE. l) THEN
273  tt = dx(l)
274  dx(l) = dx(k)
275  dx(k) = tt
276  tty = dy(l)
277  dy(l) = dy(k)
278  dy(k) = tty
279  GO TO 130
280  ENDIF
281 C
282 C SAVE UPPER AND LOWER SUBSCRIPTS OF THE ARRAY YET TO BE SORTED
283 C
284  IF (l-i .GT. j-k) THEN
285  il(m) = i
286  iu(m) = l
287  i = k
288  m = m+1
289  ELSE
290  il(m) = k
291  iu(m) = j
292  j = l
293  m = m+1
294  ENDIF
295  GO TO 160
296 C
297 C BEGIN AGAIN ON ANOTHER PORTION OF THE UNSORTED ARRAY
298 C
299  150 m = m-1
300  IF (m .EQ. 0) GO TO 190
301  i = il(m)
302  j = iu(m)
303 C
304  160 IF (j-i .GE. 1) GO TO 120
305  IF (i .EQ. 1) GO TO 110
306  i = i-1
307 C
308  170 i = i+1
309  IF (i .EQ. j) GO TO 150
310  t = dx(i+1)
311  ty = dy(i+1)
312  IF (dx(i) .LE. t) GO TO 170
313  k = i
314 C
315  180 dx(k+1) = dx(k)
316  dy(k+1) = dy(k)
317  k = k-1
318  IF (t .LT. dx(k)) GO TO 180
319  dx(k+1) = t
320  dy(k+1) = ty
321  GO TO 170
322 C
323 C CLEAN UP
324 C
325  190 IF (kflag .LE. -1) THEN
326  DO 200 i=1,nn
327  dx(i) = -dx(i)
328  200 CONTINUE
329  ENDIF
330  RETURN
331  END SUBROUTINE ssort
subroutine ssort(DX, DY, N, KFLAG)
Definition: ssort.F:3