File: sort.f

package info (click to toggle)
nastran 0.1.95-2
  • links: PTS, VCS
  • area: non-free
  • in suites: bookworm, bullseye, sid
  • size: 122,540 kB
  • sloc: fortran: 284,409; sh: 771; makefile: 324
file content (211 lines) | stat: -rw-r--r-- 6,895 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
      SUBROUTINE SORT (IDUM,JDUM,NR,KEYWD,Z,NWDS)
C
C     THE ORIGINAL NASTRAN SORT ROUTINE FOR IN-CORE SORTING AND FILE
C     SORT IS NOW RENAMED SORTI
C     (ONLY 5 PERCENT OF NASTRAN ROUTINES ACTUALLY CALL SORTI, WITH NON-
C     ZERO IDUM AND JDUM)
C
C     THIS NEW SORT ROUTINE WITH IDUM=JDUM=0, PERFORMS ONLY IN-CORE SORT
C     FOR INTEGERS, FLOATING POINT NUMBERS, AND BCD WORDS, BY THE
C     MODIFIED SHELL METHOD
C     IT USES MUCH LESS CORE SPACE
C
C     ARRAY Z IS NR-ROWS BY (NWDS/NR)-COLUMNS IN SIZE
C     DATA STORED ROW-WISE IN Z, AND TO BE SORTED BY KEYWD-TH ROW
C
C     USE A NEGATIVE KEYWD  IF THE ORIGINAL ORDER OF THE TABLE ENTRIES
C     ARE TO BE PRESERVED AND THE COLUMN OF KEYWORDS CONTAINS DUPLICATES
C     (INTEGER SORT ONLY)    E.G.
C
C     ORIGINAL TABLE     SORTED(KEYWD=+1)       SORTED(KEYWD=-1)
C     ---------------    ----------------       ----------------
C       1      4             1      4               1      4
C       2      2             1     10               1      3
C       1      3             1      3               1     10
C       1     10             2      2               2      2
C
C
C     THIS ROUTINE WOULD SWITCH BACK TO THE OLD SHUTTLE EXCHANGE METHOD
C     NUMBERS OVERFLOW DUE TO THE REQUIREMENT THAT ORIGINAL ORDER MUST B
C     MAINTAINED
C
C     ENTRY POINTS
C
C     SORT   - TABLE SORT BY INTEGER
C     SORTF  - TABLE SORT BY F.P. NUMBER
C     SORTA  - TABLE SORT BY ALPHABETS, 4-BCD CHARACTERS
C     SORTA8 - TABLE SORT BY ALPHABETS, 8-BCD CHAR. (KEYWD AND KEYWD+1)
C     SORTA7 - SAME AS SORTA8, EXCEPT LEADING CHAR. IS IGNORED
C     SORT2K - 2-KEYWORD SORT, SORT BY KEYWD AND KEYWD+1, INTEGER OR
C              REAL NUMBER KEYS. NEGATIVE KEYWD IS IGNORED
C
C     THE TWO SORT CALLS OF THE FOLLOWING FORM CAN BE REPLACED BY ONE CA
C     TO SORT2K, WHICH IS FASTER, NO DANGER OF NUMBER OVERFLOW, AND THE
C     ORIGINAL SEQUENCE WILL NOT CHANGE WHEN THERE ARE DUPLICATES.
C
C         CALL SORT (0,0,N1,-(N2+1),TABLE,N3)
C         CALL SORT (0,0,N1,-N2,    TABLE,N3)
C              CAN BE REPLACED BY
C         CALL SORT2K (0,0,N1,N2,TABLE,N3)
C
C
C     WRITTEN BY G.CHAN/SPERRY, 3/1987
C
      LOGICAL         RVSBCD
      INTEGER         ZI,      ZN,      TEMP,    Z(NR,1), TWO31,   TWO,
     1                SUBR(6)
      REAL            RI,      RN
      COMMON /SYSTEM/ IBUF,    NOUT,    DM37(37),NBPW
      COMMON /MACHIN/ MACH,    IJHLF(2),LQRO
      COMMON /TWO   / TWO(16)
      EQUIVALENCE     (ZI,RI), (ZN,RN)
      DATA    SUBR  / 2H  ,    2HF ,    2HA ,    2HA8,    2HA7,    2H2K/
C
C     CHECK ERROR, CHECK DATA TYPE, AND PREPARE FOR SORT
C
      ISORT = 1
      GO TO 10
C
      ENTRY SORTF (IDUM,JDUM,NR,KEYWD,Z,NWDS)
C     =======================================
      ISORT = 2
      GO TO 10
C
      ENTRY SORTA (IDUM,JDUM,NR,KEYWD,Z,NWDS)
C     =======================================
      ISORT = 3
      GO TO 10
C
      ENTRY SORTA8 (IDUM,JDUM,NR,KEYWD,Z,NWDS)
C     ========================================
      ISORT = 4
      GO TO 10
C
      ENTRY SORTA7 (IDUM,JDUM,NR,KEYWD,Z,NWDS)
C     ========================================
      ISORT = 5
      GO TO 10
C
      ENTRY SORT2K (IDUM,JDUM,NR,KEYWD,Z,NWDS)
C     ========================================
      ISORT = 6
C
   10 IF (NWDS .EQ. 0) GO TO 330
      IF (IDUM.NE.0 .OR. JDUM.NE.0) GO TO 300
      RVSBCD = MOD(LQRO,10) .EQ. 1
      KEY  = IABS(KEYWD)
      IF (KEY .GT. NR) GO TO 280
      NC = NWDS/NR
      IF (NC*NR .NE. NWDS) GO TO 280
      M  = NC
      IF (ISORT.NE.1 .OR. KEYWD.GE.0) GO TO 30
