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