Statistics
| Branch: | Revision:

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