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
      Subroutine i_merge( np, nodes, mx, keys, irnkl, itabl, itabr )
2
! --------------------------------------------------------------------
3
      Implicit   None
4

    
5
      Integer :: np, nodes, irnkl(np),itabl (nodes+1),itabr (nodes)
6
      Integer :: mx, keys(mx)
7

    
8
      Integer :: ik, itabk(nodes)
9
      Integer :: i, j, k, il, ir, ij, irnkj(nodes), jprocs
10
      Integer :: w(np)
11
! --------------------------------------------------------------------
12
!     Make sure that the indices have base 1.
13

    
14
      If ( itabl(1) /= 1) Then
15
         Do i = nodes+1, 1, -1
16
            itabl(i) = itabl(i) - itabl(1) + 1
17
         End Do
18
      End If
19

    
20
      Do i = 1, nodes
21
         itabr(i) = itabl(i+1) - 1
22
      End Do
23

    
24
      Do j = 1,nodes
25
         itabk(j) = keys(itabl(j))
26
         irnkj(j) = j
27
      End Do
28
! --------------------------------------------------------------------
29
!     Check for empty segments and remove them.
30

    
31
      jprocs = nodes
32
      i = 1
33
      Do j = 1, nodes
34
         If ( itabl(irnkj(i)) > itabr(irnkj(i))) Then
35
            jprocs = jprocs - 1
36
            Do k = i, jprocs
37
               irnkj(k) = irnkj(k+1)
38
            End Do
39
         Else
40
            i = i + 1
41
         End If
42
      End Do
43
    
44
! --------------------------------------------------------------------
45
!     Sort the proc-way merging table:
46

    
47
      Do j = 2, jprocs
48

    
49
! ---    Consider each of the original elements in turn.
50

    
51
         ij = irnkj(j)
52
         ik = itabk(ij)
53

    
54
! ---    And look for a place to insert it; The slot "j" is now empty.
55

    
56
         Do i = j-1, 1, -1
57
            If ( itabk(irnkj(i)) <= ik ) Go To 10
58
            irnkj(i+1) = irnkj(i)
59
         End Do
60
         i = 0
61
  10     Continue
62
         irnkj(i+1) = ij
63
      End Do
64
! --------------------------------------------------------------------
65
!     The merging table is now in sorted order.
66
!     proceed with the merge.
67

    
68
      Do i = 1, np
69

    
70
! ---    Remove the smallest element from the merging list.
71
         ij = irnkj(1)
72

    
73
! ---    Refresh the merge table.
74

    
75
         il = itabl(ij) + 1
76
         ir = itabr(ij)
77
         ik = keys(il)
78
         itabk(ij) = ik
79
         itabl(ij) = il
80
         irnkl(il-1) = i
81

    
82
! ---    Pick out each element in turn; The first slot is now empty.
83

    
84
         If ( ir >= il ) Then ! --- Look for slot to insert new data.
85
            Do j = 1, jprocs-1
86
               If ( itabk(irnkj(j+1)) >= ik ) Go To 20
87
               irnkj(j) = irnkj(j+1)
88
            End Do
89
            j = jprocs
90
  20        Continue
91
            irnkj(j) = ij
92
         Else                      ! --- Retire a slot
93
            jprocs = jprocs-1
94
            Do j = 1, jprocs
95
               irnkj(j) = irnkj(j+1)
96
            End Do
97
         End If
98
      End Do
99
      Do i = 1, np
100
         w(irnkl(i)) = keys(i)
101
      End Do
102
      keys(1:np) = w(1:np)
103
! --------------------------------------------------------------------
104
      End Subroutine i_merge