001: DOUBLE PRECISION FUNCTION DLANHS( NORM, N, A, LDA, WORK ) 002: * 003: * -- LAPACK auxiliary routine (version 3.2) -- 004: * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. 005: * November 2006 006: * 007: * .. Scalar Arguments .. 008: CHARACTER NORM 009: INTEGER LDA, N 010: * .. 011: * .. Array Arguments .. 012: DOUBLE PRECISION A( LDA, * ), WORK( * ) 013: * .. 014: * 015: * Purpose 016: * ======= 017: * 018: * DLANHS returns the value of the one norm, or the Frobenius norm, or 019: * the infinity norm, or the element of largest absolute value of a 020: * Hessenberg matrix A. 021: * 022: * Description 023: * =========== 024: * 025: * DLANHS returns the value 026: * 027: * DLANHS = ( max(abs(A(i,j))), NORM = 'M' or 'm' 028: * ( 029: * ( norm1(A), NORM = '1', 'O' or 'o' 030: * ( 031: * ( normI(A), NORM = 'I' or 'i' 032: * ( 033: * ( normF(A), NORM = 'F', 'f', 'E' or 'e' 034: * 035: * where norm1 denotes the one norm of a matrix (maximum column sum), 036: * normI denotes the infinity norm of a matrix (maximum row sum) and 037: * normF denotes the Frobenius norm of a matrix (square root of sum of 038: * squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. 039: * 040: * Arguments 041: * ========= 042: * 043: * NORM (input) CHARACTER*1 044: * Specifies the value to be returned in DLANHS as described 045: * above. 046: * 047: * N (input) INTEGER 048: * The order of the matrix A. N >= 0. When N = 0, DLANHS is 049: * set to zero. 050: * 051: * A (input) DOUBLE PRECISION array, dimension (LDA,N) 052: * The n by n upper Hessenberg matrix A; the part of A below the 053: * first sub-diagonal is not referenced. 054: * 055: * LDA (input) INTEGER 056: * The leading dimension of the array A. LDA >= max(N,1). 057: * 058: * WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), 059: * where LWORK >= N when NORM = 'I'; otherwise, WORK is not 060: * referenced. 061: * 062: * ===================================================================== 063: * 064: * .. Parameters .. 065: DOUBLE PRECISION ONE, ZERO 066: PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) 067: * .. 068: * .. Local Scalars .. 069: INTEGER I, J 070: DOUBLE PRECISION SCALE, SUM, VALUE 071: * .. 072: * .. External Subroutines .. 073: EXTERNAL DLASSQ 074: * .. 075: * .. External Functions .. 076: LOGICAL LSAME 077: EXTERNAL LSAME 078: * .. 079: * .. Intrinsic Functions .. 080: INTRINSIC ABS, MAX, MIN, SQRT 081: * .. 082: * .. Executable Statements .. 083: * 084: IF( N.EQ.0 ) THEN 085: VALUE = ZERO 086: ELSE IF( LSAME( NORM, 'M' ) ) THEN 087: * 088: * Find max(abs(A(i,j))). 089: * 090: VALUE = ZERO 091: DO 20 J = 1, N 092: DO 10 I = 1, MIN( N, J+1 ) 093: VALUE = MAX( VALUE, ABS( A( I, J ) ) ) 094: 10 CONTINUE 095: 20 CONTINUE 096: ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN 097: * 098: * Find norm1(A). 099: * 100: VALUE = ZERO 101: DO 40 J = 1, N 102: SUM = ZERO 103: DO 30 I = 1, MIN( N, J+1 ) 104: SUM = SUM + ABS( A( I, J ) ) 105: 30 CONTINUE 106: VALUE = MAX( VALUE, SUM ) 107: 40 CONTINUE 108: ELSE IF( LSAME( NORM, 'I' ) ) THEN 109: * 110: * Find normI(A). 111: * 112: DO 50 I = 1, N 113: WORK( I ) = ZERO 114: 50 CONTINUE 115: DO 70 J = 1, N 116: DO 60 I = 1, MIN( N, J+1 ) 117: WORK( I ) = WORK( I ) + ABS( A( I, J ) ) 118: 60 CONTINUE 119: 70 CONTINUE 120: VALUE = ZERO 121: DO 80 I = 1, N 122: VALUE = MAX( VALUE, WORK( I ) ) 123: 80 CONTINUE 124: ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN 125: * 126: * Find normF(A). 127: * 128: SCALE = ZERO 129: SUM = ONE 130: DO 90 J = 1, N 131: CALL DLASSQ( MIN( N, J+1 ), A( 1, J ), 1, SCALE, SUM ) 132: 90 CONTINUE 133: VALUE = SCALE*SQRT( SUM ) 134: END IF 135: * 136: DLANHS = VALUE 137: RETURN 138: * 139: * End of DLANHS 140: * 141: END 142: