Files
lapack/TESTING/LIN/ssyt01.f
Julie e18d437924 Making LAPACK's code eternal... no more version and date in source files.
GitHub is now enabling us to track accurately version and date.
No need for this anymore.
2021-03-25 10:16:58 -07:00

221 lines
5.7 KiB
FortranFixed

*> \brief \b SSYT01
*
* =========== DOCUMENTATION ===========
*
* Online html documentation available at
* http://www.netlib.org/lapack/explore-html/
*
* Definition:
* ===========
*
* SUBROUTINE SSYT01( UPLO, N, A, LDA, AFAC, LDAFAC, IPIV, C, LDC,
* RWORK, RESID )
*
* .. Scalar Arguments ..
* CHARACTER UPLO
* INTEGER LDA, LDAFAC, LDC, N
* REAL RESID
* ..
* .. Array Arguments ..
* INTEGER IPIV( * )
* REAL A( LDA, * ), AFAC( LDAFAC, * ), C( LDC, * ),
* $ RWORK( * )
* ..
*
*
*> \par Purpose:
* =============
*>
*> \verbatim
*>
*> SSYT01 reconstructs a symmetric indefinite matrix A from its
*> block L*D*L' or U*D*U' factorization and computes the residual
*> norm( C - A ) / ( N * norm(A) * EPS ),
*> where C is the reconstructed matrix and EPS is the machine epsilon.
*> \endverbatim
*
* Arguments:
* ==========
*
*> \param[in] UPLO
*> \verbatim
*> UPLO is CHARACTER*1
*> Specifies whether the upper or lower triangular part of the
*> symmetric matrix A is stored:
*> = 'U': Upper triangular
*> = 'L': Lower triangular
*> \endverbatim
*>
*> \param[in] N
*> \verbatim
*> N is INTEGER
*> The number of rows and columns of the matrix A. N >= 0.
*> \endverbatim
*>
*> \param[in] A
*> \verbatim
*> A is REAL array, dimension (LDA,N)
*> The original symmetric matrix A.
*> \endverbatim
*>
*> \param[in] LDA
*> \verbatim
*> LDA is INTEGER
*> The leading dimension of the array A. LDA >= max(1,N)
*> \endverbatim
*>
*> \param[in] AFAC
*> \verbatim
*> AFAC is REAL array, dimension (LDAFAC,N)
*> The factored form of the matrix A. AFAC contains the block
*> diagonal matrix D and the multipliers used to obtain the
*> factor L or U from the block L*D*L' or U*D*U' factorization
*> as computed by SSYTRF.
*> \endverbatim
*>
*> \param[in] LDAFAC
*> \verbatim
*> LDAFAC is INTEGER
*> The leading dimension of the array AFAC. LDAFAC >= max(1,N).
*> \endverbatim
*>
*> \param[in] IPIV
*> \verbatim
*> IPIV is INTEGER array, dimension (N)
*> The pivot indices from SSYTRF.
*> \endverbatim
*>
*> \param[out] C
*> \verbatim
*> C is REAL array, dimension (LDC,N)
*> \endverbatim
*>
*> \param[in] LDC
*> \verbatim
*> LDC is INTEGER
*> The leading dimension of the array C. LDC >= max(1,N).
*> \endverbatim
*>
*> \param[out] RWORK
*> \verbatim
*> RWORK is REAL array, dimension (N)
*> \endverbatim
*>
*> \param[out] RESID
*> \verbatim
*> RESID is REAL
*> If UPLO = 'L', norm(L*D*L' - A) / ( N * norm(A) * EPS )
*> If UPLO = 'U', norm(U*D*U' - A) / ( N * norm(A) * EPS )
*> \endverbatim
*
* Authors:
* ========
*
*> \author Univ. of Tennessee
*> \author Univ. of California Berkeley
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
*> \ingroup single_lin
*
* =====================================================================
SUBROUTINE SSYT01( UPLO, N, A, LDA, AFAC, LDAFAC, IPIV, C, LDC,
$ RWORK, RESID )
*
* -- LAPACK test routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
CHARACTER UPLO
INTEGER LDA, LDAFAC, LDC, N
REAL RESID
* ..
* .. Array Arguments ..
INTEGER IPIV( * )
REAL A( LDA, * ), AFAC( LDAFAC, * ), C( LDC, * ),
$ RWORK( * )
* ..
*
* =====================================================================
*
* .. Parameters ..
REAL ZERO, ONE
PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
* ..
* .. Local Scalars ..
INTEGER I, INFO, J
REAL ANORM, EPS
* ..
* .. External Functions ..
LOGICAL LSAME
REAL SLAMCH, SLANSY
EXTERNAL LSAME, SLAMCH, SLANSY
* ..
* .. External Subroutines ..
EXTERNAL SLASET, SLAVSY
* ..
* .. Intrinsic Functions ..
INTRINSIC REAL
* ..
* .. Executable Statements ..
*
* Quick exit if N = 0.
*
IF( N.LE.0 ) THEN
RESID = ZERO
RETURN
END IF
*
* Determine EPS and the norm of A.
*
EPS = SLAMCH( 'Epsilon' )
ANORM = SLANSY( '1', UPLO, N, A, LDA, RWORK )
*
* Initialize C to the identity matrix.
*
CALL SLASET( 'Full', N, N, ZERO, ONE, C, LDC )
*
* Call SLAVSY to form the product D * U' (or D * L' ).
*
CALL SLAVSY( UPLO, 'Transpose', 'Non-unit', N, N, AFAC, LDAFAC,
$ IPIV, C, LDC, INFO )
*
* Call SLAVSY again to multiply by U (or L ).
*
CALL SLAVSY( UPLO, 'No transpose', 'Unit', N, N, AFAC, LDAFAC,
$ IPIV, C, LDC, INFO )
*
* Compute the difference C - A .
*
IF( LSAME( UPLO, 'U' ) ) THEN
DO 20 J = 1, N
DO 10 I = 1, J
C( I, J ) = C( I, J ) - A( I, J )
10 CONTINUE
20 CONTINUE
ELSE
DO 40 J = 1, N
DO 30 I = J, N
C( I, J ) = C( I, J ) - A( I, J )
30 CONTINUE
40 CONTINUE
END IF
*
* Compute norm( C - A ) / ( N * norm(A) * EPS )
*
RESID = SLANSY( '1', UPLO, N, C, LDC, RWORK )
*
IF( ANORM.LE.ZERO ) THEN
IF( RESID.NE.ZERO )
$ RESID = ONE / EPS
ELSE
RESID = ( ( RESID / REAL( N ) ) / ANORM ) / EPS
END IF
*
RETURN
*
* End of SSYT01
*
END