 LAPACK  3.10.0 LAPACK: Linear Algebra PACKage

◆ dort01()

 subroutine dort01 ( character ROWCOL, integer M, integer N, double precision, dimension( ldu, * ) U, integer LDU, double precision, dimension( * ) WORK, integer LWORK, double precision RESID )

DORT01

Purpose:
DORT01 checks that the matrix U is orthogonal by computing the ratio

RESID = norm( I - U*U' ) / ( n * EPS ), if ROWCOL = 'R',
or
RESID = norm( I - U'*U ) / ( m * EPS ), if ROWCOL = 'C'.

Alternatively, if there isn't sufficient workspace to form
I - U*U' or I - U'*U, the ratio is computed as

RESID = abs( I - U*U' ) / ( n * EPS ), if ROWCOL = 'R',
or
RESID = abs( I - U'*U ) / ( m * EPS ), if ROWCOL = 'C'.

where EPS is the machine precision.  ROWCOL is used only if m = n;
if m > n, ROWCOL is assumed to be 'C', and if m < n, ROWCOL is
assumed to be 'R'.
Parameters
 [in] ROWCOL ROWCOL is CHARACTER Specifies whether the rows or columns of U should be checked for orthogonality. Used only if M = N. = 'R': Check for orthogonal rows of U = 'C': Check for orthogonal columns of U [in] M M is INTEGER The number of rows of the matrix U. [in] N N is INTEGER The number of columns of the matrix U. [in] U U is DOUBLE PRECISION array, dimension (LDU,N) The orthogonal matrix U. U is checked for orthogonal columns if m > n or if m = n and ROWCOL = 'C'. U is checked for orthogonal rows if m < n or if m = n and ROWCOL = 'R'. [in] LDU LDU is INTEGER The leading dimension of the array U. LDU >= max(1,M). [out] WORK WORK is DOUBLE PRECISION array, dimension (LWORK) [in] LWORK LWORK is INTEGER The length of the array WORK. For best performance, LWORK should be at least N*(N+1) if ROWCOL = 'C' or M*(M+1) if ROWCOL = 'R', but the test will be done even if LWORK is 0. [out] RESID RESID is DOUBLE PRECISION RESID = norm( I - U * U' ) / ( n * EPS ), if ROWCOL = 'R', or RESID = norm( I - U' * U ) / ( m * EPS ), if ROWCOL = 'C'.

Definition at line 115 of file dort01.f.

116 *
117 * -- LAPACK test routine --
118 * -- LAPACK is a software package provided by Univ. of Tennessee, --
119 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
120 *
121 * .. Scalar Arguments ..
122  CHARACTER ROWCOL
123  INTEGER LDU, LWORK, M, N
124  DOUBLE PRECISION RESID
125 * ..
126 * .. Array Arguments ..
127  DOUBLE PRECISION U( LDU, * ), WORK( * )
128 * ..
129 *
130 * =====================================================================
131 *
132 * .. Parameters ..
133  DOUBLE PRECISION ZERO, ONE
134  parameter( zero = 0.0d+0, one = 1.0d+0 )
135 * ..
136 * .. Local Scalars ..
137  CHARACTER TRANSU
138  INTEGER I, J, K, LDWORK, MNMIN
139  DOUBLE PRECISION EPS, TMP
140 * ..
141 * .. External Functions ..
142  LOGICAL LSAME
143  DOUBLE PRECISION DDOT, DLAMCH, DLANSY
144  EXTERNAL lsame, ddot, dlamch, dlansy
145 * ..
146 * .. External Subroutines ..
147  EXTERNAL dlaset, dsyrk
148 * ..
149 * .. Intrinsic Functions ..
150  INTRINSIC abs, dble, max, min
151 * ..
152 * .. Executable Statements ..
153 *
154  resid = zero
155 *
156 * Quick return if possible
157 *
158  IF( m.LE.0 .OR. n.LE.0 )
159  \$ RETURN
160 *
161  eps = dlamch( 'Precision' )
162  IF( m.LT.n .OR. ( m.EQ.n .AND. lsame( rowcol, 'R' ) ) ) THEN
163  transu = 'N'
164  k = n
165  ELSE
166  transu = 'T'
167  k = m
168  END IF
169  mnmin = min( m, n )
170 *
171  IF( ( mnmin+1 )*mnmin.LE.lwork ) THEN
172  ldwork = mnmin
173  ELSE
174  ldwork = 0
175  END IF
176  IF( ldwork.GT.0 ) THEN
177 *
178 * Compute I - U*U' or I - U'*U.
179 *
180  CALL dlaset( 'Upper', mnmin, mnmin, zero, one, work, ldwork )
181  CALL dsyrk( 'Upper', transu, mnmin, k, -one, u, ldu, one, work,
182  \$ ldwork )
183 *
184 * Compute norm( I - U*U' ) / ( K * EPS ) .
185 *
186  resid = dlansy( '1', 'Upper', mnmin, work, ldwork,
187  \$ work( ldwork*mnmin+1 ) )
188  resid = ( resid / dble( k ) ) / eps
189  ELSE IF( transu.EQ.'T' ) THEN
190 *
191 * Find the maximum element in abs( I - U'*U ) / ( m * EPS )
192 *
193  DO 20 j = 1, n
194  DO 10 i = 1, j
195  IF( i.NE.j ) THEN
196  tmp = zero
197  ELSE
198  tmp = one
199  END IF
200  tmp = tmp - ddot( m, u( 1, i ), 1, u( 1, j ), 1 )
201  resid = max( resid, abs( tmp ) )
202  10 CONTINUE
203  20 CONTINUE
204  resid = ( resid / dble( m ) ) / eps
205  ELSE
206 *
207 * Find the maximum element in abs( I - U*U' ) / ( n * EPS )
208 *
209  DO 40 j = 1, m
210  DO 30 i = 1, j
211  IF( i.NE.j ) THEN
212  tmp = zero
213  ELSE
214  tmp = one
215  END IF
216  tmp = tmp - ddot( n, u( j, 1 ), ldu, u( i, 1 ), ldu )
217  resid = max( resid, abs( tmp ) )
218  30 CONTINUE
219  40 CONTINUE
220  resid = ( resid / dble( n ) ) / eps
221  END IF
222  RETURN
223 *
224 * End of DORT01
225 *
double precision function dlamch(CMACH)
DLAMCH
Definition: dlamch.f:69
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
Definition: dlaset.f:110
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:53
double precision function ddot(N, DX, INCX, DY, INCY)
DDOT
Definition: ddot.f:82
subroutine dsyrk(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
DSYRK
Definition: dsyrk.f:169
double precision function dlansy(NORM, UPLO, N, A, LDA, WORK)
DLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
Definition: dlansy.f:122
Here is the call graph for this function:
Here is the caller graph for this function: