LAPACK  3.6.1 LAPACK: Linear Algebra PACKage
 subroutine dsysv ( character UPLO, integer N, integer NRHS, double precision, dimension( lda, * ) A, integer LDA, integer, dimension( * ) IPIV, double precision, dimension( ldb, * ) B, integer LDB, double precision, dimension( * ) WORK, integer LWORK, integer INFO )

DSYSV computes the solution to system of linear equations A * X = B for SY matrices

Purpose:
``` DSYSV computes the solution to a real system of linear equations
A * X = B,
where A is an N-by-N symmetric matrix and X and B are N-by-NRHS
matrices.

The diagonal pivoting method is used to factor A as
A = U * D * U**T,  if UPLO = 'U', or
A = L * D * L**T,  if UPLO = 'L',
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.  The factored form of A is then
used to solve the system of equations A * X = B.```
Parameters
 [in] UPLO ``` UPLO is CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored.``` [in] N ``` N is INTEGER The number of linear equations, i.e., the order of the matrix A. N >= 0.``` [in] NRHS ``` NRHS is INTEGER The number of right hand sides, i.e., the number of columns of the matrix B. NRHS >= 0.``` [in,out] A ``` A is DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains 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 triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit, if INFO = 0, the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by DSYTRF.``` [in] LDA ``` LDA is INTEGER The leading dimension of the array A. LDA >= max(1,N).``` [out] IPIV ``` IPIV is INTEGER array, dimension (N) Details of the interchanges and the block structure of D, as determined by DSYTRF. If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged, and D(k,k) is a 1-by-1 diagonal block. If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block.``` [in,out] B ``` B is DOUBLE PRECISION array, dimension (LDB,NRHS) On entry, the N-by-NRHS right hand side matrix B. On exit, if INFO = 0, the N-by-NRHS solution matrix X.``` [in] LDB ``` LDB is INTEGER The leading dimension of the array B. LDB >= max(1,N).``` [out] WORK ``` WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) On exit, if INFO = 0, WORK(1) returns the optimal LWORK.``` [in] LWORK ``` LWORK is INTEGER The length of WORK. LWORK >= 1, and for best performance LWORK >= max(1,N*NB), where NB is the optimal blocksize for DSYTRF. for LWORK < N, TRS will be done with Level BLAS 2 for LWORK >= N, TRS will be done with Level BLAS 3 If LWORK = -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 LWORK is issued by XERBLA.``` [out] INFO ``` INFO is INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal 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, so the solution could not be computed.```
Date
November 2011

Definition at line 173 of file dsysv.f.

173 *
174 * -- LAPACK driver routine (version 3.4.0) --
175 * -- LAPACK is a software package provided by Univ. of Tennessee, --
176 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
177 * November 2011
178 *
179 * .. Scalar Arguments ..
180  CHARACTER uplo
181  INTEGER info, lda, ldb, lwork, n, nrhs
182 * ..
183 * .. Array Arguments ..
184  INTEGER ipiv( * )
185  DOUBLE PRECISION a( lda, * ), b( ldb, * ), work( * )
186 * ..
187 *
188 * =====================================================================
189 *
190 * .. Local Scalars ..
191  LOGICAL lquery
192  INTEGER lwkopt
193 * ..
194 * .. External Functions ..
195  LOGICAL lsame
196  EXTERNAL lsame
197 * ..
198 * .. External Subroutines ..
199  EXTERNAL xerbla, dsytrf, dsytrs, dsytrs2
200 * ..
201 * .. Intrinsic Functions ..
202  INTRINSIC max
203 * ..
204 * .. Executable Statements ..
205 *
206 * Test the input parameters.
207 *
208  info = 0
209  lquery = ( lwork.EQ.-1 )
210  IF( .NOT.lsame( uplo, 'U' ) .AND. .NOT.lsame( uplo, 'L' ) ) THEN
211  info = -1
212  ELSE IF( n.LT.0 ) THEN
213  info = -2
214  ELSE IF( nrhs.LT.0 ) THEN
215  info = -3
216  ELSE IF( lda.LT.max( 1, n ) ) THEN
217  info = -5
218  ELSE IF( ldb.LT.max( 1, n ) ) THEN
219  info = -8
220  ELSE IF( lwork.LT.1 .AND. .NOT.lquery ) THEN
221  info = -10
222  END IF
223 *
224  IF( info.EQ.0 ) THEN
225  IF( n.EQ.0 ) THEN
226  lwkopt = 1
227  ELSE
228  CALL dsytrf( uplo, n, a, lda, ipiv, work, -1, info )
229  lwkopt = work(1)
230  END IF
231  work( 1 ) = lwkopt
232  END IF
233 *
234  IF( info.NE.0 ) THEN
235  CALL xerbla( 'DSYSV ', -info )
236  RETURN
237  ELSE IF( lquery ) THEN
238  RETURN
239  END IF
240 *
241 * Compute the factorization A = U*D*U**T or A = L*D*L**T.
242 *
243  CALL dsytrf( uplo, n, a, lda, ipiv, work, lwork, info )
244  IF( info.EQ.0 ) THEN
245 *
246 * Solve the system A*X = B, overwriting B with X.
247 *
248  IF ( lwork.LT.n ) THEN
249 *
250 * Solve with TRS ( Use Level BLAS 2)
251 *
252  CALL dsytrs( uplo, n, nrhs, a, lda, ipiv, b, ldb, info )
253 *
254  ELSE
255 *
256 * Solve with TRS2 ( Use Level BLAS 3)
257 *
258  CALL dsytrs2( uplo,n,nrhs,a,lda,ipiv,b,ldb,work,info )
259 *
260  END IF
261 *
262  END IF
263 *
264  work( 1 ) = lwkopt
265 *
266  RETURN
267 *
268 * End of DSYSV
269 *
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine dsytrs(UPLO, N, NRHS, A, LDA, IPIV, B, LDB, INFO)
DSYTRS
Definition: dsytrs.f:122
subroutine dsytrf(UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
DSYTRF
Definition: dsytrf.f:184
subroutine dsytrs2(UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK, INFO)
DSYTRS2
Definition: dsytrs2.f:134
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55

Here is the call graph for this function:

Here is the caller graph for this function: