LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages

◆ ssyt22()

subroutine ssyt22 ( integer itype,
character uplo,
integer n,
integer m,
integer kband,
real, dimension( lda, * ) a,
integer lda,
real, dimension( * ) d,
real, dimension( * ) e,
real, dimension( ldu, * ) u,
integer ldu,
real, dimension( ldv, * ) v,
integer ldv,
real, dimension( * ) tau,
real, dimension( * ) work,
real, dimension( 2 ) result )

SSYT22

Purpose:
!> !> SSYT22 generally checks a decomposition of the form !> !> A U = U S !> !> where A is symmetric, the columns of U are orthonormal, and S !> is diagonal (if KBAND=0) or symmetric tridiagonal (if !> KBAND=1). If ITYPE=1, then U is represented as a dense matrix, !> otherwise the U is expressed as a product of Householder !> transformations, whose vectors are stored in the array and !> whose scaling constants are in we shall use the letter !> to refer to the product of Householder transformations !> (which should be equal to U). !> !> Specifically, if ITYPE=1, then: !> !> RESULT(1) = | U**T A U - S | / ( |A| m ulp ) and !> RESULT(2) = | I - U**T U | / ( m ulp ) !>
!> ITYPE INTEGER !> Specifies the type of tests to be performed. !> 1: U expressed as a dense orthogonal matrix: !> RESULT(1) = | A - U S U**T | / ( |A| n ulp ) and !> RESULT(2) = | I - U U**T | / ( n ulp ) !> !> UPLO CHARACTER !> If UPLO='U', the upper triangle of A will be used and the !> (strictly) lower triangle will not be referenced. If !> UPLO='L', the lower triangle of A will be used and the !> (strictly) upper triangle will not be referenced. !> Not modified. !> !> N INTEGER !> The size of the matrix. If it is zero, SSYT22 does nothing. !> It must be at least zero. !> Not modified. !> !> M INTEGER !> The number of columns of U. If it is zero, SSYT22 does !> nothing. It must be at least zero. !> Not modified. !> !> KBAND INTEGER !> The bandwidth of the matrix. It may only be zero or one. !> If zero, then S is diagonal, and E is not referenced. If !> one, then S is symmetric tri-diagonal. !> Not modified. !> !> A REAL array, dimension (LDA , N) !> The original (unfactored) matrix. It is assumed to be !> symmetric, and only the upper (UPLO='U') or only the lower !> (UPLO='L') will be referenced. !> Not modified. !> !> LDA INTEGER !> The leading dimension of A. It must be at least 1 !> and at least N. !> Not modified. !> !> D REAL array, dimension (N) !> The diagonal of the (symmetric tri-) diagonal matrix. !> Not modified. !> !> E REAL array, dimension (N) !> The off-diagonal of the (symmetric tri-) diagonal matrix. !> E(1) is ignored, E(2) is the (1,2) and (2,1) element, etc. !> Not referenced if KBAND=0. !> Not modified. !> !> U REAL array, dimension (LDU, N) !> If ITYPE=1 or 3, this contains the orthogonal matrix in !> the decomposition, expressed as a dense matrix. If ITYPE=2, !> then it is not referenced. !> Not modified. !> !> LDU INTEGER !> The leading dimension of U. LDU must be at least N and !> at least 1. !> Not modified. !> !> V REAL array, dimension (LDV, N) !> If ITYPE=2 or 3, the lower triangle of this array contains !> the Householder vectors used to describe the orthogonal !> matrix in the decomposition. If ITYPE=1, then it is not !> referenced. !> Not modified. !> !> LDV INTEGER !> The leading dimension of V. LDV must be at least N and !> at least 1. !> Not modified. !> !> TAU REAL array, dimension (N) !> If ITYPE >= 2, then TAU(j) is the scalar factor of !> v(j) v(j)**T in the Householder transformation H(j) of !> the product U = H(1)...H(n-2) !> If ITYPE < 2, then TAU is not referenced. !> Not modified. !> !> WORK REAL array, dimension (2*N**2) !> Workspace. !> Modified. !> !> RESULT REAL array, dimension (2) !> The values computed by the two tests described above. The !> values are currently limited to 1/ulp, to avoid overflow. !> RESULT(1) is always modified. RESULT(2) is modified only !> if LDU is at least N. !> Modified. !>
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 155 of file ssyt22.f.

