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

1.1     ! bertrand    1:       SUBROUTINE DLARRA( N, D, E, E2, SPLTOL, TNRM,
        !             2:      $                    NSPLIT, ISPLIT, INFO )
        !             3:       IMPLICIT NONE
        !             4: *
        !             5: *  -- LAPACK auxiliary routine (version 3.2) --
        !             6: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
        !             7: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !             8: *     November 2006
        !             9: *
        !            10: *     .. Scalar Arguments ..
        !            11:       INTEGER            INFO, N, NSPLIT
        !            12:       DOUBLE PRECISION    SPLTOL, TNRM
        !            13: *     ..
        !            14: *     .. Array Arguments ..
        !            15:       INTEGER            ISPLIT( * )
        !            16:       DOUBLE PRECISION   D( * ), E( * ), E2( * )
        !            17: *     ..
        !            18: *
        !            19: *  Purpose
        !            20: *  =======
        !            21: *
        !            22: *  Compute the splitting points with threshold SPLTOL.
        !            23: *  DLARRA sets any "small" off-diagonal elements to zero.
        !            24: *
        !            25: *  Arguments
        !            26: *  =========
        !            27: *
        !            28: *  N       (input) INTEGER
        !            29: *          The order of the matrix. N > 0.
        !            30: *
        !            31: *  D       (input) DOUBLE PRECISION array, dimension (N)
        !            32: *          On entry, the N diagonal elements of the tridiagonal
        !            33: *          matrix T.
        !            34: *
        !            35: *  E       (input/output) DOUBLE PRECISION array, dimension (N)
        !            36: *          On entry, the first (N-1) entries contain the subdiagonal
        !            37: *          elements of the tridiagonal matrix T; E(N) need not be set.
        !            38: *          On exit, the entries E( ISPLIT( I ) ), 1 <= I <= NSPLIT,
        !            39: *          are set to zero, the other entries of E are untouched.
        !            40: *
        !            41: *  E2      (input/output) DOUBLE PRECISION array, dimension (N)
        !            42: *          On entry, the first (N-1) entries contain the SQUARES of the
        !            43: *          subdiagonal elements of the tridiagonal matrix T;
        !            44: *          E2(N) need not be set.
        !            45: *          On exit, the entries E2( ISPLIT( I ) ),
        !            46: *          1 <= I <= NSPLIT, have been set to zero
        !            47: *
        !            48: *  SPLTOL (input) DOUBLE PRECISION
        !            49: *          The threshold for splitting. Two criteria can be used:
        !            50: *          SPLTOL<0 : criterion based on absolute off-diagonal value
        !            51: *          SPLTOL>0 : criterion that preserves relative accuracy
        !            52: *
        !            53: *  TNRM (input) DOUBLE PRECISION
        !            54: *          The norm of the matrix.
        !            55: *
        !            56: *  NSPLIT  (output) INTEGER
        !            57: *          The number of blocks T splits into. 1 <= NSPLIT <= N.
        !            58: *
        !            59: *  ISPLIT  (output) INTEGER array, dimension (N)
        !            60: *          The splitting points, at which T breaks up into blocks.
        !            61: *          The first block consists of rows/columns 1 to ISPLIT(1),
        !            62: *          the second of rows/columns ISPLIT(1)+1 through ISPLIT(2),
        !            63: *          etc., and the NSPLIT-th consists of rows/columns
        !            64: *          ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N.
        !            65: *
        !            66: *
        !            67: *  INFO    (output) INTEGER
        !            68: *          = 0:  successful exit
        !            69: *
        !            70: *  Further Details
        !            71: *  ===============
        !            72: *
        !            73: *  Based on contributions by
        !            74: *     Beresford Parlett, University of California, Berkeley, USA
        !            75: *     Jim Demmel, University of California, Berkeley, USA
        !            76: *     Inderjit Dhillon, University of Texas, Austin, USA
        !            77: *     Osni Marques, LBNL/NERSC, USA
        !            78: *     Christof Voemel, University of California, Berkeley, USA
        !            79: *
        !            80: *  =====================================================================
        !            81: *
        !            82: *     .. Parameters ..
        !            83:       DOUBLE PRECISION   ZERO
        !            84:       PARAMETER          ( ZERO = 0.0D0 )
        !            85: *     ..
        !            86: *     .. Local Scalars ..
        !            87:       INTEGER            I
        !            88:       DOUBLE PRECISION   EABS, TMP1
        !            89: 
        !            90: *     ..
        !            91: *     .. Intrinsic Functions ..
        !            92:       INTRINSIC          ABS
        !            93: *     ..
        !            94: *     .. Executable Statements ..
        !            95: *
        !            96:       INFO = 0
        !            97: 
        !            98: *     Compute splitting points
        !            99:       NSPLIT = 1
        !           100:       IF(SPLTOL.LT.ZERO) THEN
        !           101: *        Criterion based on absolute off-diagonal value
        !           102:          TMP1 = ABS(SPLTOL)* TNRM
        !           103:          DO 9 I = 1, N-1
        !           104:             EABS = ABS( E(I) )
        !           105:             IF( EABS .LE. TMP1) THEN
        !           106:                E(I) = ZERO
        !           107:                E2(I) = ZERO
        !           108:                ISPLIT( NSPLIT ) = I
        !           109:                NSPLIT = NSPLIT + 1
        !           110:             END IF
        !           111:  9       CONTINUE
        !           112:       ELSE
        !           113: *        Criterion that guarantees relative accuracy
        !           114:          DO 10 I = 1, N-1
        !           115:             EABS = ABS( E(I) )
        !           116:             IF( EABS .LE. SPLTOL * SQRT(ABS(D(I)))*SQRT(ABS(D(I+1))) )
        !           117:      $      THEN
        !           118:                E(I) = ZERO
        !           119:                E2(I) = ZERO
        !           120:                ISPLIT( NSPLIT ) = I
        !           121:                NSPLIT = NSPLIT + 1
        !           122:             END IF
        !           123:  10      CONTINUE
        !           124:       ENDIF
        !           125:       ISPLIT( NSPLIT ) = N
        !           126: 
        !           127:       RETURN
        !           128: *
        !           129: *     End of DLARRA
        !           130: *
        !           131:       END

CVSweb interface <joel.bertrand@systella.fr>