root / synthbench / euroben-dm / mod2i / .svn / text-base / d_merge.f.svn-base @ 0:839f52ef7657
History | View | Annotate | Download (2.9 kB)
1 |
Subroutine d_merge( np, nodes, mx, keys, irnkl, itabl, itabr ) |
---|---|
2 |
! -------------------------------------------------------------------- |
3 |
Use numerics |
4 |
Implicit None |
5 |
|
6 |
Integer :: np, nodes, mx, irnkl(np), itabl(nodes+1), |
7 |
& itabr(nodes) |
8 |
Real(l_) :: keys(mx) |
9 |
|
10 |
Real(l_) :: ik, itabk(nodes) |
11 |
Integer :: i, j, k, il, ir, ij, irnkj(nodes), jprocs |
12 |
Real(l_) :: w(np) |
13 |
! -------------------------------------------------------------------- |
14 |
! Make sure that the indicies have base 1. |
15 |
|
16 |
If ( itabl(1) /= 1) Then |
17 |
Do i = nodes+1, 1, -1 |
18 |
itabl(i) = itabl(i) - itabl(1) + 1 |
19 |
End Do |
20 |
End If |
21 |
|
22 |
Do i = 1, nodes |
23 |
itabr(i) = itabl(i+1) - 1 |
24 |
End Do |
25 |
|
26 |
Do j = 1,nodes |
27 |
itabk(j) = keys(itabl(j)) |
28 |
irnkj(j) = j |
29 |
End Do |
30 |
! -------------------------------------------------------------------- |
31 |
! Check for empty segments and remove them. |
32 |
|
33 |
jprocs = nodes |
34 |
i = 1 |
35 |
Do j = 1, nodes |
36 |
If ( itabl(irnkj(i)) > itabr(irnkj(i))) Then |
37 |
jprocs = jprocs - 1 |
38 |
Do k = i, jprocs |
39 |
irnkj(k) = irnkj(k+1) |
40 |
End Do |
41 |
Else |
42 |
i = i + 1 |
43 |
End If |
44 |
End Do |
45 |
! -------------------------------------------------------------------- |
46 |
! Sort the proc-way merging table: |
47 |
|
48 |
Do j = 2, jprocs |
49 |
|
50 |
! --- Consider each of the original elements in turn. |
51 |
|
52 |
ij = irnkj(j) |
53 |
ik = itabk(ij) |
54 |
|
55 |
! --- and look for a place to insert it. |
56 |
! The slot "j" is now empty. |
57 |
|
58 |
Do i = j-1, 1, -1 |
59 |
If ( itabk(irnkj(i)) <= ik ) Go To 10 |
60 |
irnkj(i+1) = irnkj(i) |
61 |
End Do |
62 |
i = 0 |
63 |
10 Continue |
64 |
irnkj(i+1) = ij |
65 |
End Do |
66 |
! -------------------------------------------------------------------- |
67 |
! The merging table is now in sorted order. |
68 |
! proceed with the merge. |
69 |
|
70 |
Do i = 1, np |
71 |
|
72 |
! --- Remove the smallest element from the merging list. |
73 |
ij = irnkj(1) |
74 |
|
75 |
! --- Refresh the merge table. |
76 |
|
77 |
il = itabl(ij) + 1 |
78 |
ir = itabr(ij) |
79 |
ik = keys(il) |
80 |
itabk(ij) = ik |
81 |
itabl(ij) = il |
82 |
irnkl(il-1) = i |
83 |
|
84 |
! --- Pick out each element in turn; The first slot is now empty. |
85 |
|
86 |
If ( ir >= il ) Then ! --- Look for slot to insert new data. |
87 |
Do j = 1, jprocs-1 |
88 |
If ( itabk(irnkj(j+1)) >= ik ) Go To 20 |
89 |
irnkj(j) = irnkj(j+1) |
90 |
End Do |
91 |
j = jprocs |
92 |
20 Continue |
93 |
irnkj(j) = ij |
94 |
Else ! --- Retire a slot |
95 |
jprocs = jprocs-1 |
96 |
Do j = 1, jprocs |
97 |
irnkj(j) = irnkj(j+1) |
98 |
End Do |
99 |
End If |
100 |
End Do |
101 |
Do i = 1, np |
102 |
w(irnkl(i)) = keys(i) |
103 |
End Do |
104 |
keys(1:np) = w(1:np) |
105 |
! -------------------------------------------------------------------- |
106 |
End Subroutine d_merge |