139 DOUBLE PRECISION FUNCTION dlantr( NORM, UPLO, DIAG, M, N, A, LDA,
148 CHARACTER diag, norm, uplo
152 DOUBLE PRECISION a( lda, * ), work( * )
158 DOUBLE PRECISION one, zero
159 parameter( one = 1.0d+0, zero = 0.0d+0 )
164 DOUBLE PRECISION sum, value
167 DOUBLE PRECISION ssq( 2 ), colssq( 2 )
177 INTRINSIC abs, min, sqrt
181 IF( min( m, n ).EQ.0 )
THEN
183 ELSE IF(
lsame( norm,
'M' ) )
THEN
187 IF(
lsame( diag,
'U' ) )
THEN
189 IF(
lsame( uplo,
'U' ) )
THEN
191 DO 10 i = 1, min( m, j-1 )
192 sum = abs( a( i, j ) )
193 IF(
VALUE .LT. sum .OR.
disnan( sum ) )
VALUE = sum
199 sum = abs( a( i, j ) )
200 IF(
VALUE .LT. sum .OR.
disnan( sum ) )
VALUE = sum
206 IF(
lsame( uplo,
'U' ) )
THEN
208 DO 50 i = 1, min( m, j )
209 sum = abs( a( i, j ) )
210 IF(
VALUE .LT. sum .OR.
disnan( sum ) )
VALUE = sum
216 sum = abs( a( i, j ) )
217 IF(
VALUE .LT. sum .OR.
disnan( sum ) )
VALUE = sum
222 ELSE IF( (
lsame( norm,
'O' ) ) .OR. ( norm.EQ.
'1' ) )
THEN
227 udiag =
lsame( diag,
'U' )
228 IF(
lsame( uplo,
'U' ) )
THEN
230 IF( ( udiag ) .AND. ( j.LE.m ) )
THEN
233 sum = sum + abs( a( i, j ) )
237 DO 100 i = 1, min( m, j )
238 sum = sum + abs( a( i, j ) )
241 IF(
VALUE .LT. sum .OR.
disnan( sum ) )
VALUE = sum
248 sum = sum + abs( a( i, j ) )
253 sum = sum + abs( a( i, j ) )
256 IF(
VALUE .LT. sum .OR.
disnan( sum ) )
VALUE = sum
259 ELSE IF(
lsame( norm,
'I' ) )
THEN
263 IF(
lsame( uplo,
'U' ) )
THEN
264 IF(
lsame( diag,
'U' ) )
THEN
269 DO 160 i = 1, min( m, j-1 )
270 work( i ) = work( i ) + abs( a( i, j ) )
278 DO 190 i = 1, min( m, j )
279 work( i ) = work( i ) + abs( a( i, j ) )
284 IF(
lsame( diag,
'U' ) )
THEN
285 DO 210 i = 1, min( m, n )
293 work( i ) = work( i ) + abs( a( i, j ) )
302 work( i ) = work( i ) + abs( a( i, j ) )
310 IF(
VALUE .LT. sum .OR.
disnan( sum ) )
VALUE = sum
312 ELSE IF( (
lsame( norm,
'F' ) ) .OR. (
lsame( norm,
'E' ) ) )
THEN
319 IF(
lsame( uplo,
'U' ) )
THEN
320 IF(
lsame( diag,
'U' ) )
THEN
322 ssq( 2 ) = min( m, n )
326 CALL dlassq( min( m, j-1 ), a( 1, j ), 1,
327 $ colssq( 1 ), colssq( 2 ) )
336 CALL dlassq( min( m, j ), a( 1, j ), 1,
337 $ colssq( 1 ), colssq( 2 ) )
342 IF(
lsame( diag,
'U' ) )
THEN
344 ssq( 2 ) = min( m, n )
348 CALL dlassq( m-j, a( min( m, j+1 ), j ), 1,
349 $ colssq( 1 ), colssq( 2 ) )
358 CALL dlassq( m-j+1, a( j, j ), 1,
359 $ colssq( 1 ), colssq( 2 ) )
364 VALUE = ssq( 1 )*sqrt( ssq( 2 ) )
logical function disnan(DIN)
DISNAN tests input for NaN.
subroutine dlassq(n, x, incx, scl, sumsq)
DLASSQ updates a sum of squares represented in scaled form.
subroutine dcombssq(V1, V2)
DCOMBSSQ adds two scaled sum of squares quantities.
logical function lsame(CA, CB)
LSAME
double precision function dlantr(NORM, UPLO, DIAG, M, N, A, LDA, WORK)
DLANTR returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...