C
C                     - INTEGER SORT ONLY -
C     IF ORIGINAL ORDER IS TO BE MAINTAINED WHERE DUPLICATE KEYWORDS MAY
C     OCCUR, ADD INDICES TO THE KEYWORDS (GOOD FOR BOTH POSITIVE AND
C     NEGATIVE RANGES, AND BE SURE THAT KEYWORDS ARE NOT OVERFLOWED),
C     SORT THE DATA, AND REMOVE THE INDICES LATER
C
C     IF KEYWORD OVERFLOWS, SWITCH TO SHUTTLE EXCHANGE METHOD
C
      IF (NC.GE.TWO(16) .AND. NBPW.LE.32) GO TO 200
      J = 30
      IF (NBPW .GE. 60) J = 62
      TWO31 = 2**J
      LIMIT = (TWO31-NC)/NC
      DO 20 I = 1,NC
      J = Z(KEY,I)
      IF (IABS(J) .GT. LIMIT) GO TO 200
      J = J*NC + I
      K =-1
      IF (J .LT. 0) K =-NC
   20 Z(KEY,I) = J + K
C
C     SORT BY
C     MODIFIED SHELL METHOD, A SUPER FAST SORTER
C
   30 M = M/2
      IF (M .EQ. 0) GO TO 180
      J = 1
      K = NC - M
   40 I = J
   50 N = I + M
      ZI= Z(KEY,I)
      ZN= Z(KEY,N)
      GO TO (60,80,90,90,90,60), ISORT
C           INT FP A4 A8 A7 2K
C
   60 IF (ZI-ZN) 170,70,150
   70 IF (ISORT .EQ. 1) GO TO 170
      IF (Z(KEY+1,I)-Z(KEY+1,N)) 170,170,150
   80 IF (RI-RN) 170,170,150
   90 KK = 1
      IF (ISORT .EQ. 5) GO TO 110
C
C     COMPARE 1ST BYTE, THEN COMPARE 2ND, 3RD, AND 4TH BYTES TOGETHER
C     IF MACHINE DOES NOT USE REVERSED BCD ORDER. THOSE MACHINES WITH
C     REVERSED BCD ORDER (VAX, ULTRIX, S/G) MUST COMPARE EACH BYTE
C     SEPERATELY BECAUSE OF THE SIGN BIT
C
  100 IF (KHRFN1(ZERO,4,ZI,1) - KHRFN1(ZERO,4,ZN,1)) 170,110,150
  110 IF (.NOT.RVSBCD) IF (KHRFN1(ZI,1,ZERO,4)-KHRFN1(ZN,1,ZERO,4))
     1                                               170,140,150
      IF (KHRFN1(ZERO,4,ZI,2) - KHRFN1(ZERO,4,ZN,2)) 170,120,150
  120 IF (KHRFN1(ZERO,4,ZI,3) - KHRFN1(ZERO,4,ZN,3)) 170,130,150
  130 IF (KHRFN1(ZERO,4,ZI,4) - KHRFN1(ZERO,4,ZN,4)) 170,140,150
  140 IF (ISORT.LE.3 .OR. KK.EQ.2) GO TO 170
      ZI = Z(KEY+1,I)
      ZN = Z(KEY+1,N)
      KK = 2
      GO TO 100
  150 DO 160 L = 1,NR
      TEMP = Z(L,I)
      Z(L,I) = Z(L,N)
  160 Z(L,N) = TEMP
      I = I - M
      IF (I .GE. 1) GO TO 50
  170 J = J + 1
      IF (J-K) 40,40,30
  180 IF (ISORT.NE.1 .OR. KEYWD.GE.0) GO TO 330
      DO 190 I = 1,NC
  190 Z(KEY,I) = Z(KEY,I)/NC
      GO TO 330
C
C     SORT BY
C     SHUTTLE EXCHANGE THETHOD, A SLOW SORTER
C     (THIS WAS NASTRAN ORIGINAL SORTER, MODIFIED FOR 2-D ARRAY OPERATIO
C     WITH 20-COLUMN LIMITATION REMOVED)
C
  200 IF (I .LE. 1) GO TO 220
      J = I - 1
      DO 210 I = 1,J
  210 Z(KEY,I) = Z(KEY,I)/NC
C
  220 DO 270 II = 2,NC
      ZI = Z(KEY,II)
      JJ = II - 1
      IF (ZI .GE. Z(KEY,JJ)) GO TO 270
  230 JJ = JJ - 1
      IF (JJ .GT. 0) IF (ZI-Z(KEY,JJ)) 230,240,240
  240 JJ = JJ + 2
      DO 260 I = 1,NR
      TEMP = Z(I,II)
      M = II
      DO 250 J = JJ,II
      Z(I,M) = Z(I,M-1)
  250 M = M - 1
  260 Z(I,JJ-1) = TEMP
  270 CONTINUE
      GO TO 330
C
C     ERROR. FORCING A WALK BACK
C
  280 WRITE  (NOUT,290) SUBR(ISORT),NR,KEY,NWDS,NC
  290 FORMAT ('0*** ERROR IN SORT',A2,4I8)
      GO TO 320
  300 WRITE  (NOUT,310)
  310 FORMAT ('0*** CALLING ROUTINE SHOULD CALL SORTI')
CWKBR  320 CALL ERRTRC ('SORT    ',320)
  320 CONTINUE
  330 RETURN
      END