SURFEX v8.1
General documentation of Surfex
Surfex_Git2
src
LIB
XRD44
utilities
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
ssort
subroutine ssort(DX, DY, N, KFLAG)
Definition:
ssort.F:3
Generated on Tue Jan 16 2018 16:23:22 for SURFEX v8.1 by
1.8.13