Contents


NAME

     dsytrf - compute  the  factorization  of  a  real  symmetric
     matrix A using the Bunch-Kaufman diagonal pivoting method

SYNOPSIS

     SUBROUTINE DSYTRF(UPLO, N, A, LDA, IPIVOT, WORK, LDWORK, INFO)

     CHARACTER * 1 UPLO
     INTEGER N, LDA, LDWORK, INFO
     INTEGER IPIVOT(*)
     DOUBLE PRECISION A(LDA,*), WORK(*)

     SUBROUTINE DSYTRF_64(UPLO, N, A, LDA, IPIVOT, WORK, LDWORK, INFO)

     CHARACTER * 1 UPLO
     INTEGER*8 N, LDA, LDWORK, INFO
     INTEGER*8 IPIVOT(*)
     DOUBLE PRECISION A(LDA,*), WORK(*)

  F95 INTERFACE
     SUBROUTINE SYTRF(UPLO, N, A, [LDA], IPIVOT, [WORK], [LDWORK], [INFO])

     CHARACTER(LEN=1) :: UPLO
     INTEGER :: N, LDA, LDWORK, INFO
     INTEGER, DIMENSION(:) :: IPIVOT
     REAL(8), DIMENSION(:) :: WORK
     REAL(8), DIMENSION(:,:) :: A

     SUBROUTINE SYTRF_64(UPLO, N, A, [LDA], IPIVOT, [WORK], [LDWORK],
            [INFO])

     CHARACTER(LEN=1) :: UPLO
     INTEGER(8) :: N, LDA, LDWORK, INFO
     INTEGER(8), DIMENSION(:) :: IPIVOT
     REAL(8), DIMENSION(:) :: WORK
     REAL(8), DIMENSION(:,:) :: A

  C INTERFACE
     #include <sunperf.h>

     void dsytrf(char uplo,  int  n,  double  *a,  int  lda,  int
               *ipivot, int *info);

     void dsytrf_64(char uplo, long n, double *a, long lda,  long
               *ipivot, long *info);

PURPOSE

     dsytrf computes the factorization of a real symmetric matrix
     A  using  the  Bunch-Kaufman  diagonal pivoting method.  The
     form of the factorization is

        A = U*D*U**T  or  A = L*D*L**T

     where U (or L) is a product of permutation  and  unit  upper
     (lower)  triangular  matrices,  and D is symmetric and block
     diagonal with 1-by-1 and 2-by-2 diagonal blocks.

     This is the blocked version of the algorithm, calling  Level
     3 BLAS.

ARGUMENTS

     UPLO (input)
               = 'U':  Upper triangle of A is stored;
               = 'L':  Lower triangle of A is stored.

     N (input) The order of the matrix A.  N >= 0.

     A (input/output)
               On entry, the symmetric matrix A.  If UPLO =  'U',
               the leading N-by-N upper triangular part of A con-
               tains the upper triangular part of the  matrix  A,
               and the strictly lower triangular part of A is not
               referenced.  If UPLO =  'L',  the  leading  N-by-N
               lower triangular part of A contains the lower tri-
               angular part of the matrix  A,  and  the  strictly
               upper triangular part of A is not referenced.

               On exit, the block diagonal matrix D and the  mul-
               tipliers  used  to  obtain  the factor U or L (see
               below for further details).

     LDA (input)
               The leading dimension of  the  array  A.   LDA  >=
               max(1,N).

     IPIVOT (output)
               Details of the interchanges and the  block  struc-
               ture  of  D.   If  IPIVOT(k)  >  0,  then rows and
               columns k  and  IPIVOT(k)  were  interchanged  and
               D(k,k)  is a 1-by-1 diagonal block.  If UPLO = 'U'
               and IPIVOT(k) = IPIVOT(k-1) <  0,  then  rows  and
               columns  k-1  and -IPIVOT(k) were interchanged and
               D(k-1:k,k-1:k) is a  2-by-2  diagonal  block.   If
               UPLO  =  'L' and IPIVOT(k) = IPIVOT(k+1) < 0, then
               rows and columns k+1 and  -IPIVOT(k)  were  inter-
               changed  and  D(k:k+1,k:k+1)  is a 2-by-2 diagonal
               block.

     WORK (workspace)
               On exit, if INFO = 0, WORK(1) returns the  optimal
               LDWORK.

     LDWORK (input)
               The length of WORK.  LDWORK >=1.  For best perfor-
               mance  LDWORK  >= N*NB, where NB is the block size
               returned by ILAENV.

               If LDWORK = -1, then a workspace query is assumed;
               the  routine  only  calculates the optimal size of
               the WORK array, returns this value  as  the  first
               entry  of  the  WORK  array,  and no error message
               related to LDWORK is issued by XERBLA.

     INFO (output)
               = 0:  successful exit
               < 0:  if INFO = -i, the i-th argument had an ille-
               gal value
               > 0:  if INFO = i, D(i,i) is  exactly  zero.   The
               factorization  has  been  completed, but the block
               diagonal matrix D is exactly singular,  and  divi-
               sion  by  zero will occur if it is used to solve a
               system of equations.

FURTHER DETAILS

     If UPLO = 'U', then A = U*D*U', where
        U = P(n)*U(n)* ... *P(k)U(k)* ...,
     i.e., U is a product of terms P(k)*U(k), where  k  decreases
     from  n  to  1 in steps of 1 or 2, and D is a block diagonal
     matrix with 1-by-1 and 2-by-2 diagonal blocks D(k).  P(k) is
     a  permutation matrix as defined by IPIVOT(k), and U(k) is a
     unit upper triangular matrix,  such  that  if  the  diagonal
     block D(k) is of order s (s = 1 or 2), then

                (   I    v    0   )   k-s
        U(k) =  (   0    I    0   )   s
                (   0    0    I   )   n-k
                   k-s   s   n-k

     If s = 1, D(k) overwrites A(k,k), and  v  overwrites  A(1:k-
     1,k).   If s = 2, the upper triangle of D(k) overwrites A(k-
     1,k-1), A(k-1,k), and A(k,k), and  v  overwrites  A(1:k-2,k-
     1:k).

     If UPLO = 'L', then A = L*D*L', where
        L = P(1)*L(1)* ... *P(k)*L(k)* ...,
     i.e., L is a product of terms P(k)*L(k), where  k  increases
     from  1  to  n in steps of 1 or 2, and D is a block diagonal
     matrix with 1-by-1 and 2-by-2 diagonal blocks D(k).  P(k) is
     a  permutation matrix as defined by IPIVOT(k), and L(k) is a
     unit lower triangular matrix,  such  that  if  the  diagonal
     block D(k) is of order s (s = 1 or 2), then

                (   I    0     0   )  k-1
        L(k) =  (   0    I     0   )  s
                (   0    v     I   )  n-k-s+1
                   k-1   s  n-k-s+1

     If  s  =  1,  D(k)  overwrites  A(k,k),  and  v   overwrites
     A(k+1:n,k).  If s = 2, the lower triangle of D(k) overwrites
     A(k,k),  A(k+1,k),  and   A(k+1,k+1),   and   v   overwrites
     A(k+2:n,k:k+1).