Annotation of rpl/lapack/lapack/dlaeda.f, revision 1.1

1.1     ! bertrand    1:       SUBROUTINE DLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR,
        !             2:      $                   GIVCOL, GIVNUM, Q, QPTR, Z, ZTEMP, INFO )
        !             3: *
        !             4: *  -- LAPACK routine (version 3.2) --
        !             5: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
        !             6: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !             7: *     November 2006
        !             8: *
        !             9: *     .. Scalar Arguments ..
        !            10:       INTEGER            CURLVL, CURPBM, INFO, N, TLVLS
        !            11: *     ..
        !            12: *     .. Array Arguments ..
        !            13:       INTEGER            GIVCOL( 2, * ), GIVPTR( * ), PERM( * ),
        !            14:      $                   PRMPTR( * ), QPTR( * )
        !            15:       DOUBLE PRECISION   GIVNUM( 2, * ), Q( * ), Z( * ), ZTEMP( * )
        !            16: *     ..
        !            17: *
        !            18: *  Purpose
        !            19: *  =======
        !            20: *
        !            21: *  DLAEDA computes the Z vector corresponding to the merge step in the
        !            22: *  CURLVLth step of the merge process with TLVLS steps for the CURPBMth
        !            23: *  problem.
        !            24: *
        !            25: *  Arguments
        !            26: *  =========
        !            27: *
        !            28: *  N      (input) INTEGER
        !            29: *         The dimension of the symmetric tridiagonal matrix.  N >= 0.
        !            30: *
        !            31: *  TLVLS  (input) INTEGER
        !            32: *         The total number of merging levels in the overall divide and
        !            33: *         conquer tree.
        !            34: *
        !            35: *  CURLVL (input) INTEGER
        !            36: *         The current level in the overall merge routine,
        !            37: *         0 <= curlvl <= tlvls.
        !            38: *
        !            39: *  CURPBM (input) INTEGER
        !            40: *         The current problem in the current level in the overall
        !            41: *         merge routine (counting from upper left to lower right).
        !            42: *
        !            43: *  PRMPTR (input) INTEGER array, dimension (N lg N)
        !            44: *         Contains a list of pointers which indicate where in PERM a
        !            45: *         level's permutation is stored.  PRMPTR(i+1) - PRMPTR(i)
        !            46: *         indicates the size of the permutation and incidentally the
        !            47: *         size of the full, non-deflated problem.
        !            48: *
        !            49: *  PERM   (input) INTEGER array, dimension (N lg N)
        !            50: *         Contains the permutations (from deflation and sorting) to be
        !            51: *         applied to each eigenblock.
        !            52: *
        !            53: *  GIVPTR (input) INTEGER array, dimension (N lg N)
        !            54: *         Contains a list of pointers which indicate where in GIVCOL a
        !            55: *         level's Givens rotations are stored.  GIVPTR(i+1) - GIVPTR(i)
        !            56: *         indicates the number of Givens rotations.
        !            57: *
        !            58: *  GIVCOL (input) INTEGER array, dimension (2, N lg N)
        !            59: *         Each pair of numbers indicates a pair of columns to take place
        !            60: *         in a Givens rotation.
        !            61: *
        !            62: *  GIVNUM (input) DOUBLE PRECISION array, dimension (2, N lg N)
        !            63: *         Each number indicates the S value to be used in the
        !            64: *         corresponding Givens rotation.
        !            65: *
        !            66: *  Q      (input) DOUBLE PRECISION array, dimension (N**2)
        !            67: *         Contains the square eigenblocks from previous levels, the
        !            68: *         starting positions for blocks are given by QPTR.
        !            69: *
        !            70: *  QPTR   (input) INTEGER array, dimension (N+2)
        !            71: *         Contains a list of pointers which indicate where in Q an
        !            72: *         eigenblock is stored.  SQRT( QPTR(i+1) - QPTR(i) ) indicates
        !            73: *         the size of the block.
        !            74: *
        !            75: *  Z      (output) DOUBLE PRECISION array, dimension (N)
        !            76: *         On output this vector contains the updating vector (the last
        !            77: *         row of the first sub-eigenvector matrix and the first row of
        !            78: *         the second sub-eigenvector matrix).
        !            79: *
        !            80: *  ZTEMP  (workspace) DOUBLE PRECISION array, dimension (N)
        !            81: *
        !            82: *  INFO   (output) INTEGER
        !            83: *          = 0:  successful exit.
        !            84: *          < 0:  if INFO = -i, the i-th argument had an illegal value.
        !            85: *
        !            86: *  Further Details
        !            87: *  ===============
        !            88: *
        !            89: *  Based on contributions by
        !            90: *     Jeff Rutter, Computer Science Division, University of California
        !            91: *     at Berkeley, USA
        !            92: *
        !            93: *  =====================================================================
        !            94: *
        !            95: *     .. Parameters ..
        !            96:       DOUBLE PRECISION   ZERO, HALF, ONE
        !            97:       PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )
        !            98: *     ..
        !            99: *     .. Local Scalars ..
        !           100:       INTEGER            BSIZ1, BSIZ2, CURR, I, K, MID, PSIZ1, PSIZ2,
        !           101:      $                   PTR, ZPTR1
        !           102: *     ..
        !           103: *     .. External Subroutines ..
        !           104:       EXTERNAL           DCOPY, DGEMV, DROT, XERBLA
        !           105: *     ..
        !           106: *     .. Intrinsic Functions ..
        !           107:       INTRINSIC          DBLE, INT, SQRT
        !           108: *     ..
        !           109: *     .. Executable Statements ..
        !           110: *
        !           111: *     Test the input parameters.
        !           112: *
        !           113:       INFO = 0
        !           114: *
        !           115:       IF( N.LT.0 ) THEN
        !           116:          INFO = -1
        !           117:       END IF
        !           118:       IF( INFO.NE.0 ) THEN
        !           119:          CALL XERBLA( 'DLAEDA', -INFO )
        !           120:          RETURN
        !           121:       END IF
        !           122: *
        !           123: *     Quick return if possible
        !           124: *
        !           125:       IF( N.EQ.0 )
        !           126:      $   RETURN
        !           127: *
        !           128: *     Determine location of first number in second half.
        !           129: *
        !           130:       MID = N / 2 + 1
        !           131: *
        !           132: *     Gather last/first rows of appropriate eigenblocks into center of Z
        !           133: *
        !           134:       PTR = 1
        !           135: *
        !           136: *     Determine location of lowest level subproblem in the full storage
        !           137: *     scheme
        !           138: *
        !           139:       CURR = PTR + CURPBM*2**CURLVL + 2**( CURLVL-1 ) - 1
        !           140: *
        !           141: *     Determine size of these matrices.  We add HALF to the value of
        !           142: *     the SQRT in case the machine underestimates one of these square
        !           143: *     roots.
        !           144: *
        !           145:       BSIZ1 = INT( HALF+SQRT( DBLE( QPTR( CURR+1 )-QPTR( CURR ) ) ) )
        !           146:       BSIZ2 = INT( HALF+SQRT( DBLE( QPTR( CURR+2 )-QPTR( CURR+1 ) ) ) )
        !           147:       DO 10 K = 1, MID - BSIZ1 - 1
        !           148:          Z( K ) = ZERO
        !           149:    10 CONTINUE
        !           150:       CALL DCOPY( BSIZ1, Q( QPTR( CURR )+BSIZ1-1 ), BSIZ1,
        !           151:      $            Z( MID-BSIZ1 ), 1 )
        !           152:       CALL DCOPY( BSIZ2, Q( QPTR( CURR+1 ) ), BSIZ2, Z( MID ), 1 )
        !           153:       DO 20 K = MID + BSIZ2, N
        !           154:          Z( K ) = ZERO
        !           155:    20 CONTINUE
        !           156: *
        !           157: *     Loop thru remaining levels 1 -> CURLVL applying the Givens
        !           158: *     rotations and permutation and then multiplying the center matrices
        !           159: *     against the current Z.
        !           160: *
        !           161:       PTR = 2**TLVLS + 1
        !           162:       DO 70 K = 1, CURLVL - 1
        !           163:          CURR = PTR + CURPBM*2**( CURLVL-K ) + 2**( CURLVL-K-1 ) - 1
        !           164:          PSIZ1 = PRMPTR( CURR+1 ) - PRMPTR( CURR )
        !           165:          PSIZ2 = PRMPTR( CURR+2 ) - PRMPTR( CURR+1 )
        !           166:          ZPTR1 = MID - PSIZ1
        !           167: *
        !           168: *       Apply Givens at CURR and CURR+1
        !           169: *
        !           170:          DO 30 I = GIVPTR( CURR ), GIVPTR( CURR+1 ) - 1
        !           171:             CALL DROT( 1, Z( ZPTR1+GIVCOL( 1, I )-1 ), 1,
        !           172:      $                 Z( ZPTR1+GIVCOL( 2, I )-1 ), 1, GIVNUM( 1, I ),
        !           173:      $                 GIVNUM( 2, I ) )
        !           174:    30    CONTINUE
        !           175:          DO 40 I = GIVPTR( CURR+1 ), GIVPTR( CURR+2 ) - 1
        !           176:             CALL DROT( 1, Z( MID-1+GIVCOL( 1, I ) ), 1,
        !           177:      $                 Z( MID-1+GIVCOL( 2, I ) ), 1, GIVNUM( 1, I ),
        !           178:      $                 GIVNUM( 2, I ) )
        !           179:    40    CONTINUE
        !           180:          PSIZ1 = PRMPTR( CURR+1 ) - PRMPTR( CURR )
        !           181:          PSIZ2 = PRMPTR( CURR+2 ) - PRMPTR( CURR+1 )
        !           182:          DO 50 I = 0, PSIZ1 - 1
        !           183:             ZTEMP( I+1 ) = Z( ZPTR1+PERM( PRMPTR( CURR )+I )-1 )
        !           184:    50    CONTINUE
        !           185:          DO 60 I = 0, PSIZ2 - 1
        !           186:             ZTEMP( PSIZ1+I+1 ) = Z( MID+PERM( PRMPTR( CURR+1 )+I )-1 )
        !           187:    60    CONTINUE
        !           188: *
        !           189: *        Multiply Blocks at CURR and CURR+1
        !           190: *
        !           191: *        Determine size of these matrices.  We add HALF to the value of
        !           192: *        the SQRT in case the machine underestimates one of these
        !           193: *        square roots.
        !           194: *
        !           195:          BSIZ1 = INT( HALF+SQRT( DBLE( QPTR( CURR+1 )-QPTR( CURR ) ) ) )
        !           196:          BSIZ2 = INT( HALF+SQRT( DBLE( QPTR( CURR+2 )-QPTR( CURR+
        !           197:      $           1 ) ) ) )
        !           198:          IF( BSIZ1.GT.0 ) THEN
        !           199:             CALL DGEMV( 'T', BSIZ1, BSIZ1, ONE, Q( QPTR( CURR ) ),
        !           200:      $                  BSIZ1, ZTEMP( 1 ), 1, ZERO, Z( ZPTR1 ), 1 )
        !           201:          END IF
        !           202:          CALL DCOPY( PSIZ1-BSIZ1, ZTEMP( BSIZ1+1 ), 1, Z( ZPTR1+BSIZ1 ),
        !           203:      $               1 )
        !           204:          IF( BSIZ2.GT.0 ) THEN
        !           205:             CALL DGEMV( 'T', BSIZ2, BSIZ2, ONE, Q( QPTR( CURR+1 ) ),
        !           206:      $                  BSIZ2, ZTEMP( PSIZ1+1 ), 1, ZERO, Z( MID ), 1 )
        !           207:          END IF
        !           208:          CALL DCOPY( PSIZ2-BSIZ2, ZTEMP( PSIZ1+BSIZ2+1 ), 1,
        !           209:      $               Z( MID+BSIZ2 ), 1 )
        !           210: *
        !           211:          PTR = PTR + 2**( TLVLS-K )
        !           212:    70 CONTINUE
        !           213: *
        !           214:       RETURN
        !           215: *
        !           216: *     End of DLAEDA
        !           217: *
        !           218:       END

CVSweb interface <joel.bertrand@systella.fr>