Statistics
| Branch: | Revision:

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