/
futil.f
130 lines (124 loc) · 3.28 KB
/
futil.f
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
C Sorts an array arr(1:N) into ascending numerical order
C using the QuickSort algorithm. On output arr is replaced with its
C sorted rearrangement.
SUBROUTINE DQSORT(N,ARR)
CF2PY INTENT(IN,OUT,COPY) ARR
CF2PY INTEGER, INTENT(HIDE), DEPEND(ARR) :: N=len(ARR)
INTEGER N,M,NSTACK
REAL*8 ARR(N)
PARAMETER (M=7, NSTACK=100)
INTEGER I, IR, J, JSTACK, K, L, ISTACK(NSTACK)
REAL*8 A, TEMP
JSTACK = 0
L = 1
IR = N
1 IF(IR-L.LT.M)THEN
DO J=L+1,IR
A = ARR(J)
DO I = J-1,L,-1
IF (ARR(I).LE.A) GOTO 2
ARR(I+1)=ARR(I)
ENDDO
I = L-1
2 ARR(I+1) = A
ENDDO
IF(JSTACK.EQ.0)RETURN
IR=ISTACK(JSTACK)
L=ISTACK(JSTACK-1)
JSTACK = JSTACK - 2
ELSE
K = (L+IR)/2
TEMP = ARR(K)
ARR(K) = ARR(L+1)
ARR(L+1) = TEMP
IF(ARR(L).GT.ARR(IR))THEN
TEMP = ARR(L)
ARR(L) = ARR(IR)
ARR(IR) = TEMP
ENDIF
IF(ARR(L+1).GT.ARR(IR))THEN
TEMP=ARR(L+1)
ARR(L+1)=ARR(IR)
ARR(IR)=TEMP
ENDIF
IF(ARR(L).GT.ARR(L+1))THEN
TEMP=ARR(L)
ARR(L) = ARR(L+1)
ARR(L+1) = TEMP
ENDIF
I=L+1
J=IR
A=ARR(L+1)
3 CONTINUE
I=I+1
IF(ARR(I).LT.A)GOTO 3
4 CONTINUE
J=J-1
IF(ARR(J).GT.A)GOTO 4
IF(J.LT.I)GOTO 5
TEMP = ARR(I)
ARR(I) = ARR(J)
ARR(J) = TEMP
GOTO 3
5 ARR(L+1) = ARR(J)
ARR(J) = A
JSTACK = JSTACK + 2
IF(JSTACK.GT.NSTACK)RETURN
IF(IR-I+1.GE.J-1)THEN
ISTACK(JSTACK)=IR
ISTACK(JSTACK-1)=I
IR=J-1
ELSE
ISTACK(JSTACK)=J-1
ISTACK(JSTACK-1)=L
L=I
ENDIF
ENDIF
GOTO 1
END
C Finds repeated elements of ARR and their occurrence incidence
C reporting the result in REPLIST and REPNUM respectively.
C NLIST is the number of repeated elements found.
C Algorithm first sorts the list and then walks down it
C counting repeats as they are found.
SUBROUTINE DFREPS(ARR,N,REPLIST,REPNUM,NLIST)
CF2PY INTENT(IN) ARR
CF2PY INTENT(OUT) REPLIST
CF2PY INTENT(OUT) REPNUM
CF2PY INTENT(OUT) NLIST
CF2PY INTEGER, INTENT(HIDE), DEPEND(ARR) :: N=len(ARR)
REAL*8 REPLIST(N), ARR(N)
REAL*8 LASTVAL
INTEGER REPNUM(N)
INTEGER HOWMANY, REPEAT, IND, NLIST, NNUM
CALL DQSORT(N,ARR)
LASTVAL = ARR(1)
HOWMANY = 0
IND = 2
NNUM = 1
NLIST = 1
REPEAT = 0
DO WHILE(IND.LE.N)
IF(ARR(IND).NE.LASTVAL)THEN
IF (REPEAT.EQ.1)THEN
REPNUM(NNUM)=HOWMANY+1
NNUM=NNUM+1
REPEAT=0
HOWMANY=0
ENDIF
ELSE
HOWMANY=HOWMANY+1
REPEAT=1
IF(HOWMANY.EQ.1)THEN
REPLIST(NLIST)=ARR(IND)
NLIST=NLIST+1
ENDIF
ENDIF
LASTVAL=ARR(IND)
IND=IND+1
ENDDO
IF(REPEAT.EQ.1)THEN
REPNUM(NNUM)=HOWMANY+1
ENDIF
NLIST = NLIST - 1
END