summaryrefslogtreecommitdiff
path: root/SRC/ssytri2.f
diff options
context:
space:
mode:
authorjulie <julielangou@users.noreply.github.com>2011-03-04 20:44:21 +0000
committerjulie <julielangou@users.noreply.github.com>2011-03-04 20:44:21 +0000
commitb860077bc7317de1943efb058df48de0bddcab7c (patch)
treef27c4ee3c1a474f7b6966266a87ccb408a6a6744 /SRC/ssytri2.f
parent472bfdccf7aa2fef03d010e8f60644cf90383e9d (diff)
downloadlapack-b860077bc7317de1943efb058df48de0bddcab7c.tar.gz
lapack-b860077bc7317de1943efb058df48de0bddcab7c.tar.bz2
lapack-b860077bc7317de1943efb058df48de0bddcab7c.zip
Correct bug 0076 reported by Intel Team on lapack forum
Problem in ?(sy/he)tri2 was found. For matrices with small N subroutine pass parameter NBMAX to ?(sy/he)tri2x which could be large than N. In test for this functionality this is hide. Local test subroutine ilaenv.f pass proper values of NB. But if use ordinary ilaenv we will get mistake. If we implemented IF ( NBMAX .GE. N ) THEN MINSIZE = N ELSE MINSIZE = (N+NBMAX+1)*(NBMAX+3) END IF and will call IF( NBMAX .GE. N ) THEN CALL SSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO ) ELSE CALL SSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO ) END IF the problem will be solved. Some other minor changes on workspace query.
Diffstat (limited to 'SRC/ssytri2.f')
-rw-r--r--SRC/ssytri2.f19
1 files changed, 14 insertions, 5 deletions
diff --git a/SRC/ssytri2.f b/SRC/ssytri2.f
index 21867f47..0d488bcc 100644
--- a/SRC/ssytri2.f
+++ b/SRC/ssytri2.f
@@ -7,19 +7,20 @@
*
* -- Written by Julie Langou of the Univ. of TN --
*
+* @generated s
* .. Scalar Arguments ..
CHARACTER UPLO
INTEGER INFO, LDA, LWORK, N
* ..
* .. Array Arguments ..
INTEGER IPIV( * )
- REAL A( LDA, * ), WORK( * )
+ REAL A( LDA, * ), WORK( * )
* ..
*
* Purpose
* =======
*
-* SSYTRI2 computes the inverse of a real symmetric indefinite matrix
+* SSYTRI2 computes the inverse of a REAL hermitian indefinite matrix
* A using the factorization A = U*D*U**T or A = L*D*L**T computed by
* SSYTRF. SSYTRI2 sets the LEADING DIMENSION of the workspace
* before calling SSYTRI2X that actually computes the inverse.
@@ -94,7 +95,11 @@
LQUERY = ( LWORK.EQ.-1 )
* Get blocksize
NBMAX = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 )
- MINSIZE = (N+NBMAX+1)*(NBMAX+3)
+ IF ( NBMAX .GE. N ) THEN
+ MINSIZE = N
+ ELSE
+ MINSIZE = (N+NBMAX+1)*(NBMAX+3)
+ END IF
*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
@@ -113,13 +118,17 @@
CALL XERBLA( 'SSYTRI2', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK(1)=(N+NBMAX+1)*(NBMAX+3)
+ WORK(1)=MINSIZE
RETURN
END IF
IF( N.EQ.0 )
$ RETURN
- CALL SSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO )
+ IF( NBMAX .GE. N ) THEN
+ CALL SSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO )
+ ELSE
+ CALL SSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO )
+ END IF
RETURN
*
* End of SSYTRI2