Annotation of rpl/lapack/lapack/dlansf.f, revision 1.1
1.1 ! bertrand 1: DOUBLE PRECISION FUNCTION DLANSF( NORM, TRANSR, UPLO, N, A, WORK )
! 2: *
! 3: * -- LAPACK routine (version 3.2.2) --
! 4: *
! 5: * -- Contributed by Fred Gustavson of the IBM Watson Research Center --
! 6: * -- June 2010 --
! 7: *
! 8: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 9: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 10: *
! 11: * .. Scalar Arguments ..
! 12: CHARACTER NORM, TRANSR, UPLO
! 13: INTEGER N
! 14: * ..
! 15: * .. Array Arguments ..
! 16: DOUBLE PRECISION A( 0: * ), WORK( 0: * )
! 17: * ..
! 18: *
! 19: * Purpose
! 20: * =======
! 21: *
! 22: * DLANSF returns the value of the one norm, or the Frobenius norm, or
! 23: * the infinity norm, or the element of largest absolute value of a
! 24: * real symmetric matrix A in RFP format.
! 25: *
! 26: * Description
! 27: * ===========
! 28: *
! 29: * DLANSF returns the value
! 30: *
! 31: * DLANSF = ( max(abs(A(i,j))), NORM = 'M' or 'm'
! 32: * (
! 33: * ( norm1(A), NORM = '1', 'O' or 'o'
! 34: * (
! 35: * ( normI(A), NORM = 'I' or 'i'
! 36: * (
! 37: * ( normF(A), NORM = 'F', 'f', 'E' or 'e'
! 38: *
! 39: * where norm1 denotes the one norm of a matrix (maximum column sum),
! 40: * normI denotes the infinity norm of a matrix (maximum row sum) and
! 41: * normF denotes the Frobenius norm of a matrix (square root of sum of
! 42: * squares). Note that max(abs(A(i,j))) is not a matrix norm.
! 43: *
! 44: * Arguments
! 45: * =========
! 46: *
! 47: * NORM (input) CHARACTER
! 48: * Specifies the value to be returned in DLANSF as described
! 49: * above.
! 50: *
! 51: * TRANSR (input) CHARACTER
! 52: * Specifies whether the RFP format of A is normal or
! 53: * transposed format.
! 54: * = 'N': RFP format is Normal;
! 55: * = 'T': RFP format is Transpose.
! 56: *
! 57: * UPLO (input) CHARACTER
! 58: * On entry, UPLO specifies whether the RFP matrix A came from
! 59: * an upper or lower triangular matrix as follows:
! 60: * = 'U': RFP A came from an upper triangular matrix;
! 61: * = 'L': RFP A came from a lower triangular matrix.
! 62: *
! 63: * N (input) INTEGER
! 64: * The order of the matrix A. N >= 0. When N = 0, DLANSF is
! 65: * set to zero.
! 66: *
! 67: * A (input) DOUBLE PRECISION array, dimension ( N*(N+1)/2 );
! 68: * On entry, the upper (if UPLO = 'U') or lower (if UPLO = 'L')
! 69: * part of the symmetric matrix A stored in RFP format. See the
! 70: * "Notes" below for more details.
! 71: * Unchanged on exit.
! 72: *
! 73: * WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
! 74: * where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
! 75: * WORK is not referenced.
! 76: *
! 77: * Further Details
! 78: * ===============
! 79: *
! 80: * We first consider Rectangular Full Packed (RFP) Format when N is
! 81: * even. We give an example where N = 6.
! 82: *
! 83: * AP is Upper AP is Lower
! 84: *
! 85: * 00 01 02 03 04 05 00
! 86: * 11 12 13 14 15 10 11
! 87: * 22 23 24 25 20 21 22
! 88: * 33 34 35 30 31 32 33
! 89: * 44 45 40 41 42 43 44
! 90: * 55 50 51 52 53 54 55
! 91: *
! 92: *
! 93: * Let TRANSR = 'N'. RFP holds AP as follows:
! 94: * For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
! 95: * three columns of AP upper. The lower triangle A(4:6,0:2) consists of
! 96: * the transpose of the first three columns of AP upper.
! 97: * For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
! 98: * three columns of AP lower. The upper triangle A(0:2,0:2) consists of
! 99: * the transpose of the last three columns of AP lower.
! 100: * This covers the case N even and TRANSR = 'N'.
! 101: *
! 102: * RFP A RFP A
! 103: *
! 104: * 03 04 05 33 43 53
! 105: * 13 14 15 00 44 54
! 106: * 23 24 25 10 11 55
! 107: * 33 34 35 20 21 22
! 108: * 00 44 45 30 31 32
! 109: * 01 11 55 40 41 42
! 110: * 02 12 22 50 51 52
! 111: *
! 112: * Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
! 113: * transpose of RFP A above. One therefore gets:
! 114: *
! 115: *
! 116: * RFP A RFP A
! 117: *
! 118: * 03 13 23 33 00 01 02 33 00 10 20 30 40 50
! 119: * 04 14 24 34 44 11 12 43 44 11 21 31 41 51
! 120: * 05 15 25 35 45 55 22 53 54 55 22 32 42 52
! 121: *
! 122: *
! 123: * We then consider Rectangular Full Packed (RFP) Format when N is
! 124: * odd. We give an example where N = 5.
! 125: *
! 126: * AP is Upper AP is Lower
! 127: *
! 128: * 00 01 02 03 04 00
! 129: * 11 12 13 14 10 11
! 130: * 22 23 24 20 21 22
! 131: * 33 34 30 31 32 33
! 132: * 44 40 41 42 43 44
! 133: *
! 134: *
! 135: * Let TRANSR = 'N'. RFP holds AP as follows:
! 136: * For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
! 137: * three columns of AP upper. The lower triangle A(3:4,0:1) consists of
! 138: * the transpose of the first two columns of AP upper.
! 139: * For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
! 140: * three columns of AP lower. The upper triangle A(0:1,1:2) consists of
! 141: * the transpose of the last two columns of AP lower.
! 142: * This covers the case N odd and TRANSR = 'N'.
! 143: *
! 144: * RFP A RFP A
! 145: *
! 146: * 02 03 04 00 33 43
! 147: * 12 13 14 10 11 44
! 148: * 22 23 24 20 21 22
! 149: * 00 33 34 30 31 32
! 150: * 01 11 44 40 41 42
! 151: *
! 152: * Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
! 153: * transpose of RFP A above. One therefore gets:
! 154: *
! 155: * RFP A RFP A
! 156: *
! 157: * 02 12 22 00 01 00 10 20 30 40 50
! 158: * 03 13 23 33 11 33 11 21 31 41 51
! 159: * 04 14 24 34 44 43 44 22 32 42 52
! 160: *
! 161: * Reference
! 162: * =========
! 163: *
! 164: * =====================================================================
! 165: *
! 166: * .. Parameters ..
! 167: DOUBLE PRECISION ONE, ZERO
! 168: PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
! 169: * ..
! 170: * .. Local Scalars ..
! 171: INTEGER I, J, IFM, ILU, NOE, N1, K, L, LDA
! 172: DOUBLE PRECISION SCALE, S, VALUE, AA
! 173: * ..
! 174: * .. External Functions ..
! 175: LOGICAL LSAME
! 176: INTEGER IDAMAX
! 177: EXTERNAL LSAME, IDAMAX
! 178: * ..
! 179: * .. External Subroutines ..
! 180: EXTERNAL DLASSQ
! 181: * ..
! 182: * .. Intrinsic Functions ..
! 183: INTRINSIC ABS, MAX, SQRT
! 184: * ..
! 185: * .. Executable Statements ..
! 186: *
! 187: IF( N.EQ.0 ) THEN
! 188: DLANSF = ZERO
! 189: RETURN
! 190: END IF
! 191: *
! 192: * set noe = 1 if n is odd. if n is even set noe=0
! 193: *
! 194: NOE = 1
! 195: IF( MOD( N, 2 ).EQ.0 )
! 196: + NOE = 0
! 197: *
! 198: * set ifm = 0 when form='T or 't' and 1 otherwise
! 199: *
! 200: IFM = 1
! 201: IF( LSAME( TRANSR, 'T' ) )
! 202: + IFM = 0
! 203: *
! 204: * set ilu = 0 when uplo='U or 'u' and 1 otherwise
! 205: *
! 206: ILU = 1
! 207: IF( LSAME( UPLO, 'U' ) )
! 208: + ILU = 0
! 209: *
! 210: * set lda = (n+1)/2 when ifm = 0
! 211: * set lda = n when ifm = 1 and noe = 1
! 212: * set lda = n+1 when ifm = 1 and noe = 0
! 213: *
! 214: IF( IFM.EQ.1 ) THEN
! 215: IF( NOE.EQ.1 ) THEN
! 216: LDA = N
! 217: ELSE
! 218: * noe=0
! 219: LDA = N + 1
! 220: END IF
! 221: ELSE
! 222: * ifm=0
! 223: LDA = ( N+1 ) / 2
! 224: END IF
! 225: *
! 226: IF( LSAME( NORM, 'M' ) ) THEN
! 227: *
! 228: * Find max(abs(A(i,j))).
! 229: *
! 230: K = ( N+1 ) / 2
! 231: VALUE = ZERO
! 232: IF( NOE.EQ.1 ) THEN
! 233: * n is odd
! 234: IF( IFM.EQ.1 ) THEN
! 235: * A is n by k
! 236: DO J = 0, K - 1
! 237: DO I = 0, N - 1
! 238: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
! 239: END DO
! 240: END DO
! 241: ELSE
! 242: * xpose case; A is k by n
! 243: DO J = 0, N - 1
! 244: DO I = 0, K - 1
! 245: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
! 246: END DO
! 247: END DO
! 248: END IF
! 249: ELSE
! 250: * n is even
! 251: IF( IFM.EQ.1 ) THEN
! 252: * A is n+1 by k
! 253: DO J = 0, K - 1
! 254: DO I = 0, N
! 255: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
! 256: END DO
! 257: END DO
! 258: ELSE
! 259: * xpose case; A is k by n+1
! 260: DO J = 0, N
! 261: DO I = 0, K - 1
! 262: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
! 263: END DO
! 264: END DO
! 265: END IF
! 266: END IF
! 267: ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
! 268: + ( NORM.EQ.'1' ) ) THEN
! 269: *
! 270: * Find normI(A) ( = norm1(A), since A is symmetric).
! 271: *
! 272: IF( IFM.EQ.1 ) THEN
! 273: K = N / 2
! 274: IF( NOE.EQ.1 ) THEN
! 275: * n is odd
! 276: IF( ILU.EQ.0 ) THEN
! 277: DO I = 0, K - 1
! 278: WORK( I ) = ZERO
! 279: END DO
! 280: DO J = 0, K
! 281: S = ZERO
! 282: DO I = 0, K + J - 1
! 283: AA = ABS( A( I+J*LDA ) )
! 284: * -> A(i,j+k)
! 285: S = S + AA
! 286: WORK( I ) = WORK( I ) + AA
! 287: END DO
! 288: AA = ABS( A( I+J*LDA ) )
! 289: * -> A(j+k,j+k)
! 290: WORK( J+K ) = S + AA
! 291: IF( I.EQ.K+K )
! 292: + GO TO 10
! 293: I = I + 1
! 294: AA = ABS( A( I+J*LDA ) )
! 295: * -> A(j,j)
! 296: WORK( J ) = WORK( J ) + AA
! 297: S = ZERO
! 298: DO L = J + 1, K - 1
! 299: I = I + 1
! 300: AA = ABS( A( I+J*LDA ) )
! 301: * -> A(l,j)
! 302: S = S + AA
! 303: WORK( L ) = WORK( L ) + AA
! 304: END DO
! 305: WORK( J ) = WORK( J ) + S
! 306: END DO
! 307: 10 CONTINUE
! 308: I = IDAMAX( N, WORK, 1 )
! 309: VALUE = WORK( I-1 )
! 310: ELSE
! 311: * ilu = 1
! 312: K = K + 1
! 313: * k=(n+1)/2 for n odd and ilu=1
! 314: DO I = K, N - 1
! 315: WORK( I ) = ZERO
! 316: END DO
! 317: DO J = K - 1, 0, -1
! 318: S = ZERO
! 319: DO I = 0, J - 2
! 320: AA = ABS( A( I+J*LDA ) )
! 321: * -> A(j+k,i+k)
! 322: S = S + AA
! 323: WORK( I+K ) = WORK( I+K ) + AA
! 324: END DO
! 325: IF( J.GT.0 ) THEN
! 326: AA = ABS( A( I+J*LDA ) )
! 327: * -> A(j+k,j+k)
! 328: S = S + AA
! 329: WORK( I+K ) = WORK( I+K ) + S
! 330: * i=j
! 331: I = I + 1
! 332: END IF
! 333: AA = ABS( A( I+J*LDA ) )
! 334: * -> A(j,j)
! 335: WORK( J ) = AA
! 336: S = ZERO
! 337: DO L = J + 1, N - 1
! 338: I = I + 1
! 339: AA = ABS( A( I+J*LDA ) )
! 340: * -> A(l,j)
! 341: S = S + AA
! 342: WORK( L ) = WORK( L ) + AA
! 343: END DO
! 344: WORK( J ) = WORK( J ) + S
! 345: END DO
! 346: I = IDAMAX( N, WORK, 1 )
! 347: VALUE = WORK( I-1 )
! 348: END IF
! 349: ELSE
! 350: * n is even
! 351: IF( ILU.EQ.0 ) THEN
! 352: DO I = 0, K - 1
! 353: WORK( I ) = ZERO
! 354: END DO
! 355: DO J = 0, K - 1
! 356: S = ZERO
! 357: DO I = 0, K + J - 1
! 358: AA = ABS( A( I+J*LDA ) )
! 359: * -> A(i,j+k)
! 360: S = S + AA
! 361: WORK( I ) = WORK( I ) + AA
! 362: END DO
! 363: AA = ABS( A( I+J*LDA ) )
! 364: * -> A(j+k,j+k)
! 365: WORK( J+K ) = S + AA
! 366: I = I + 1
! 367: AA = ABS( A( I+J*LDA ) )
! 368: * -> A(j,j)
! 369: WORK( J ) = WORK( J ) + AA
! 370: S = ZERO
! 371: DO L = J + 1, K - 1
! 372: I = I + 1
! 373: AA = ABS( A( I+J*LDA ) )
! 374: * -> A(l,j)
! 375: S = S + AA
! 376: WORK( L ) = WORK( L ) + AA
! 377: END DO
! 378: WORK( J ) = WORK( J ) + S
! 379: END DO
! 380: I = IDAMAX( N, WORK, 1 )
! 381: VALUE = WORK( I-1 )
! 382: ELSE
! 383: * ilu = 1
! 384: DO I = K, N - 1
! 385: WORK( I ) = ZERO
! 386: END DO
! 387: DO J = K - 1, 0, -1
! 388: S = ZERO
! 389: DO I = 0, J - 1
! 390: AA = ABS( A( I+J*LDA ) )
! 391: * -> A(j+k,i+k)
! 392: S = S + AA
! 393: WORK( I+K ) = WORK( I+K ) + AA
! 394: END DO
! 395: AA = ABS( A( I+J*LDA ) )
! 396: * -> A(j+k,j+k)
! 397: S = S + AA
! 398: WORK( I+K ) = WORK( I+K ) + S
! 399: * i=j
! 400: I = I + 1
! 401: AA = ABS( A( I+J*LDA ) )
! 402: * -> A(j,j)
! 403: WORK( J ) = AA
! 404: S = ZERO
! 405: DO L = J + 1, N - 1
! 406: I = I + 1
! 407: AA = ABS( A( I+J*LDA ) )
! 408: * -> A(l,j)
! 409: S = S + AA
! 410: WORK( L ) = WORK( L ) + AA
! 411: END DO
! 412: WORK( J ) = WORK( J ) + S
! 413: END DO
! 414: I = IDAMAX( N, WORK, 1 )
! 415: VALUE = WORK( I-1 )
! 416: END IF
! 417: END IF
! 418: ELSE
! 419: * ifm=0
! 420: K = N / 2
! 421: IF( NOE.EQ.1 ) THEN
! 422: * n is odd
! 423: IF( ILU.EQ.0 ) THEN
! 424: N1 = K
! 425: * n/2
! 426: K = K + 1
! 427: * k is the row size and lda
! 428: DO I = N1, N - 1
! 429: WORK( I ) = ZERO
! 430: END DO
! 431: DO J = 0, N1 - 1
! 432: S = ZERO
! 433: DO I = 0, K - 1
! 434: AA = ABS( A( I+J*LDA ) )
! 435: * A(j,n1+i)
! 436: WORK( I+N1 ) = WORK( I+N1 ) + AA
! 437: S = S + AA
! 438: END DO
! 439: WORK( J ) = S
! 440: END DO
! 441: * j=n1=k-1 is special
! 442: S = ABS( A( 0+J*LDA ) )
! 443: * A(k-1,k-1)
! 444: DO I = 1, K - 1
! 445: AA = ABS( A( I+J*LDA ) )
! 446: * A(k-1,i+n1)
! 447: WORK( I+N1 ) = WORK( I+N1 ) + AA
! 448: S = S + AA
! 449: END DO
! 450: WORK( J ) = WORK( J ) + S
! 451: DO J = K, N - 1
! 452: S = ZERO
! 453: DO I = 0, J - K - 1
! 454: AA = ABS( A( I+J*LDA ) )
! 455: * A(i,j-k)
! 456: WORK( I ) = WORK( I ) + AA
! 457: S = S + AA
! 458: END DO
! 459: * i=j-k
! 460: AA = ABS( A( I+J*LDA ) )
! 461: * A(j-k,j-k)
! 462: S = S + AA
! 463: WORK( J-K ) = WORK( J-K ) + S
! 464: I = I + 1
! 465: S = ABS( A( I+J*LDA ) )
! 466: * A(j,j)
! 467: DO L = J + 1, N - 1
! 468: I = I + 1
! 469: AA = ABS( A( I+J*LDA ) )
! 470: * A(j,l)
! 471: WORK( L ) = WORK( L ) + AA
! 472: S = S + AA
! 473: END DO
! 474: WORK( J ) = WORK( J ) + S
! 475: END DO
! 476: I = IDAMAX( N, WORK, 1 )
! 477: VALUE = WORK( I-1 )
! 478: ELSE
! 479: * ilu=1
! 480: K = K + 1
! 481: * k=(n+1)/2 for n odd and ilu=1
! 482: DO I = K, N - 1
! 483: WORK( I ) = ZERO
! 484: END DO
! 485: DO J = 0, K - 2
! 486: * process
! 487: S = ZERO
! 488: DO I = 0, J - 1
! 489: AA = ABS( A( I+J*LDA ) )
! 490: * A(j,i)
! 491: WORK( I ) = WORK( I ) + AA
! 492: S = S + AA
! 493: END DO
! 494: AA = ABS( A( I+J*LDA ) )
! 495: * i=j so process of A(j,j)
! 496: S = S + AA
! 497: WORK( J ) = S
! 498: * is initialised here
! 499: I = I + 1
! 500: * i=j process A(j+k,j+k)
! 501: AA = ABS( A( I+J*LDA ) )
! 502: S = AA
! 503: DO L = K + J + 1, N - 1
! 504: I = I + 1
! 505: AA = ABS( A( I+J*LDA ) )
! 506: * A(l,k+j)
! 507: S = S + AA
! 508: WORK( L ) = WORK( L ) + AA
! 509: END DO
! 510: WORK( K+J ) = WORK( K+J ) + S
! 511: END DO
! 512: * j=k-1 is special :process col A(k-1,0:k-1)
! 513: S = ZERO
! 514: DO I = 0, K - 2
! 515: AA = ABS( A( I+J*LDA ) )
! 516: * A(k,i)
! 517: WORK( I ) = WORK( I ) + AA
! 518: S = S + AA
! 519: END DO
! 520: * i=k-1
! 521: AA = ABS( A( I+J*LDA ) )
! 522: * A(k-1,k-1)
! 523: S = S + AA
! 524: WORK( I ) = S
! 525: * done with col j=k+1
! 526: DO J = K, N - 1
! 527: * process col j of A = A(j,0:k-1)
! 528: S = ZERO
! 529: DO I = 0, K - 1
! 530: AA = ABS( A( I+J*LDA ) )
! 531: * A(j,i)
! 532: WORK( I ) = WORK( I ) + AA
! 533: S = S + AA
! 534: END DO
! 535: WORK( J ) = WORK( J ) + S
! 536: END DO
! 537: I = IDAMAX( N, WORK, 1 )
! 538: VALUE = WORK( I-1 )
! 539: END IF
! 540: ELSE
! 541: * n is even
! 542: IF( ILU.EQ.0 ) THEN
! 543: DO I = K, N - 1
! 544: WORK( I ) = ZERO
! 545: END DO
! 546: DO J = 0, K - 1
! 547: S = ZERO
! 548: DO I = 0, K - 1
! 549: AA = ABS( A( I+J*LDA ) )
! 550: * A(j,i+k)
! 551: WORK( I+K ) = WORK( I+K ) + AA
! 552: S = S + AA
! 553: END DO
! 554: WORK( J ) = S
! 555: END DO
! 556: * j=k
! 557: AA = ABS( A( 0+J*LDA ) )
! 558: * A(k,k)
! 559: S = AA
! 560: DO I = 1, K - 1
! 561: AA = ABS( A( I+J*LDA ) )
! 562: * A(k,k+i)
! 563: WORK( I+K ) = WORK( I+K ) + AA
! 564: S = S + AA
! 565: END DO
! 566: WORK( J ) = WORK( J ) + S
! 567: DO J = K + 1, N - 1
! 568: S = ZERO
! 569: DO I = 0, J - 2 - K
! 570: AA = ABS( A( I+J*LDA ) )
! 571: * A(i,j-k-1)
! 572: WORK( I ) = WORK( I ) + AA
! 573: S = S + AA
! 574: END DO
! 575: * i=j-1-k
! 576: AA = ABS( A( I+J*LDA ) )
! 577: * A(j-k-1,j-k-1)
! 578: S = S + AA
! 579: WORK( J-K-1 ) = WORK( J-K-1 ) + S
! 580: I = I + 1
! 581: AA = ABS( A( I+J*LDA ) )
! 582: * A(j,j)
! 583: S = AA
! 584: DO L = J + 1, N - 1
! 585: I = I + 1
! 586: AA = ABS( A( I+J*LDA ) )
! 587: * A(j,l)
! 588: WORK( L ) = WORK( L ) + AA
! 589: S = S + AA
! 590: END DO
! 591: WORK( J ) = WORK( J ) + S
! 592: END DO
! 593: * j=n
! 594: S = ZERO
! 595: DO I = 0, K - 2
! 596: AA = ABS( A( I+J*LDA ) )
! 597: * A(i,k-1)
! 598: WORK( I ) = WORK( I ) + AA
! 599: S = S + AA
! 600: END DO
! 601: * i=k-1
! 602: AA = ABS( A( I+J*LDA ) )
! 603: * A(k-1,k-1)
! 604: S = S + AA
! 605: WORK( I ) = WORK( I ) + S
! 606: I = IDAMAX( N, WORK, 1 )
! 607: VALUE = WORK( I-1 )
! 608: ELSE
! 609: * ilu=1
! 610: DO I = K, N - 1
! 611: WORK( I ) = ZERO
! 612: END DO
! 613: * j=0 is special :process col A(k:n-1,k)
! 614: S = ABS( A( 0 ) )
! 615: * A(k,k)
! 616: DO I = 1, K - 1
! 617: AA = ABS( A( I ) )
! 618: * A(k+i,k)
! 619: WORK( I+K ) = WORK( I+K ) + AA
! 620: S = S + AA
! 621: END DO
! 622: WORK( K ) = WORK( K ) + S
! 623: DO J = 1, K - 1
! 624: * process
! 625: S = ZERO
! 626: DO I = 0, J - 2
! 627: AA = ABS( A( I+J*LDA ) )
! 628: * A(j-1,i)
! 629: WORK( I ) = WORK( I ) + AA
! 630: S = S + AA
! 631: END DO
! 632: AA = ABS( A( I+J*LDA ) )
! 633: * i=j-1 so process of A(j-1,j-1)
! 634: S = S + AA
! 635: WORK( J-1 ) = S
! 636: * is initialised here
! 637: I = I + 1
! 638: * i=j process A(j+k,j+k)
! 639: AA = ABS( A( I+J*LDA ) )
! 640: S = AA
! 641: DO L = K + J + 1, N - 1
! 642: I = I + 1
! 643: AA = ABS( A( I+J*LDA ) )
! 644: * A(l,k+j)
! 645: S = S + AA
! 646: WORK( L ) = WORK( L ) + AA
! 647: END DO
! 648: WORK( K+J ) = WORK( K+J ) + S
! 649: END DO
! 650: * j=k is special :process col A(k,0:k-1)
! 651: S = ZERO
! 652: DO I = 0, K - 2
! 653: AA = ABS( A( I+J*LDA ) )
! 654: * A(k,i)
! 655: WORK( I ) = WORK( I ) + AA
! 656: S = S + AA
! 657: END DO
! 658: * i=k-1
! 659: AA = ABS( A( I+J*LDA ) )
! 660: * A(k-1,k-1)
! 661: S = S + AA
! 662: WORK( I ) = S
! 663: * done with col j=k+1
! 664: DO J = K + 1, N
! 665: * process col j-1 of A = A(j-1,0:k-1)
! 666: S = ZERO
! 667: DO I = 0, K - 1
! 668: AA = ABS( A( I+J*LDA ) )
! 669: * A(j-1,i)
! 670: WORK( I ) = WORK( I ) + AA
! 671: S = S + AA
! 672: END DO
! 673: WORK( J-1 ) = WORK( J-1 ) + S
! 674: END DO
! 675: I = IDAMAX( N, WORK, 1 )
! 676: VALUE = WORK( I-1 )
! 677: END IF
! 678: END IF
! 679: END IF
! 680: ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
! 681: *
! 682: * Find normF(A).
! 683: *
! 684: K = ( N+1 ) / 2
! 685: SCALE = ZERO
! 686: S = ONE
! 687: IF( NOE.EQ.1 ) THEN
! 688: * n is odd
! 689: IF( IFM.EQ.1 ) THEN
! 690: * A is normal
! 691: IF( ILU.EQ.0 ) THEN
! 692: * A is upper
! 693: DO J = 0, K - 3
! 694: CALL DLASSQ( K-J-2, A( K+J+1+J*LDA ), 1, SCALE, S )
! 695: * L at A(k,0)
! 696: END DO
! 697: DO J = 0, K - 1
! 698: CALL DLASSQ( K+J-1, A( 0+J*LDA ), 1, SCALE, S )
! 699: * trap U at A(0,0)
! 700: END DO
! 701: S = S + S
! 702: * double s for the off diagonal elements
! 703: CALL DLASSQ( K-1, A( K ), LDA+1, SCALE, S )
! 704: * tri L at A(k,0)
! 705: CALL DLASSQ( K, A( K-1 ), LDA+1, SCALE, S )
! 706: * tri U at A(k-1,0)
! 707: ELSE
! 708: * ilu=1 & A is lower
! 709: DO J = 0, K - 1
! 710: CALL DLASSQ( N-J-1, A( J+1+J*LDA ), 1, SCALE, S )
! 711: * trap L at A(0,0)
! 712: END DO
! 713: DO J = 0, K - 2
! 714: CALL DLASSQ( J, A( 0+( 1+J )*LDA ), 1, SCALE, S )
! 715: * U at A(0,1)
! 716: END DO
! 717: S = S + S
! 718: * double s for the off diagonal elements
! 719: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
! 720: * tri L at A(0,0)
! 721: CALL DLASSQ( K-1, A( 0+LDA ), LDA+1, SCALE, S )
! 722: * tri U at A(0,1)
! 723: END IF
! 724: ELSE
! 725: * A is xpose
! 726: IF( ILU.EQ.0 ) THEN
! 727: * A' is upper
! 728: DO J = 1, K - 2
! 729: CALL DLASSQ( J, A( 0+( K+J )*LDA ), 1, SCALE, S )
! 730: * U at A(0,k)
! 731: END DO
! 732: DO J = 0, K - 2
! 733: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
! 734: * k by k-1 rect. at A(0,0)
! 735: END DO
! 736: DO J = 0, K - 2
! 737: CALL DLASSQ( K-J-1, A( J+1+( J+K-1 )*LDA ), 1,
! 738: + SCALE, S )
! 739: * L at A(0,k-1)
! 740: END DO
! 741: S = S + S
! 742: * double s for the off diagonal elements
! 743: CALL DLASSQ( K-1, A( 0+K*LDA ), LDA+1, SCALE, S )
! 744: * tri U at A(0,k)
! 745: CALL DLASSQ( K, A( 0+( K-1 )*LDA ), LDA+1, SCALE, S )
! 746: * tri L at A(0,k-1)
! 747: ELSE
! 748: * A' is lower
! 749: DO J = 1, K - 1
! 750: CALL DLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
! 751: * U at A(0,0)
! 752: END DO
! 753: DO J = K, N - 1
! 754: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
! 755: * k by k-1 rect. at A(0,k)
! 756: END DO
! 757: DO J = 0, K - 3
! 758: CALL DLASSQ( K-J-2, A( J+2+J*LDA ), 1, SCALE, S )
! 759: * L at A(1,0)
! 760: END DO
! 761: S = S + S
! 762: * double s for the off diagonal elements
! 763: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
! 764: * tri U at A(0,0)
! 765: CALL DLASSQ( K-1, A( 1 ), LDA+1, SCALE, S )
! 766: * tri L at A(1,0)
! 767: END IF
! 768: END IF
! 769: ELSE
! 770: * n is even
! 771: IF( IFM.EQ.1 ) THEN
! 772: * A is normal
! 773: IF( ILU.EQ.0 ) THEN
! 774: * A is upper
! 775: DO J = 0, K - 2
! 776: CALL DLASSQ( K-J-1, A( K+J+2+J*LDA ), 1, SCALE, S )
! 777: * L at A(k+1,0)
! 778: END DO
! 779: DO J = 0, K - 1
! 780: CALL DLASSQ( K+J, A( 0+J*LDA ), 1, SCALE, S )
! 781: * trap U at A(0,0)
! 782: END DO
! 783: S = S + S
! 784: * double s for the off diagonal elements
! 785: CALL DLASSQ( K, A( K+1 ), LDA+1, SCALE, S )
! 786: * tri L at A(k+1,0)
! 787: CALL DLASSQ( K, A( K ), LDA+1, SCALE, S )
! 788: * tri U at A(k,0)
! 789: ELSE
! 790: * ilu=1 & A is lower
! 791: DO J = 0, K - 1
! 792: CALL DLASSQ( N-J-1, A( J+2+J*LDA ), 1, SCALE, S )
! 793: * trap L at A(1,0)
! 794: END DO
! 795: DO J = 1, K - 1
! 796: CALL DLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
! 797: * U at A(0,0)
! 798: END DO
! 799: S = S + S
! 800: * double s for the off diagonal elements
! 801: CALL DLASSQ( K, A( 1 ), LDA+1, SCALE, S )
! 802: * tri L at A(1,0)
! 803: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
! 804: * tri U at A(0,0)
! 805: END IF
! 806: ELSE
! 807: * A is xpose
! 808: IF( ILU.EQ.0 ) THEN
! 809: * A' is upper
! 810: DO J = 1, K - 1
! 811: CALL DLASSQ( J, A( 0+( K+1+J )*LDA ), 1, SCALE, S )
! 812: * U at A(0,k+1)
! 813: END DO
! 814: DO J = 0, K - 1
! 815: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
! 816: * k by k rect. at A(0,0)
! 817: END DO
! 818: DO J = 0, K - 2
! 819: CALL DLASSQ( K-J-1, A( J+1+( J+K )*LDA ), 1, SCALE,
! 820: + S )
! 821: * L at A(0,k)
! 822: END DO
! 823: S = S + S
! 824: * double s for the off diagonal elements
! 825: CALL DLASSQ( K, A( 0+( K+1 )*LDA ), LDA+1, SCALE, S )
! 826: * tri U at A(0,k+1)
! 827: CALL DLASSQ( K, A( 0+K*LDA ), LDA+1, SCALE, S )
! 828: * tri L at A(0,k)
! 829: ELSE
! 830: * A' is lower
! 831: DO J = 1, K - 1
! 832: CALL DLASSQ( J, A( 0+( J+1 )*LDA ), 1, SCALE, S )
! 833: * U at A(0,1)
! 834: END DO
! 835: DO J = K + 1, N
! 836: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
! 837: * k by k rect. at A(0,k+1)
! 838: END DO
! 839: DO J = 0, K - 2
! 840: CALL DLASSQ( K-J-1, A( J+1+J*LDA ), 1, SCALE, S )
! 841: * L at A(0,0)
! 842: END DO
! 843: S = S + S
! 844: * double s for the off diagonal elements
! 845: CALL DLASSQ( K, A( LDA ), LDA+1, SCALE, S )
! 846: * tri L at A(0,1)
! 847: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
! 848: * tri U at A(0,0)
! 849: END IF
! 850: END IF
! 851: END IF
! 852: VALUE = SCALE*SQRT( S )
! 853: END IF
! 854: *
! 855: DLANSF = VALUE
! 856: RETURN
! 857: *
! 858: * End of DLANSF
! 859: *
! 860: END
CVSweb interface <joel.bertrand@systella.fr>