157*
158* -- LAPACK test routine --
159* -- LAPACK is a software package provided by Univ. of Tennessee, --
160* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
161*
162* .. Scalar Arguments ..
163 CHARACTER UPLO
164 INTEGER ITYPE, KBAND, LDA, LDU, LDV, M, N
165* ..
166* .. Array Arguments ..
167 REAL A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
168 $ TAU( * ), U( LDU, * ), V( LDV, * ), WORK( * )
169* ..
170*
171* =====================================================================
172*
173* .. Parameters ..
174 REAL ZERO, ONE
175 parameter( zero = 0.0e0, one = 1.0e0 )
176* ..
177* .. Local Scalars ..
178 INTEGER J, JJ, JJ1, JJ2, NN, NNP1
179 REAL ANORM, ULP, UNFL, WNORM
180* ..
181* .. External Functions ..
182 REAL SLAMCH, SLANSY
183 EXTERNAL slamch, slansy
184* ..
185* .. External Subroutines ..
186 EXTERNAL sgemm, ssymm
187* ..
188* .. Intrinsic Functions ..
189 INTRINSIC max, min, real
190* ..
191* .. Executable Statements ..
192*
193 result( 1 ) = zero
194 result( 2 ) = zero
195 IF( n.LE.0 .OR. m.LE.0 )
196 $ RETURN
197*
198 unfl = slamch( 'Safe minimum' )
199 ulp = slamch( 'Precision' )
200*
201* Do Test 1
202*
203* Norm of A:
204*
205 anorm = max( slansy( '1', uplo, n, a, lda, work ), unfl )
206*
207* Compute error matrix:
208*
209* ITYPE=1: error = U**T A U - S
210*
211 CALL ssymm( 'L', uplo, n, m, one, a, lda, u, ldu, zero, work, n )
212 nn = n*n
213 nnp1 = nn + 1
214 CALL sgemm( 'T', 'N', m, m, n, one, u, ldu, work, n, zero,
215 $ work( nnp1 ), n )
216 DO 10 j = 1, m
217 jj = nn + ( j-1 )*n + j
218 work( jj ) = work( jj ) - d( j )
219 10 CONTINUE
220 IF( kband.EQ.1 .AND. n.GT.1 ) THEN
221 DO 20 j = 2, m
222 jj1 = nn + ( j-1 )*n + j - 1
223 jj2 = nn + ( j-2 )*n + j
224 work( jj1 ) = work( jj1 ) - e( j-1 )
225 work( jj2 ) = work( jj2 ) - e( j-1 )
226 20 CONTINUE
227 END IF
228 wnorm = slansy( '1', uplo, m, work( nnp1 ), n, work( 1 ) )
229*
230 IF( anorm.GT.wnorm ) THEN
231 result( 1 ) = ( wnorm / anorm ) / ( m*ulp )
232 ELSE
233 IF( anorm.LT.one ) THEN
234 result( 1 ) = ( min( wnorm, m*anorm ) / anorm ) / ( m*ulp )
235 ELSE
236 result( 1 ) = min( wnorm / anorm, real( m ) ) / ( m*ulp )
237 END IF
238 END IF
239*
240* Do Test 2
241*
242* Compute U**T U - I
243*
244 IF( itype.EQ.1 )
245 $ CALL sort01( 'Columns', n, m, u, ldu, work, 2*n*n,
246 $ result( 2 ) )
247*
248 RETURN
249*
250* End of SSYT22
251*
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
Definition sgemm.f:188
subroutine ssymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
SSYMM
Definition ssymm.f:189
real function slamch(cmach)
SLAMCH
Definition slamch.f:68
real function slansy(norm, uplo, n, a, lda, work)
SLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
Definition slansy.f:120
subroutine sort01(rowcol, m, n, u, ldu, work, lwork, resid)
SORT01
Definition sort01.f:116
Here is the call graph for this function:
Here is the caller graph for this function: