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