root / src / lapack / double / dlamrg.f @ 2
Historique | Voir | Annoter | Télécharger (2,8 ko)
1 | 1 | equemene | SUBROUTINE DLAMRG( N1, N2, A, DTRD1, DTRD2, INDEX ) |
---|---|---|---|
2 | 1 | equemene | * |
3 | 1 | equemene | * -- LAPACK routine (version 3.2) -- |
4 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
5 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
6 | 1 | equemene | * November 2006 |
7 | 1 | equemene | * |
8 | 1 | equemene | * .. Scalar Arguments .. |
9 | 1 | equemene | INTEGER DTRD1, DTRD2, N1, N2 |
10 | 1 | equemene | * .. |
11 | 1 | equemene | * .. Array Arguments .. |
12 | 1 | equemene | INTEGER INDEX( * ) |
13 | 1 | equemene | DOUBLE PRECISION A( * ) |
14 | 1 | equemene | * .. |
15 | 1 | equemene | * |
16 | 1 | equemene | * Purpose |
17 | 1 | equemene | * ======= |
18 | 1 | equemene | * |
19 | 1 | equemene | * DLAMRG will create a permutation list which will merge the elements |
20 | 1 | equemene | * of A (which is composed of two independently sorted sets) into a |
21 | 1 | equemene | * single set which is sorted in ascending order. |
22 | 1 | equemene | * |
23 | 1 | equemene | * Arguments |
24 | 1 | equemene | * ========= |
25 | 1 | equemene | * |
26 | 1 | equemene | * N1 (input) INTEGER |
27 | 1 | equemene | * N2 (input) INTEGER |
28 | 1 | equemene | * These arguements contain the respective lengths of the two |
29 | 1 | equemene | * sorted lists to be merged. |
30 | 1 | equemene | * |
31 | 1 | equemene | * A (input) DOUBLE PRECISION array, dimension (N1+N2) |
32 | 1 | equemene | * The first N1 elements of A contain a list of numbers which |
33 | 1 | equemene | * are sorted in either ascending or descending order. Likewise |
34 | 1 | equemene | * for the final N2 elements. |
35 | 1 | equemene | * |
36 | 1 | equemene | * DTRD1 (input) INTEGER |
37 | 1 | equemene | * DTRD2 (input) INTEGER |
38 | 1 | equemene | * These are the strides to be taken through the array A. |
39 | 1 | equemene | * Allowable strides are 1 and -1. They indicate whether a |
40 | 1 | equemene | * subset of A is sorted in ascending (DTRDx = 1) or descending |
41 | 1 | equemene | * (DTRDx = -1) order. |
42 | 1 | equemene | * |
43 | 1 | equemene | * INDEX (output) INTEGER array, dimension (N1+N2) |
44 | 1 | equemene | * On exit this array will contain a permutation such that |
45 | 1 | equemene | * if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be |
46 | 1 | equemene | * sorted in ascending order. |
47 | 1 | equemene | * |
48 | 1 | equemene | * ===================================================================== |
49 | 1 | equemene | * |
50 | 1 | equemene | * .. Local Scalars .. |
51 | 1 | equemene | INTEGER I, IND1, IND2, N1SV, N2SV |
52 | 1 | equemene | * .. |
53 | 1 | equemene | * .. Executable Statements .. |
54 | 1 | equemene | * |
55 | 1 | equemene | N1SV = N1 |
56 | 1 | equemene | N2SV = N2 |
57 | 1 | equemene | IF( DTRD1.GT.0 ) THEN |
58 | 1 | equemene | IND1 = 1 |
59 | 1 | equemene | ELSE |
60 | 1 | equemene | IND1 = N1 |
61 | 1 | equemene | END IF |
62 | 1 | equemene | IF( DTRD2.GT.0 ) THEN |
63 | 1 | equemene | IND2 = 1 + N1 |
64 | 1 | equemene | ELSE |
65 | 1 | equemene | IND2 = N1 + N2 |
66 | 1 | equemene | END IF |
67 | 1 | equemene | I = 1 |
68 | 1 | equemene | * while ( (N1SV > 0) & (N2SV > 0) ) |
69 | 1 | equemene | 10 CONTINUE |
70 | 1 | equemene | IF( N1SV.GT.0 .AND. N2SV.GT.0 ) THEN |
71 | 1 | equemene | IF( A( IND1 ).LE.A( IND2 ) ) THEN |
72 | 1 | equemene | INDEX( I ) = IND1 |
73 | 1 | equemene | I = I + 1 |
74 | 1 | equemene | IND1 = IND1 + DTRD1 |
75 | 1 | equemene | N1SV = N1SV - 1 |
76 | 1 | equemene | ELSE |
77 | 1 | equemene | INDEX( I ) = IND2 |
78 | 1 | equemene | I = I + 1 |
79 | 1 | equemene | IND2 = IND2 + DTRD2 |
80 | 1 | equemene | N2SV = N2SV - 1 |
81 | 1 | equemene | END IF |
82 | 1 | equemene | GO TO 10 |
83 | 1 | equemene | END IF |
84 | 1 | equemene | * end while |
85 | 1 | equemene | IF( N1SV.EQ.0 ) THEN |
86 | 1 | equemene | DO 20 N1SV = 1, N2SV |
87 | 1 | equemene | INDEX( I ) = IND2 |
88 | 1 | equemene | I = I + 1 |
89 | 1 | equemene | IND2 = IND2 + DTRD2 |
90 | 1 | equemene | 20 CONTINUE |
91 | 1 | equemene | ELSE |
92 | 1 | equemene | * N2SV .EQ. 0 |
93 | 1 | equemene | DO 30 N2SV = 1, N1SV |
94 | 1 | equemene | INDEX( I ) = IND1 |
95 | 1 | equemene | I = I + 1 |
96 | 1 | equemene | IND1 = IND1 + DTRD1 |
97 | 1 | equemene | 30 CONTINUE |
98 | 1 | equemene | END IF |
99 | 1 | equemene | * |
100 | 1 | equemene | RETURN |
101 | 1 | equemene | * |
102 | 1 | equemene | * End of DLAMRG |
103 | 1 | equemene | * |
104 | 1 | equemene | END |