LAPACK 3.3.1 Linear Algebra PACKage

dlarra.f

Go to the documentation of this file.
```00001       SUBROUTINE DLARRA( N, D, E, E2, SPLTOL, TNRM,
00002      \$                    NSPLIT, ISPLIT, INFO )
00003       IMPLICIT NONE
00004 *
00005 *  -- LAPACK auxiliary routine (version 3.2.2) --
00006 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00007 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00008 *     June 2010
00009 *
00010 *     .. Scalar Arguments ..
00011       INTEGER            INFO, N, NSPLIT
00012       DOUBLE PRECISION    SPLTOL, TNRM
00013 *     ..
00014 *     .. Array Arguments ..
00015       INTEGER            ISPLIT( * )
00016       DOUBLE PRECISION   D( * ), E( * ), E2( * )
00017 *     ..
00018 *
00019 *  Purpose
00020 *  =======
00021 *
00022 *  Compute the splitting points with threshold SPLTOL.
00023 *  DLARRA sets any "small" off-diagonal elements to zero.
00024 *
00025 *  Arguments
00026 *  =========
00027 *
00028 *  N       (input) INTEGER
00029 *          The order of the matrix. N > 0.
00030 *
00031 *  D       (input) DOUBLE PRECISION array, dimension (N)
00032 *          On entry, the N diagonal elements of the tridiagonal
00033 *          matrix T.
00034 *
00035 *  E       (input/output) DOUBLE PRECISION array, dimension (N)
00036 *          On entry, the first (N-1) entries contain the subdiagonal
00037 *          elements of the tridiagonal matrix T; E(N) need not be set.
00038 *          On exit, the entries E( ISPLIT( I ) ), 1 <= I <= NSPLIT,
00039 *          are set to zero, the other entries of E are untouched.
00040 *
00041 *  E2      (input/output) DOUBLE PRECISION array, dimension (N)
00042 *          On entry, the first (N-1) entries contain the SQUARES of the
00043 *          subdiagonal elements of the tridiagonal matrix T;
00044 *          E2(N) need not be set.
00045 *          On exit, the entries E2( ISPLIT( I ) ),
00046 *          1 <= I <= NSPLIT, have been set to zero
00047 *
00048 *  SPLTOL  (input) DOUBLE PRECISION
00049 *          The threshold for splitting. Two criteria can be used:
00050 *          SPLTOL<0 : criterion based on absolute off-diagonal value
00051 *          SPLTOL>0 : criterion that preserves relative accuracy
00052 *
00053 *  TNRM    (input) DOUBLE PRECISION
00054 *          The norm of the matrix.
00055 *
00056 *  NSPLIT  (output) INTEGER
00057 *          The number of blocks T splits into. 1 <= NSPLIT <= N.
00058 *
00059 *  ISPLIT  (output) INTEGER array, dimension (N)
00060 *          The splitting points, at which T breaks up into blocks.
00061 *          The first block consists of rows/columns 1 to ISPLIT(1),
00062 *          the second of rows/columns ISPLIT(1)+1 through ISPLIT(2),
00063 *          etc., and the NSPLIT-th consists of rows/columns
00064 *          ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N.
00065 *
00066 *
00067 *  INFO    (output) INTEGER
00068 *          = 0:  successful exit
00069 *
00070 *  Further Details
00071 *  ===============
00072 *
00073 *  Based on contributions by
00074 *     Beresford Parlett, University of California, Berkeley, USA
00075 *     Jim Demmel, University of California, Berkeley, USA
00076 *     Inderjit Dhillon, University of Texas, Austin, USA
00077 *     Osni Marques, LBNL/NERSC, USA
00078 *     Christof Voemel, University of California, Berkeley, USA
00079 *
00080 *  =====================================================================
00081 *
00082 *     .. Parameters ..
00083       DOUBLE PRECISION   ZERO
00084       PARAMETER          ( ZERO = 0.0D0 )
00085 *     ..
00086 *     .. Local Scalars ..
00087       INTEGER            I
00088       DOUBLE PRECISION   EABS, TMP1
00089
00090 *     ..
00091 *     .. Intrinsic Functions ..
00092       INTRINSIC          ABS
00093 *     ..
00094 *     .. Executable Statements ..
00095 *
00096       INFO = 0
00097
00098 *     Compute splitting points
00099       NSPLIT = 1
00100       IF(SPLTOL.LT.ZERO) THEN
00101 *        Criterion based on absolute off-diagonal value
00102          TMP1 = ABS(SPLTOL)* TNRM
00103          DO 9 I = 1, N-1
00104             EABS = ABS( E(I) )
00105             IF( EABS .LE. TMP1) THEN
00106                E(I) = ZERO
00107                E2(I) = ZERO
00108                ISPLIT( NSPLIT ) = I
00109                NSPLIT = NSPLIT + 1
00110             END IF
00111  9       CONTINUE
00112       ELSE
00113 *        Criterion that guarantees relative accuracy
00114          DO 10 I = 1, N-1
00115             EABS = ABS( E(I) )
00116             IF( EABS .LE. SPLTOL * SQRT(ABS(D(I)))*SQRT(ABS(D(I+1))) )
00117      \$      THEN
00118                E(I) = ZERO
00119                E2(I) = ZERO
00120                ISPLIT( NSPLIT ) = I
00121                NSPLIT = NSPLIT + 1
00122             END IF
00123  10      CONTINUE
00124       ENDIF
00125       ISPLIT( NSPLIT ) = N
00126
00127       RETURN
00128 *
00129 *     End of DLARRA
00130 *
00131       END
```