Statistiques
| Révision :

root / src / lapack / double / dlasdt.f @ 2

Historique | Voir | Annoter | Télécharger (2,88 ko)

1 1 equemene
      SUBROUTINE DLASDT( N, LVL, ND, INODE, NDIML, NDIMR, MSUB )
2 1 equemene
*
3 1 equemene
*  -- LAPACK auxiliary routine (version 3.2.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
*     June 2010
7 1 equemene
*
8 1 equemene
*     .. Scalar Arguments ..
9 1 equemene
      INTEGER            LVL, MSUB, N, ND
10 1 equemene
*     ..
11 1 equemene
*     .. Array Arguments ..
12 1 equemene
      INTEGER            INODE( * ), NDIML( * ), NDIMR( * )
13 1 equemene
*     ..
14 1 equemene
*
15 1 equemene
*  Purpose
16 1 equemene
*  =======
17 1 equemene
*
18 1 equemene
*  DLASDT creates a tree of subproblems for bidiagonal divide and
19 1 equemene
*  conquer.
20 1 equemene
*
21 1 equemene
*  Arguments
22 1 equemene
*  =========
23 1 equemene
*
24 1 equemene
*   N      (input) INTEGER
25 1 equemene
*          On entry, the number of diagonal elements of the
26 1 equemene
*          bidiagonal matrix.
27 1 equemene
*
28 1 equemene
*   LVL    (output) INTEGER
29 1 equemene
*          On exit, the number of levels on the computation tree.
30 1 equemene
*
31 1 equemene
*   ND     (output) INTEGER
32 1 equemene
*          On exit, the number of nodes on the tree.
33 1 equemene
*
34 1 equemene
*   INODE  (output) INTEGER array, dimension ( N )
35 1 equemene
*          On exit, centers of subproblems.
36 1 equemene
*
37 1 equemene
*   NDIML  (output) INTEGER array, dimension ( N )
38 1 equemene
*          On exit, row dimensions of left children.
39 1 equemene
*
40 1 equemene
*   NDIMR  (output) INTEGER array, dimension ( N )
41 1 equemene
*          On exit, row dimensions of right children.
42 1 equemene
*
43 1 equemene
*   MSUB   (input) INTEGER
44 1 equemene
*          On entry, the maximum row dimension each subproblem at the
45 1 equemene
*          bottom of the tree can be of.
46 1 equemene
*
47 1 equemene
*  Further Details
48 1 equemene
*  ===============
49 1 equemene
*
50 1 equemene
*  Based on contributions by
51 1 equemene
*     Ming Gu and Huan Ren, Computer Science Division, University of
52 1 equemene
*     California at Berkeley, USA
53 1 equemene
*
54 1 equemene
*  =====================================================================
55 1 equemene
*
56 1 equemene
*     .. Parameters ..
57 1 equemene
      DOUBLE PRECISION   TWO
58 1 equemene
      PARAMETER          ( TWO = 2.0D+0 )
59 1 equemene
*     ..
60 1 equemene
*     .. Local Scalars ..
61 1 equemene
      INTEGER            I, IL, IR, LLST, MAXN, NCRNT, NLVL
62 1 equemene
      DOUBLE PRECISION   TEMP
63 1 equemene
*     ..
64 1 equemene
*     .. Intrinsic Functions ..
65 1 equemene
      INTRINSIC          DBLE, INT, LOG, MAX
66 1 equemene
*     ..
67 1 equemene
*     .. Executable Statements ..
68 1 equemene
*
69 1 equemene
*     Find the number of levels on the tree.
70 1 equemene
*
71 1 equemene
      MAXN = MAX( 1, N )
72 1 equemene
      TEMP = LOG( DBLE( MAXN ) / DBLE( MSUB+1 ) ) / LOG( TWO )
73 1 equemene
      LVL = INT( TEMP ) + 1
74 1 equemene
*
75 1 equemene
      I = N / 2
76 1 equemene
      INODE( 1 ) = I + 1
77 1 equemene
      NDIML( 1 ) = I
78 1 equemene
      NDIMR( 1 ) = N - I - 1
79 1 equemene
      IL = 0
80 1 equemene
      IR = 1
81 1 equemene
      LLST = 1
82 1 equemene
      DO 20 NLVL = 1, LVL - 1
83 1 equemene
*
84 1 equemene
*        Constructing the tree at (NLVL+1)-st level. The number of
85 1 equemene
*        nodes created on this level is LLST * 2.
86 1 equemene
*
87 1 equemene
         DO 10 I = 0, LLST - 1
88 1 equemene
            IL = IL + 2
89 1 equemene
            IR = IR + 2
90 1 equemene
            NCRNT = LLST + I
91 1 equemene
            NDIML( IL ) = NDIML( NCRNT ) / 2
92 1 equemene
            NDIMR( IL ) = NDIML( NCRNT ) - NDIML( IL ) - 1
93 1 equemene
            INODE( IL ) = INODE( NCRNT ) - NDIMR( IL ) - 1
94 1 equemene
            NDIML( IR ) = NDIMR( NCRNT ) / 2
95 1 equemene
            NDIMR( IR ) = NDIMR( NCRNT ) - NDIML( IR ) - 1
96 1 equemene
            INODE( IR ) = INODE( NCRNT ) + NDIML( IR ) + 1
97 1 equemene
   10    CONTINUE
98 1 equemene
         LLST = LLST*2
99 1 equemene
   20 CONTINUE
100 1 equemene
      ND = LLST*2 - 1
101 1 equemene
*
102 1 equemene
      RETURN
103 1 equemene
*
104 1 equemene
*     End of DLASDT
105 1 equemene
*
106 1 equemene
      END