DLARRB2(3)    ScaLAPACK routine of NEC Numeric Library Collection   DLARRB2(3)



NAME
       DLARRB2  -  does  "limited"  bisection to refine the eigenvalues of L D
       L^T, W( IFIRST-OFFSET ) through W( ILAST-OFFSET ), to more accuracy

SYNOPSIS
       SUBROUTINE DLARRB2( N, D, LLD, IFIRST, ILAST, RTOL1, RTOL2, OFFSET,  W,
                           WGAP,  WERR,  WORK,  IWORK, PIVMIN, LGPVMN, LGSPDM,
                           TWIST, INFO )

           INTEGER         IFIRST, ILAST, INFO, N, OFFSET, TWIST

           DOUBLE          PRECISION LGPVMN, LGSPDM, PIVMIN, RTOL1, RTOL2

           INTEGER         IWORK( * )

           DOUBLE          PRECISION D( * ), LLD( * ), W(  *  ),  WERR(  *  ),
                           WGAP( * ), WORK( * )

PURPOSE
       Given  the  relatively robust representation(RRR) L D L^T, DLARRB2 does
       "limited" bisection to refine the eigenvalues of L D  L^T,  W(  IFIRST-
       OFFSET  )  through W( ILAST-OFFSET ), to more accuracy. Initial guesses
       for these eigenvalues are input in W, the corresponding estimate of the
       error  in  these  guesses  and  their  gaps are input in WERR and WGAP,
       respectively. During bisection, intervals [left, right] are  maintained
       by  storing  their  mid-points and semi-widths in the arrays W and WERR
       respectively.

       NOTE: There are very few minor differences between DLARRB  from  LAPACK
       and this current subroutine DLARRB2.
       The  most  important  reason for creating this nearly identical copy is
       profiling: in the  ScaLAPACK  MRRR  algorithm,  eigenvalue  computation
       using  DLARRB2 is used for refinement in the construction of the repre-
       sentation tree, as opposed to the initial computation of the  eigenval-
       ues  for the root RRR which uses DLARRB. When profiling, this allows an
       easy quantification of refinement work vs. computing eigenvalues of the
       root.


ARGUMENTS
       N       (input) INTEGER
               The order of the matrix.

       D       (input) DOUBLE PRECISION array, dimension (N)
               The N diagonal elements of the diagonal matrix D.

       LLD     (input) DOUBLE PRECISION array, dimension (N-1)
               The (N-1) elements L(i)*L(i)*D(i).

       IFIRST  (input) INTEGER
               The index of the first eigenvalue to be computed.

       ILAST   (input) INTEGER
               The index of the last eigenvalue to be computed.

       RTOL1   (input) DOUBLE PRECISION

       RTOL2   (input) DOUBLE PRECISION
               Tolerance for the convergence of the bisection intervals.
               An  interval  [LEFT,RIGHT]  has converged if RIGHT-LEFT.LT.MAX(
               RTOL1*GAP, RTOL2*MAX(|LEFT|,|RIGHT|) ) where GAP is the  (esti-
               mated) distance to the nearest eigenvalue.

       OFFSET  (input) INTEGER
               Offset for the arrays W, WGAP and WERR, i.e., the IFIRST-OFFSET
               through ILAST-OFFSET elements of these arrays are to be used.

       W       (input/output) DOUBLE PRECISION array, dimension (N)
               On input, W( IFIRST-OFFSET )  through  W(  ILAST-OFFSET  )  are
               estimates  of the eigenvalues of L D L^T indexed IFIRST through
               ILAST.
               On output, these estimates are refined.

       WGAP    (input/output) DOUBLE PRECISION array, dimension (N-1)
               On input, the (estimated) gaps between consecutive  eigenvalues
               of L D L^T, i.e., WGAP(I-OFFSET) is the gap between eigenvalues
               I and I+1. Note that if IFIRST.EQ.ILAST  then  WGAP(IFIRST-OFF-
               SET) must be set to ZERO.
               On output, these gaps are refined.

       WERR    (input/output) DOUBLE PRECISION array, dimension (N)
               On  input,  WERR(  IFIRST-OFFSET ) through WERR( ILAST-OFFSET )
               are the errors in the estimates of the  corresponding  elements
               in W.
               On output, these errors are refined.

       WORK    (workspace) DOUBLE PRECISION array, dimension (4*N)
               Workspace.

       IWORK   (workspace) INTEGER array, dimension (2*N)
               Workspace.

       PIVMIN  (input) DOUBLE PRECISION
               The minimum pivot in the sturm sequence.

       LGPVMN  (input) DOUBLE PRECISION
               Logarithm of PIVMIN, precomputed.

       LGSPDM  (input) DOUBLE PRECISION
               Logarithm of the spectral diameter, precomputed.

       TWIST   (input) INTEGER
               The  twist index for the twisted factorization that is used for
               the negcount.
               TWIST = N: Compute negcount from L D L^T - LAMBDA  I  =  L+  D+
               L+^T
               TWIST  =  1:  Compute  negcount from L D L^T - LAMBDA I = U- D-
               U-^T
               TWIST = R: Compute negcount from L D L^T - LAMBDA I = N(r) D(r)
               N(r)

       INFO    (output) INTEGER
               Error flag.



ScaLAPACK routine               31 October 2017                     DLARRB2(3)