3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * REAL FUNCTION SQRT12( M, N, A, LDA, S, WORK, LWORK )
13 * .. Scalar Arguments ..
14 * INTEGER LDA, LWORK, M, N
16 * .. Array Arguments ..
17 * REAL A( LDA, * ), S( * ), WORK( LWORK )
26 *> SQRT12 computes the singular values `svlues' of the upper trapezoid
27 *> of A(1:M,1:N) and returns the ratio
29 *> || s - svlues||/(||svlues||*eps*max(M,N))
38 *> The number of rows of the matrix A.
44 *> The number of columns of the matrix A.
49 *> A is REAL array, dimension (LDA,N)
50 *> The M-by-N matrix A. Only the upper trapezoid is referenced.
56 *> The leading dimension of the array A.
61 *> S is REAL array, dimension (min(M,N))
62 *> The singular values of the matrix A.
67 *> WORK is REAL array, dimension (LWORK)
73 *> The length of the array WORK. LWORK >= max(M*N + 4*min(M,N) +
74 *> max(M,N), M*N+2*MIN( M, N )+4*N).
80 *> \author Univ. of Tennessee
81 *> \author Univ. of California Berkeley
82 *> \author Univ. of Colorado Denver
85 *> \date November 2011
87 *> \ingroup single_lin
89 * =====================================================================
90 REAL FUNCTION SQRT12( M, N, A, LDA, S, WORK, LWORK )
92 * -- LAPACK test routine (version 3.4.0) --
93 * -- LAPACK is a software package provided by Univ. of Tennessee, --
94 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
97 * .. Scalar Arguments ..
98 INTEGER LDA, LWORK, M, N
100 * .. Array Arguments ..
101 REAL A( LDA, * ), S( * ), WORK( LWORK )
104 * =====================================================================
108 PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 )
110 * .. Local Scalars ..
111 INTEGER I, INFO, ISCL, J, MN
112 REAL ANRM, BIGNUM, NRMSVL, SMLNUM
114 * .. External Functions ..
115 REAL SASUM, SLAMCH, SLANGE, SNRM2
116 EXTERNAL SASUM, SLAMCH, SLANGE, SNRM2
118 * .. External Subroutines ..
119 EXTERNAL SAXPY, SBDSQR, SGEBD2, SLABAD, SLASCL, SLASET,
122 * .. Intrinsic Functions ..
123 INTRINSIC MAX, MIN, REAL
128 * .. Executable Statements ..
132 * Test that enough workspace is supplied
134 IF( LWORK.LT.MAX( M*N+4*MIN( M, N )+MAX( M, N ),
135 $ M*N+2*MIN( M, N )+4*N) ) THEN
136 CALL XERBLA( 'SQRT12', 7 )
140 * Quick return if possible
146 NRMSVL = SNRM2( MN, S, 1 )
148 * Copy upper triangle of A into work
150 CALL SLASET( 'Full', M, N, ZERO, ZERO, WORK, M )
152 DO 10 I = 1, MIN( J, M )
153 WORK( ( J-1 )*M+I ) = A( I, J )
157 * Get machine parameters
159 SMLNUM = SLAMCH( 'S' ) / SLAMCH( 'P' )
160 BIGNUM = ONE / SMLNUM
161 CALL SLABAD( SMLNUM, BIGNUM )
163 * Scale work if max entry outside range [SMLNUM,BIGNUM]
165 ANRM = SLANGE( 'M', M, N, WORK, M, DUMMY )
167 IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
169 * Scale matrix norm up to SMLNUM
171 CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, WORK, M, INFO )
173 ELSE IF( ANRM.GT.BIGNUM ) THEN
175 * Scale matrix norm down to BIGNUM
177 CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, WORK, M, INFO )
181 IF( ANRM.NE.ZERO ) THEN
183 * Compute SVD of work
185 CALL SGEBD2( M, N, WORK, M, WORK( M*N+1 ), WORK( M*N+MN+1 ),
186 $ WORK( M*N+2*MN+1 ), WORK( M*N+3*MN+1 ),
187 $ WORK( M*N+4*MN+1 ), INFO )
188 CALL SBDSQR( 'Upper', MN, 0, 0, 0, WORK( M*N+1 ),
189 $ WORK( M*N+MN+1 ), DUMMY, MN, DUMMY, 1, DUMMY, MN,
190 $ WORK( M*N+2*MN+1 ), INFO )
193 IF( ANRM.GT.BIGNUM ) THEN
194 CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MN, 1,
195 $ WORK( M*N+1 ), MN, INFO )
197 IF( ANRM.LT.SMLNUM ) THEN
198 CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MN, 1,
199 $ WORK( M*N+1 ), MN, INFO )
210 * Compare s and singular values of work
212 CALL SAXPY( MN, -ONE, S, 1, WORK( M*N+1 ), 1 )
213 SQRT12 = SASUM( MN, WORK( M*N+1 ), 1 ) /
214 $ ( SLAMCH( 'Epsilon' )*REAL( MAX( M, N ) ) )
216 $ SQRT12 = SQRT12 / NRMSVL