File:  [local] / rpl / lapack / lapack / zlanhf.f
Revision 1.18: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 08:39:29 2023 UTC (8 months, 3 weeks ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, HEAD
Première mise à jour de lapack et blas.

    1: *> \brief \b ZLANHF returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a Hermitian matrix in RFP format.
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at
    6: *            http://www.netlib.org/lapack/explore-html/
    7: *
    8: *> \htmlonly
    9: *> Download ZLANHF + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlanhf.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlanhf.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlanhf.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       DOUBLE PRECISION FUNCTION ZLANHF( NORM, TRANSR, UPLO, N, A, WORK )
   22: *
   23: *       .. Scalar Arguments ..
   24: *       CHARACTER          NORM, TRANSR, UPLO
   25: *       INTEGER            N
   26: *       ..
   27: *       .. Array Arguments ..
   28: *       DOUBLE PRECISION   WORK( 0: * )
   29: *       COMPLEX*16         A( 0: * )
   30: *       ..
   31: *
   32: *
   33: *> \par Purpose:
   34: *  =============
   35: *>
   36: *> \verbatim
   37: *>
   38: *> ZLANHF  returns the value of the one norm,  or the Frobenius norm, or
   39: *> the  infinity norm,  or the  element of  largest absolute value  of a
   40: *> complex Hermitian matrix A in RFP format.
   41: *> \endverbatim
   42: *>
   43: *> \return ZLANHF
   44: *> \verbatim
   45: *>
   46: *>    ZLANHF = ( max(abs(A(i,j))), NORM = 'M' or 'm'
   47: *>             (
   48: *>             ( norm1(A),         NORM = '1', 'O' or 'o'
   49: *>             (
   50: *>             ( normI(A),         NORM = 'I' or 'i'
   51: *>             (
   52: *>             ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
   53: *>
   54: *> where  norm1  denotes the  one norm of a matrix (maximum column sum),
   55: *> normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
   56: *> normF  denotes the  Frobenius norm of a matrix (square root of sum of
   57: *> squares).  Note that  max(abs(A(i,j)))  is not a  matrix norm.
   58: *> \endverbatim
   59: *
   60: *  Arguments:
   61: *  ==========
   62: *
   63: *> \param[in] NORM
   64: *> \verbatim
   65: *>          NORM is CHARACTER
   66: *>            Specifies the value to be returned in ZLANHF as described
   67: *>            above.
   68: *> \endverbatim
   69: *>
   70: *> \param[in] TRANSR
   71: *> \verbatim
   72: *>          TRANSR is CHARACTER
   73: *>            Specifies whether the RFP format of A is normal or
   74: *>            conjugate-transposed format.
   75: *>            = 'N':  RFP format is Normal
   76: *>            = 'C':  RFP format is Conjugate-transposed
   77: *> \endverbatim
   78: *>
   79: *> \param[in] UPLO
   80: *> \verbatim
   81: *>          UPLO is CHARACTER
   82: *>            On entry, UPLO specifies whether the RFP matrix A came from
   83: *>            an upper or lower triangular matrix as follows:
   84: *>
   85: *>            UPLO = 'U' or 'u' RFP A came from an upper triangular
   86: *>            matrix
   87: *>
   88: *>            UPLO = 'L' or 'l' RFP A came from a  lower triangular
   89: *>            matrix
   90: *> \endverbatim
   91: *>
   92: *> \param[in] N
   93: *> \verbatim
   94: *>          N is INTEGER
   95: *>            The order of the matrix A.  N >= 0.  When N = 0, ZLANHF is
   96: *>            set to zero.
   97: *> \endverbatim
   98: *>
   99: *> \param[in] A
  100: *> \verbatim
  101: *>          A is COMPLEX*16 array, dimension ( N*(N+1)/2 );
  102: *>            On entry, the matrix A in RFP Format.
  103: *>            RFP Format is described by TRANSR, UPLO and N as follows:
  104: *>            If TRANSR='N' then RFP A is (0:N,0:K-1) when N is even;
  105: *>            K=N/2. RFP A is (0:N-1,0:K) when N is odd; K=N/2. If
  106: *>            TRANSR = 'C' then RFP is the Conjugate-transpose of RFP A
  107: *>            as defined when TRANSR = 'N'. The contents of RFP A are
  108: *>            defined by UPLO as follows: If UPLO = 'U' the RFP A
  109: *>            contains the ( N*(N+1)/2 ) elements of upper packed A
  110: *>            either in normal or conjugate-transpose Format. If
  111: *>            UPLO = 'L' the RFP A contains the ( N*(N+1) /2 ) elements
  112: *>            of lower packed A either in normal or conjugate-transpose
  113: *>            Format. The LDA of RFP A is (N+1)/2 when TRANSR = 'C'. When
  114: *>            TRANSR is 'N' the LDA is N+1 when N is even and is N when
  115: *>            is odd. See the Note below for more details.
  116: *>            Unchanged on exit.
  117: *> \endverbatim
  118: *>
  119: *> \param[out] WORK
  120: *> \verbatim
  121: *>          WORK is DOUBLE PRECISION array, dimension (LWORK),
  122: *>            where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
  123: *>            WORK is not referenced.
  124: *> \endverbatim
  125: *
  126: *  Authors:
  127: *  ========
  128: *
  129: *> \author Univ. of Tennessee
  130: *> \author Univ. of California Berkeley
  131: *> \author Univ. of Colorado Denver
  132: *> \author NAG Ltd.
  133: *
  134: *> \ingroup complex16OTHERcomputational
  135: *
  136: *> \par Further Details:
  137: *  =====================
  138: *>
  139: *> \verbatim
  140: *>
  141: *>  We first consider Standard Packed Format when N is even.
  142: *>  We give an example where N = 6.
  143: *>
  144: *>      AP is Upper             AP is Lower
  145: *>
  146: *>   00 01 02 03 04 05       00
  147: *>      11 12 13 14 15       10 11
  148: *>         22 23 24 25       20 21 22
  149: *>            33 34 35       30 31 32 33
  150: *>               44 45       40 41 42 43 44
  151: *>                  55       50 51 52 53 54 55
  152: *>
  153: *>
  154: *>  Let TRANSR = 'N'. RFP holds AP as follows:
  155: *>  For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
  156: *>  three columns of AP upper. The lower triangle A(4:6,0:2) consists of
  157: *>  conjugate-transpose of the first three columns of AP upper.
  158: *>  For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
  159: *>  three columns of AP lower. The upper triangle A(0:2,0:2) consists of
  160: *>  conjugate-transpose of the last three columns of AP lower.
  161: *>  To denote conjugate we place -- above the element. This covers the
  162: *>  case N even and TRANSR = 'N'.
  163: *>
  164: *>         RFP A                   RFP A
  165: *>
  166: *>                                -- -- --
  167: *>        03 04 05                33 43 53
  168: *>                                   -- --
  169: *>        13 14 15                00 44 54
  170: *>                                      --
  171: *>        23 24 25                10 11 55
  172: *>
  173: *>        33 34 35                20 21 22
  174: *>        --
  175: *>        00 44 45                30 31 32
  176: *>        -- --
  177: *>        01 11 55                40 41 42
  178: *>        -- -- --
  179: *>        02 12 22                50 51 52
  180: *>
  181: *>  Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
  182: *>  transpose of RFP A above. One therefore gets:
  183: *>
  184: *>
  185: *>           RFP A                   RFP A
  186: *>
  187: *>     -- -- -- --                -- -- -- -- -- --
  188: *>     03 13 23 33 00 01 02    33 00 10 20 30 40 50
  189: *>     -- -- -- -- --                -- -- -- -- --
  190: *>     04 14 24 34 44 11 12    43 44 11 21 31 41 51
  191: *>     -- -- -- -- -- --                -- -- -- --
  192: *>     05 15 25 35 45 55 22    53 54 55 22 32 42 52
  193: *>
  194: *>
  195: *>  We next  consider Standard Packed Format when N is odd.
  196: *>  We give an example where N = 5.
  197: *>
  198: *>     AP is Upper                 AP is Lower
  199: *>
  200: *>   00 01 02 03 04              00
  201: *>      11 12 13 14              10 11
  202: *>         22 23 24              20 21 22
  203: *>            33 34              30 31 32 33
  204: *>               44              40 41 42 43 44
  205: *>
  206: *>
  207: *>  Let TRANSR = 'N'. RFP holds AP as follows:
  208: *>  For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
  209: *>  three columns of AP upper. The lower triangle A(3:4,0:1) consists of
  210: *>  conjugate-transpose of the first two   columns of AP upper.
  211: *>  For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
  212: *>  three columns of AP lower. The upper triangle A(0:1,1:2) consists of
  213: *>  conjugate-transpose of the last two   columns of AP lower.
  214: *>  To denote conjugate we place -- above the element. This covers the
  215: *>  case N odd  and TRANSR = 'N'.
  216: *>
  217: *>         RFP A                   RFP A
  218: *>
  219: *>                                   -- --
  220: *>        02 03 04                00 33 43
  221: *>                                      --
  222: *>        12 13 14                10 11 44
  223: *>
  224: *>        22 23 24                20 21 22
  225: *>        --
  226: *>        00 33 34                30 31 32
  227: *>        -- --
  228: *>        01 11 44                40 41 42
  229: *>
  230: *>  Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
  231: *>  transpose of RFP A above. One therefore gets:
  232: *>
  233: *>
  234: *>           RFP A                   RFP A
  235: *>
  236: *>     -- -- --                   -- -- -- -- -- --
  237: *>     02 12 22 00 01             00 10 20 30 40 50
  238: *>     -- -- -- --                   -- -- -- -- --
  239: *>     03 13 23 33 11             33 11 21 31 41 51
  240: *>     -- -- -- -- --                   -- -- -- --
  241: *>     04 14 24 34 44             43 44 22 32 42 52
  242: *> \endverbatim
  243: *>
  244: *  =====================================================================
  245:       DOUBLE PRECISION FUNCTION ZLANHF( NORM, TRANSR, UPLO, N, A, WORK )
  246: *
  247: *  -- LAPACK computational routine --
  248: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  249: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  250: *
  251: *     .. Scalar Arguments ..
  252:       CHARACTER          NORM, TRANSR, UPLO
  253:       INTEGER            N
  254: *     ..
  255: *     .. Array Arguments ..
  256:       DOUBLE PRECISION   WORK( 0: * )
  257:       COMPLEX*16         A( 0: * )
  258: *     ..
  259: *
  260: *  =====================================================================
  261: *
  262: *     .. Parameters ..
  263:       DOUBLE PRECISION   ONE, ZERO
  264:       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
  265: *     ..
  266: *     .. Local Scalars ..
  267:       INTEGER            I, J, IFM, ILU, NOE, N1, K, L, LDA
  268:       DOUBLE PRECISION   SCALE, S, VALUE, AA, TEMP
  269: *     ..
  270: *     .. External Functions ..
  271:       LOGICAL            LSAME, DISNAN
  272:       EXTERNAL           LSAME, DISNAN
  273: *     ..
  274: *     .. External Subroutines ..
  275:       EXTERNAL           ZLASSQ
  276: *     ..
  277: *     .. Intrinsic Functions ..
  278:       INTRINSIC          ABS, DBLE, SQRT
  279: *     ..
  280: *     .. Executable Statements ..
  281: *
  282:       IF( N.EQ.0 ) THEN
  283:          ZLANHF = ZERO
  284:          RETURN
  285:       ELSE IF( N.EQ.1 ) THEN
  286:          ZLANHF = ABS(DBLE(A(0)))
  287:          RETURN
  288:       END IF
  289: *
  290: *     set noe = 1 if n is odd. if n is even set noe=0
  291: *
  292:       NOE = 1
  293:       IF( MOD( N, 2 ).EQ.0 )
  294:      $   NOE = 0
  295: *
  296: *     set ifm = 0 when form='C' or 'c' and 1 otherwise
  297: *
  298:       IFM = 1
  299:       IF( LSAME( TRANSR, 'C' ) )
  300:      $   IFM = 0
  301: *
  302: *     set ilu = 0 when uplo='U or 'u' and 1 otherwise
  303: *
  304:       ILU = 1
  305:       IF( LSAME( UPLO, 'U' ) )
  306:      $   ILU = 0
  307: *
  308: *     set lda = (n+1)/2 when ifm = 0
  309: *     set lda = n when ifm = 1 and noe = 1
  310: *     set lda = n+1 when ifm = 1 and noe = 0
  311: *
  312:       IF( IFM.EQ.1 ) THEN
  313:          IF( NOE.EQ.1 ) THEN
  314:             LDA = N
  315:          ELSE
  316: *           noe=0
  317:             LDA = N + 1
  318:          END IF
  319:       ELSE
  320: *        ifm=0
  321:          LDA = ( N+1 ) / 2
  322:       END IF
  323: *
  324:       IF( LSAME( NORM, 'M' ) ) THEN
  325: *
  326: *       Find max(abs(A(i,j))).
  327: *
  328:          K = ( N+1 ) / 2
  329:          VALUE = ZERO
  330:          IF( NOE.EQ.1 ) THEN
  331: *           n is odd & n = k + k - 1
  332:             IF( IFM.EQ.1 ) THEN
  333: *              A is n by k
  334:                IF( ILU.EQ.1 ) THEN
  335: *                 uplo ='L'
  336:                   J = 0
  337: *                 -> L(0,0)
  338:                   TEMP = ABS( DBLE( A( J+J*LDA ) ) )
  339:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  340:      $                 VALUE = TEMP
  341:                   DO I = 1, N - 1
  342:                      TEMP = ABS( A( I+J*LDA ) )
  343:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  344:      $                    VALUE = TEMP
  345:                   END DO
  346:                   DO J = 1, K - 1
  347:                      DO I = 0, J - 2
  348:                         TEMP = ABS( A( I+J*LDA ) )
  349:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  350:      $                       VALUE = TEMP
  351:                      END DO
  352:                      I = J - 1
  353: *                    L(k+j,k+j)
  354:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  355:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  356:      $                    VALUE = TEMP
  357:                      I = J
  358: *                    -> L(j,j)
  359:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  360:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  361:      $                    VALUE = TEMP
  362:                      DO I = J + 1, N - 1
  363:                         TEMP = ABS( A( I+J*LDA ) )
  364:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  365:      $                       VALUE = TEMP
  366:                      END DO
  367:                   END DO
  368:                ELSE
  369: *                 uplo = 'U'
  370:                   DO J = 0, K - 2
  371:                      DO I = 0, K + J - 2
  372:                         TEMP = ABS( A( I+J*LDA ) )
  373:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  374:      $                       VALUE = TEMP
  375:                      END DO
  376:                      I = K + J - 1
  377: *                    -> U(i,i)
  378:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  379:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  380:      $                    VALUE = TEMP
  381:                      I = I + 1
  382: *                    =k+j; i -> U(j,j)
  383:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  384:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  385:      $                    VALUE = TEMP
  386:                      DO I = K + J + 1, N - 1
  387:                         TEMP = ABS( A( I+J*LDA ) )
  388:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  389:      $                       VALUE = TEMP
  390:                      END DO
  391:                   END DO
  392:                   DO I = 0, N - 2
  393:                      TEMP = ABS( A( I+J*LDA ) )
  394:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  395:      $                    VALUE = TEMP
  396: *                    j=k-1
  397:                   END DO
  398: *                 i=n-1 -> U(n-1,n-1)
  399:                   TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  400:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  401:      $                 VALUE = TEMP
  402:                END IF
  403:             ELSE
  404: *              xpose case; A is k by n
  405:                IF( ILU.EQ.1 ) THEN
  406: *                 uplo ='L'
  407:                   DO J = 0, K - 2
  408:                      DO I = 0, J - 1
  409:                         TEMP = ABS( A( I+J*LDA ) )
  410:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  411:      $                       VALUE = TEMP
  412:                      END DO
  413:                      I = J
  414: *                    L(i,i)
  415:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  416:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  417:      $                    VALUE = TEMP
  418:                      I = J + 1
  419: *                    L(j+k,j+k)
  420:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  421:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  422:      $                    VALUE = TEMP
  423:                      DO I = J + 2, K - 1
  424:                         TEMP = ABS( A( I+J*LDA ) )
  425:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  426:      $                       VALUE = TEMP
  427:                      END DO
  428:                   END DO
  429:                   J = K - 1
  430:                   DO I = 0, K - 2
  431:                      TEMP = ABS( A( I+J*LDA ) )
  432:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  433:      $                    VALUE = TEMP
  434:                   END DO
  435:                   I = K - 1
  436: *                 -> L(i,i) is at A(i,j)
  437:                   TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  438:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  439:      $                    VALUE = TEMP
  440:                   DO J = K, N - 1
  441:                      DO I = 0, K - 1
  442:                         TEMP = ABS( A( I+J*LDA ) )
  443:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  444:      $                       VALUE = TEMP
  445:                      END DO
  446:                   END DO
  447:                ELSE
  448: *                 uplo = 'U'
  449:                   DO J = 0, K - 2
  450:                      DO I = 0, K - 1
  451:                         TEMP = ABS( A( I+J*LDA ) )
  452:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  453:      $                       VALUE = TEMP
  454:                      END DO
  455:                   END DO
  456:                   J = K - 1
  457: *                 -> U(j,j) is at A(0,j)
  458:                   TEMP = ABS( DBLE( A( 0+J*LDA ) ) )
  459:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  460:      $                    VALUE = TEMP
  461:                   DO I = 1, K - 1
  462:                      TEMP = ABS( A( I+J*LDA ) )
  463:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  464:      $                    VALUE = TEMP
  465:                   END DO
  466:                   DO J = K, N - 1
  467:                      DO I = 0, J - K - 1
  468:                         TEMP = ABS( A( I+J*LDA ) )
  469:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  470:      $                       VALUE = TEMP
  471:                      END DO
  472:                      I = J - K
  473: *                    -> U(i,i) at A(i,j)
  474:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  475:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  476:      $                    VALUE = TEMP
  477:                      I = J - K + 1
  478: *                    U(j,j)
  479:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  480:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  481:      $                    VALUE = TEMP
  482:                      DO I = J - K + 2, K - 1
  483:                         TEMP = ABS( A( I+J*LDA ) )
  484:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  485:      $                       VALUE = TEMP
  486:                      END DO
  487:                   END DO
  488:                END IF
  489:             END IF
  490:          ELSE
  491: *           n is even & k = n/2
  492:             IF( IFM.EQ.1 ) THEN
  493: *              A is n+1 by k
  494:                IF( ILU.EQ.1 ) THEN
  495: *                 uplo ='L'
  496:                   J = 0
  497: *                 -> L(k,k) & j=1 -> L(0,0)
  498:                   TEMP = ABS( DBLE( A( J+J*LDA ) ) )
  499:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  500:      $                 VALUE = TEMP
  501:                   TEMP = ABS( DBLE( A( J+1+J*LDA ) ) )
  502:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  503:      $                 VALUE = TEMP
  504:                   DO I = 2, N
  505:                      TEMP = ABS( A( I+J*LDA ) )
  506:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  507:      $                    VALUE = TEMP
  508:                   END DO
  509:                   DO J = 1, K - 1
  510:                      DO I = 0, J - 1
  511:                         TEMP = ABS( A( I+J*LDA ) )
  512:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  513:      $                       VALUE = TEMP
  514:                      END DO
  515:                      I = J
  516: *                    L(k+j,k+j)
  517:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  518:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  519:      $                    VALUE = TEMP
  520:                      I = J + 1
  521: *                    -> L(j,j)
  522:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  523:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  524:      $                    VALUE = TEMP
  525:                      DO I = J + 2, N
  526:                         TEMP = ABS( A( I+J*LDA ) )
  527:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  528:      $                       VALUE = TEMP
  529:                      END DO
  530:                   END DO
  531:                ELSE
  532: *                 uplo = 'U'
  533:                   DO J = 0, K - 2
  534:                      DO I = 0, K + J - 1
  535:                         TEMP = ABS( A( I+J*LDA ) )
  536:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  537:      $                       VALUE = TEMP
  538:                      END DO
  539:                      I = K + J
  540: *                    -> U(i,i)
  541:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  542:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  543:      $                    VALUE = TEMP
  544:                      I = I + 1
  545: *                    =k+j+1; i -> U(j,j)
  546:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  547:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  548:      $                    VALUE = TEMP
  549:                      DO I = K + J + 2, N
  550:                         TEMP = ABS( A( I+J*LDA ) )
  551:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  552:      $                       VALUE = TEMP
  553:                      END DO
  554:                   END DO
  555:                   DO I = 0, N - 2
  556:                      TEMP = ABS( A( I+J*LDA ) )
  557:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  558:      $                    VALUE = TEMP
  559: *                    j=k-1
  560:                   END DO
  561: *                 i=n-1 -> U(n-1,n-1)
  562:                   TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  563:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  564:      $                    VALUE = TEMP
  565:                   I = N
  566: *                 -> U(k-1,k-1)
  567:                   TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  568:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  569:      $                    VALUE = TEMP
  570:                END IF
  571:             ELSE
  572: *              xpose case; A is k by n+1
  573:                IF( ILU.EQ.1 ) THEN
  574: *                 uplo ='L'
  575:                   J = 0
  576: *                 -> L(k,k) at A(0,0)
  577:                   TEMP = ABS( DBLE( A( J+J*LDA ) ) )
  578:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  579:      $                    VALUE = TEMP
  580:                   DO I = 1, K - 1
  581:                      TEMP = ABS( A( I+J*LDA ) )
  582:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  583:      $                    VALUE = TEMP
  584:                   END DO
  585:                   DO J = 1, K - 1
  586:                      DO I = 0, J - 2
  587:                         TEMP = ABS( A( I+J*LDA ) )
  588:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  589:      $                       VALUE = TEMP
  590:                      END DO
  591:                      I = J - 1
  592: *                    L(i,i)
  593:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  594:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  595:      $                    VALUE = TEMP
  596:                      I = J
  597: *                    L(j+k,j+k)
  598:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  599:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  600:      $                    VALUE = TEMP
  601:                      DO I = J + 1, K - 1
  602:                         TEMP = ABS( A( I+J*LDA ) )
  603:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  604:      $                       VALUE = TEMP
  605:                      END DO
  606:                   END DO
  607:                   J = K
  608:                   DO I = 0, K - 2
  609:                      TEMP = ABS( A( I+J*LDA ) )
  610:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  611:      $                    VALUE = TEMP
  612:                   END DO
  613:                   I = K - 1
  614: *                 -> L(i,i) is at A(i,j)
  615:                   TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  616:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  617:      $                 VALUE = TEMP
  618:                   DO J = K + 1, N
  619:                      DO I = 0, K - 1
  620:                         TEMP = ABS( A( I+J*LDA ) )
  621:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  622:      $                       VALUE = TEMP
  623:                      END DO
  624:                   END DO
  625:                ELSE
  626: *                 uplo = 'U'
  627:                   DO J = 0, K - 1
  628:                      DO I = 0, K - 1
  629:                         TEMP = ABS( A( I+J*LDA ) )
  630:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  631:      $                       VALUE = TEMP
  632:                      END DO
  633:                   END DO
  634:                   J = K
  635: *                 -> U(j,j) is at A(0,j)
  636:                   TEMP = ABS( DBLE( A( 0+J*LDA ) ) )
  637:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  638:      $                 VALUE = TEMP
  639:                   DO I = 1, K - 1
  640:                      TEMP = ABS( A( I+J*LDA ) )
  641:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  642:      $                    VALUE = TEMP
  643:                   END DO
  644:                   DO J = K + 1, N - 1
  645:                      DO I = 0, J - K - 2
  646:                         TEMP = ABS( A( I+J*LDA ) )
  647:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  648:      $                       VALUE = TEMP
  649:                      END DO
  650:                      I = J - K - 1
  651: *                    -> U(i,i) at A(i,j)
  652:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  653:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  654:      $                    VALUE = TEMP
  655:                      I = J - K
  656: *                    U(j,j)
  657:                      TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  658:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  659:      $                    VALUE = TEMP
  660:                      DO I = J - K + 1, K - 1
  661:                         TEMP = ABS( A( I+J*LDA ) )
  662:                         IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  663:      $                       VALUE = TEMP
  664:                      END DO
  665:                   END DO
  666:                   J = N
  667:                   DO I = 0, K - 2
  668:                      TEMP = ABS( A( I+J*LDA ) )
  669:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  670:      $                    VALUE = TEMP
  671:                   END DO
  672:                   I = K - 1
  673: *                 U(k,k) at A(i,j)
  674:                   TEMP = ABS( DBLE( A( I+J*LDA ) ) )
  675:                   IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  676:      $                 VALUE = TEMP
  677:                END IF
  678:             END IF
  679:          END IF
  680:       ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
  681:      $         ( NORM.EQ.'1' ) ) THEN
  682: *
  683: *       Find normI(A) ( = norm1(A), since A is Hermitian).
  684: *
  685:          IF( IFM.EQ.1 ) THEN
  686: *           A is 'N'
  687:             K = N / 2
  688:             IF( NOE.EQ.1 ) THEN
  689: *              n is odd & A is n by (n+1)/2
  690:                IF( ILU.EQ.0 ) THEN
  691: *                 uplo = 'U'
  692:                   DO I = 0, K - 1
  693:                      WORK( I ) = ZERO
  694:                   END DO
  695:                   DO J = 0, K
  696:                      S = ZERO
  697:                      DO I = 0, K + J - 1
  698:                         AA = ABS( A( I+J*LDA ) )
  699: *                       -> A(i,j+k)
  700:                         S = S + AA
  701:                         WORK( I ) = WORK( I ) + AA
  702:                      END DO
  703:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  704: *                    -> A(j+k,j+k)
  705:                      WORK( J+K ) = S + AA
  706:                      IF( I.EQ.K+K )
  707:      $                  GO TO 10
  708:                      I = I + 1
  709:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  710: *                    -> A(j,j)
  711:                      WORK( J ) = WORK( J ) + AA
  712:                      S = ZERO
  713:                      DO L = J + 1, K - 1
  714:                         I = I + 1
  715:                         AA = ABS( A( I+J*LDA ) )
  716: *                       -> A(l,j)
  717:                         S = S + AA
  718:                         WORK( L ) = WORK( L ) + AA
  719:                      END DO
  720:                      WORK( J ) = WORK( J ) + S
  721:                   END DO
  722:    10             CONTINUE
  723:                   VALUE = WORK( 0 )
  724:                   DO I = 1, N-1
  725:                      TEMP = WORK( I )
  726:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  727:      $                    VALUE = TEMP
  728:                   END DO
  729:                ELSE
  730: *                 ilu = 1 & uplo = 'L'
  731:                   K = K + 1
  732: *                 k=(n+1)/2 for n odd and ilu=1
  733:                   DO I = K, N - 1
  734:                      WORK( I ) = ZERO
  735:                   END DO
  736:                   DO J = K - 1, 0, -1
  737:                      S = ZERO
  738:                      DO I = 0, J - 2
  739:                         AA = ABS( A( I+J*LDA ) )
  740: *                       -> A(j+k,i+k)
  741:                         S = S + AA
  742:                         WORK( I+K ) = WORK( I+K ) + AA
  743:                      END DO
  744:                      IF( J.GT.0 ) THEN
  745:                         AA = ABS( DBLE( A( I+J*LDA ) ) )
  746: *                       -> A(j+k,j+k)
  747:                         S = S + AA
  748:                         WORK( I+K ) = WORK( I+K ) + S
  749: *                       i=j
  750:                         I = I + 1
  751:                      END IF
  752:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  753: *                    -> A(j,j)
  754:                      WORK( J ) = AA
  755:                      S = ZERO
  756:                      DO L = J + 1, N - 1
  757:                         I = I + 1
  758:                         AA = ABS( A( I+J*LDA ) )
  759: *                       -> A(l,j)
  760:                         S = S + AA
  761:                         WORK( L ) = WORK( L ) + AA
  762:                      END DO
  763:                      WORK( J ) = WORK( J ) + S
  764:                   END DO
  765:                   VALUE = WORK( 0 )
  766:                   DO I = 1, N-1
  767:                      TEMP = WORK( I )
  768:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  769:      $                    VALUE = TEMP
  770:                   END DO
  771:                END IF
  772:             ELSE
  773: *              n is even & A is n+1 by k = n/2
  774:                IF( ILU.EQ.0 ) THEN
  775: *                 uplo = 'U'
  776:                   DO I = 0, K - 1
  777:                      WORK( I ) = ZERO
  778:                   END DO
  779:                   DO J = 0, K - 1
  780:                      S = ZERO
  781:                      DO I = 0, K + J - 1
  782:                         AA = ABS( A( I+J*LDA ) )
  783: *                       -> A(i,j+k)
  784:                         S = S + AA
  785:                         WORK( I ) = WORK( I ) + AA
  786:                      END DO
  787:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  788: *                    -> A(j+k,j+k)
  789:                      WORK( J+K ) = S + AA
  790:                      I = I + 1
  791:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  792: *                    -> A(j,j)
  793:                      WORK( J ) = WORK( J ) + AA
  794:                      S = ZERO
  795:                      DO L = J + 1, K - 1
  796:                         I = I + 1
  797:                         AA = ABS( A( I+J*LDA ) )
  798: *                       -> A(l,j)
  799:                         S = S + AA
  800:                         WORK( L ) = WORK( L ) + AA
  801:                      END DO
  802:                      WORK( J ) = WORK( J ) + S
  803:                   END DO
  804:                   VALUE = WORK( 0 )
  805:                   DO I = 1, N-1
  806:                      TEMP = WORK( I )
  807:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  808:      $                    VALUE = TEMP
  809:                   END DO
  810:                ELSE
  811: *                 ilu = 1 & uplo = 'L'
  812:                   DO I = K, N - 1
  813:                      WORK( I ) = ZERO
  814:                   END DO
  815:                   DO J = K - 1, 0, -1
  816:                      S = ZERO
  817:                      DO I = 0, J - 1
  818:                         AA = ABS( A( I+J*LDA ) )
  819: *                       -> A(j+k,i+k)
  820:                         S = S + AA
  821:                         WORK( I+K ) = WORK( I+K ) + AA
  822:                      END DO
  823:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  824: *                    -> A(j+k,j+k)
  825:                      S = S + AA
  826:                      WORK( I+K ) = WORK( I+K ) + S
  827: *                    i=j
  828:                      I = I + 1
  829:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  830: *                    -> A(j,j)
  831:                      WORK( J ) = AA
  832:                      S = ZERO
  833:                      DO L = J + 1, N - 1
  834:                         I = I + 1
  835:                         AA = ABS( A( I+J*LDA ) )
  836: *                       -> A(l,j)
  837:                         S = S + AA
  838:                         WORK( L ) = WORK( L ) + AA
  839:                      END DO
  840:                      WORK( J ) = WORK( J ) + S
  841:                   END DO
  842:                   VALUE = WORK( 0 )
  843:                   DO I = 1, N-1
  844:                      TEMP = WORK( I )
  845:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  846:      $                    VALUE = TEMP
  847:                   END DO
  848:                END IF
  849:             END IF
  850:          ELSE
  851: *           ifm=0
  852:             K = N / 2
  853:             IF( NOE.EQ.1 ) THEN
  854: *              n is odd & A is (n+1)/2 by n
  855:                IF( ILU.EQ.0 ) THEN
  856: *                 uplo = 'U'
  857:                   N1 = K
  858: *                 n/2
  859:                   K = K + 1
  860: *                 k is the row size and lda
  861:                   DO I = N1, N - 1
  862:                      WORK( I ) = ZERO
  863:                   END DO
  864:                   DO J = 0, N1 - 1
  865:                      S = ZERO
  866:                      DO I = 0, K - 1
  867:                         AA = ABS( A( I+J*LDA ) )
  868: *                       A(j,n1+i)
  869:                         WORK( I+N1 ) = WORK( I+N1 ) + AA
  870:                         S = S + AA
  871:                      END DO
  872:                      WORK( J ) = S
  873:                   END DO
  874: *                 j=n1=k-1 is special
  875:                   S = ABS( DBLE( A( 0+J*LDA ) ) )
  876: *                 A(k-1,k-1)
  877:                   DO I = 1, K - 1
  878:                      AA = ABS( A( I+J*LDA ) )
  879: *                    A(k-1,i+n1)
  880:                      WORK( I+N1 ) = WORK( I+N1 ) + AA
  881:                      S = S + AA
  882:                   END DO
  883:                   WORK( J ) = WORK( J ) + S
  884:                   DO J = K, N - 1
  885:                      S = ZERO
  886:                      DO I = 0, J - K - 1
  887:                         AA = ABS( A( I+J*LDA ) )
  888: *                       A(i,j-k)
  889:                         WORK( I ) = WORK( I ) + AA
  890:                         S = S + AA
  891:                      END DO
  892: *                    i=j-k
  893:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  894: *                    A(j-k,j-k)
  895:                      S = S + AA
  896:                      WORK( J-K ) = WORK( J-K ) + S
  897:                      I = I + 1
  898:                      S = ABS( DBLE( A( I+J*LDA ) ) )
  899: *                    A(j,j)
  900:                      DO L = J + 1, N - 1
  901:                         I = I + 1
  902:                         AA = ABS( A( I+J*LDA ) )
  903: *                       A(j,l)
  904:                         WORK( L ) = WORK( L ) + AA
  905:                         S = S + AA
  906:                      END DO
  907:                      WORK( J ) = WORK( J ) + S
  908:                   END DO
  909:                   VALUE = WORK( 0 )
  910:                   DO I = 1, N-1
  911:                      TEMP = WORK( I )
  912:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  913:      $                    VALUE = TEMP
  914:                   END DO
  915:                ELSE
  916: *                 ilu=1 & uplo = 'L'
  917:                   K = K + 1
  918: *                 k=(n+1)/2 for n odd and ilu=1
  919:                   DO I = K, N - 1
  920:                      WORK( I ) = ZERO
  921:                   END DO
  922:                   DO J = 0, K - 2
  923: *                    process
  924:                      S = ZERO
  925:                      DO I = 0, J - 1
  926:                         AA = ABS( A( I+J*LDA ) )
  927: *                       A(j,i)
  928:                         WORK( I ) = WORK( I ) + AA
  929:                         S = S + AA
  930:                      END DO
  931:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  932: *                    i=j so process of A(j,j)
  933:                      S = S + AA
  934:                      WORK( J ) = S
  935: *                    is initialised here
  936:                      I = I + 1
  937: *                    i=j process A(j+k,j+k)
  938:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
  939:                      S = AA
  940:                      DO L = K + J + 1, N - 1
  941:                         I = I + 1
  942:                         AA = ABS( A( I+J*LDA ) )
  943: *                       A(l,k+j)
  944:                         S = S + AA
  945:                         WORK( L ) = WORK( L ) + AA
  946:                      END DO
  947:                      WORK( K+J ) = WORK( K+J ) + S
  948:                   END DO
  949: *                 j=k-1 is special :process col A(k-1,0:k-1)
  950:                   S = ZERO
  951:                   DO I = 0, K - 2
  952:                      AA = ABS( A( I+J*LDA ) )
  953: *                    A(k,i)
  954:                      WORK( I ) = WORK( I ) + AA
  955:                      S = S + AA
  956:                   END DO
  957: *                 i=k-1
  958:                   AA = ABS( DBLE( A( I+J*LDA ) ) )
  959: *                 A(k-1,k-1)
  960:                   S = S + AA
  961:                   WORK( I ) = S
  962: *                 done with col j=k+1
  963:                   DO J = K, N - 1
  964: *                    process col j of A = A(j,0:k-1)
  965:                      S = ZERO
  966:                      DO I = 0, K - 1
  967:                         AA = ABS( A( I+J*LDA ) )
  968: *                       A(j,i)
  969:                         WORK( I ) = WORK( I ) + AA
  970:                         S = S + AA
  971:                      END DO
  972:                      WORK( J ) = WORK( J ) + S
  973:                   END DO
  974:                   VALUE = WORK( 0 )
  975:                   DO I = 1, N-1
  976:                      TEMP = WORK( I )
  977:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
  978:      $                    VALUE = TEMP
  979:                   END DO
  980:                END IF
  981:             ELSE
  982: *              n is even & A is k=n/2 by n+1
  983:                IF( ILU.EQ.0 ) THEN
  984: *                 uplo = 'U'
  985:                   DO I = K, N - 1
  986:                      WORK( I ) = ZERO
  987:                   END DO
  988:                   DO J = 0, K - 1
  989:                      S = ZERO
  990:                      DO I = 0, K - 1
  991:                         AA = ABS( A( I+J*LDA ) )
  992: *                       A(j,i+k)
  993:                         WORK( I+K ) = WORK( I+K ) + AA
  994:                         S = S + AA
  995:                      END DO
  996:                      WORK( J ) = S
  997:                   END DO
  998: *                 j=k
  999:                   AA = ABS( DBLE( A( 0+J*LDA ) ) )
 1000: *                 A(k,k)
 1001:                   S = AA
 1002:                   DO I = 1, K - 1
 1003:                      AA = ABS( A( I+J*LDA ) )
 1004: *                    A(k,k+i)
 1005:                      WORK( I+K ) = WORK( I+K ) + AA
 1006:                      S = S + AA
 1007:                   END DO
 1008:                   WORK( J ) = WORK( J ) + S
 1009:                   DO J = K + 1, N - 1
 1010:                      S = ZERO
 1011:                      DO I = 0, J - 2 - K
 1012:                         AA = ABS( A( I+J*LDA ) )
 1013: *                       A(i,j-k-1)
 1014:                         WORK( I ) = WORK( I ) + AA
 1015:                         S = S + AA
 1016:                      END DO
 1017: *                    i=j-1-k
 1018:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
 1019: *                    A(j-k-1,j-k-1)
 1020:                      S = S + AA
 1021:                      WORK( J-K-1 ) = WORK( J-K-1 ) + S
 1022:                      I = I + 1
 1023:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
 1024: *                    A(j,j)
 1025:                      S = AA
 1026:                      DO L = J + 1, N - 1
 1027:                         I = I + 1
 1028:                         AA = ABS( A( I+J*LDA ) )
 1029: *                       A(j,l)
 1030:                         WORK( L ) = WORK( L ) + AA
 1031:                         S = S + AA
 1032:                      END DO
 1033:                      WORK( J ) = WORK( J ) + S
 1034:                   END DO
 1035: *                 j=n
 1036:                   S = ZERO
 1037:                   DO I = 0, K - 2
 1038:                      AA = ABS( A( I+J*LDA ) )
 1039: *                    A(i,k-1)
 1040:                      WORK( I ) = WORK( I ) + AA
 1041:                      S = S + AA
 1042:                   END DO
 1043: *                 i=k-1
 1044:                   AA = ABS( DBLE( A( I+J*LDA ) ) )
 1045: *                 A(k-1,k-1)
 1046:                   S = S + AA
 1047:                   WORK( I ) = WORK( I ) + S
 1048:                   VALUE = WORK( 0 )
 1049:                   DO I = 1, N-1
 1050:                      TEMP = WORK( I )
 1051:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
 1052:      $                    VALUE = TEMP
 1053:                   END DO
 1054:                ELSE
 1055: *                 ilu=1 & uplo = 'L'
 1056:                   DO I = K, N - 1
 1057:                      WORK( I ) = ZERO
 1058:                   END DO
 1059: *                 j=0 is special :process col A(k:n-1,k)
 1060:                   S = ABS( DBLE( A( 0 ) ) )
 1061: *                 A(k,k)
 1062:                   DO I = 1, K - 1
 1063:                      AA = ABS( A( I ) )
 1064: *                    A(k+i,k)
 1065:                      WORK( I+K ) = WORK( I+K ) + AA
 1066:                      S = S + AA
 1067:                   END DO
 1068:                   WORK( K ) = WORK( K ) + S
 1069:                   DO J = 1, K - 1
 1070: *                    process
 1071:                      S = ZERO
 1072:                      DO I = 0, J - 2
 1073:                         AA = ABS( A( I+J*LDA ) )
 1074: *                       A(j-1,i)
 1075:                         WORK( I ) = WORK( I ) + AA
 1076:                         S = S + AA
 1077:                      END DO
 1078:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
 1079: *                    i=j-1 so process of A(j-1,j-1)
 1080:                      S = S + AA
 1081:                      WORK( J-1 ) = S
 1082: *                    is initialised here
 1083:                      I = I + 1
 1084: *                    i=j process A(j+k,j+k)
 1085:                      AA = ABS( DBLE( A( I+J*LDA ) ) )
 1086:                      S = AA
 1087:                      DO L = K + J + 1, N - 1
 1088:                         I = I + 1
 1089:                         AA = ABS( A( I+J*LDA ) )
 1090: *                       A(l,k+j)
 1091:                         S = S + AA
 1092:                         WORK( L ) = WORK( L ) + AA
 1093:                      END DO
 1094:                      WORK( K+J ) = WORK( K+J ) + S
 1095:                   END DO
 1096: *                 j=k is special :process col A(k,0:k-1)
 1097:                   S = ZERO
 1098:                   DO I = 0, K - 2
 1099:                      AA = ABS( A( I+J*LDA ) )
 1100: *                    A(k,i)
 1101:                      WORK( I ) = WORK( I ) + AA
 1102:                      S = S + AA
 1103:                   END DO
 1104: *
 1105: *                 i=k-1
 1106:                   AA = ABS( DBLE( A( I+J*LDA ) ) )
 1107: *                 A(k-1,k-1)
 1108:                   S = S + AA
 1109:                   WORK( I ) = S
 1110: *                 done with col j=k+1
 1111:                   DO J = K + 1, N
 1112: *
 1113: *                    process col j-1 of A = A(j-1,0:k-1)
 1114:                      S = ZERO
 1115:                      DO I = 0, K - 1
 1116:                         AA = ABS( A( I+J*LDA ) )
 1117: *                       A(j-1,i)
 1118:                         WORK( I ) = WORK( I ) + AA
 1119:                         S = S + AA
 1120:                      END DO
 1121:                      WORK( J-1 ) = WORK( J-1 ) + S
 1122:                   END DO
 1123:                   VALUE = WORK( 0 )
 1124:                   DO I = 1, N-1
 1125:                      TEMP = WORK( I )
 1126:                      IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
 1127:      $                    VALUE = TEMP
 1128:                   END DO
 1129:                END IF
 1130:             END IF
 1131:          END IF
 1132:       ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
 1133: *
 1134: *       Find normF(A).
 1135: *
 1136:          K = ( N+1 ) / 2
 1137:          SCALE = ZERO
 1138:          S = ONE
 1139:          IF( NOE.EQ.1 ) THEN
 1140: *           n is odd
 1141:             IF( IFM.EQ.1 ) THEN
 1142: *              A is normal & A is n by k
 1143:                IF( ILU.EQ.0 ) THEN
 1144: *                 A is upper
 1145:                   DO J = 0, K - 3
 1146:                      CALL ZLASSQ( K-J-2, A( K+J+1+J*LDA ), 1, SCALE, S )
 1147: *                    L at A(k,0)
 1148:                   END DO
 1149:                   DO J = 0, K - 1
 1150:                      CALL ZLASSQ( K+J-1, A( 0+J*LDA ), 1, SCALE, S )
 1151: *                    trap U at A(0,0)
 1152:                   END DO
 1153:                   S = S + S
 1154: *                 double s for the off diagonal elements
 1155:                   L = K - 1
 1156: *                 -> U(k,k) at A(k-1,0)
 1157:                   DO I = 0, K - 2
 1158:                      AA = DBLE( A( L ) )
 1159: *                    U(k+i,k+i)
 1160:                      IF( AA.NE.ZERO ) THEN
 1161:                         IF( SCALE.LT.AA ) THEN
 1162:                            S = ONE + S*( SCALE / AA )**2
 1163:                            SCALE = AA
 1164:                         ELSE
 1165:                            S = S + ( AA / SCALE )**2
 1166:                         END IF
 1167:                      END IF
 1168:                      AA = DBLE( A( L+1 ) )
 1169: *                    U(i,i)
 1170:                      IF( AA.NE.ZERO ) THEN
 1171:                         IF( SCALE.LT.AA ) THEN
 1172:                            S = ONE + S*( SCALE / AA )**2
 1173:                            SCALE = AA
 1174:                         ELSE
 1175:                            S = S + ( AA / SCALE )**2
 1176:                         END IF
 1177:                      END IF
 1178:                      L = L + LDA + 1
 1179:                   END DO
 1180:                   AA = DBLE( A( L ) )
 1181: *                 U(n-1,n-1)
 1182:                   IF( AA.NE.ZERO ) THEN
 1183:                      IF( SCALE.LT.AA ) THEN
 1184:                         S = ONE + S*( SCALE / AA )**2
 1185:                         SCALE = AA
 1186:                      ELSE
 1187:                         S = S + ( AA / SCALE )**2
 1188:                      END IF
 1189:                   END IF
 1190:                ELSE
 1191: *                 ilu=1 & A is lower
 1192:                   DO J = 0, K - 1
 1193:                      CALL ZLASSQ( N-J-1, A( J+1+J*LDA ), 1, SCALE, S )
 1194: *                    trap L at A(0,0)
 1195:                   END DO
 1196:                   DO J = 1, K - 2
 1197:                      CALL ZLASSQ( J, A( 0+( 1+J )*LDA ), 1, SCALE, S )
 1198: *                    U at A(0,1)
 1199:                   END DO
 1200:                   S = S + S
 1201: *                 double s for the off diagonal elements
 1202:                   AA = DBLE( A( 0 ) )
 1203: *                 L(0,0) at A(0,0)
 1204:                   IF( AA.NE.ZERO ) THEN
 1205:                      IF( SCALE.LT.AA ) THEN
 1206:                         S = ONE + S*( SCALE / AA )**2
 1207:                         SCALE = AA
 1208:                      ELSE
 1209:                         S = S + ( AA / SCALE )**2
 1210:                      END IF
 1211:                   END IF
 1212:                   L = LDA
 1213: *                 -> L(k,k) at A(0,1)
 1214:                   DO I = 1, K - 1
 1215:                      AA = DBLE( A( L ) )
 1216: *                    L(k-1+i,k-1+i)
 1217:                      IF( AA.NE.ZERO ) THEN
 1218:                         IF( SCALE.LT.AA ) THEN
 1219:                            S = ONE + S*( SCALE / AA )**2
 1220:                            SCALE = AA
 1221:                         ELSE
 1222:                            S = S + ( AA / SCALE )**2
 1223:                         END IF
 1224:                      END IF
 1225:                      AA = DBLE( A( L+1 ) )
 1226: *                    L(i,i)
 1227:                      IF( AA.NE.ZERO ) THEN
 1228:                         IF( SCALE.LT.AA ) THEN
 1229:                            S = ONE + S*( SCALE / AA )**2
 1230:                            SCALE = AA
 1231:                         ELSE
 1232:                            S = S + ( AA / SCALE )**2
 1233:                         END IF
 1234:                      END IF
 1235:                      L = L + LDA + 1
 1236:                   END DO
 1237:                END IF
 1238:             ELSE
 1239: *              A is xpose & A is k by n
 1240:                IF( ILU.EQ.0 ) THEN
 1241: *                 A**H is upper
 1242:                   DO J = 1, K - 2
 1243:                      CALL ZLASSQ( J, A( 0+( K+J )*LDA ), 1, SCALE, S )
 1244: *                    U at A(0,k)
 1245:                   END DO
 1246:                   DO J = 0, K - 2
 1247:                      CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
 1248: *                    k by k-1 rect. at A(0,0)
 1249:                   END DO
 1250:                   DO J = 0, K - 2
 1251:                      CALL ZLASSQ( K-J-1, A( J+1+( J+K-1 )*LDA ), 1,
 1252:      $                            SCALE, S )
 1253: *                    L at A(0,k-1)
 1254:                   END DO
 1255:                   S = S + S
 1256: *                 double s for the off diagonal elements
 1257:                   L = 0 + K*LDA - LDA
 1258: *                 -> U(k-1,k-1) at A(0,k-1)
 1259:                   AA = DBLE( A( L ) )
 1260: *                 U(k-1,k-1)
 1261:                   IF( AA.NE.ZERO ) THEN
 1262:                      IF( SCALE.LT.AA ) THEN
 1263:                         S = ONE + S*( SCALE / AA )**2
 1264:                         SCALE = AA
 1265:                      ELSE
 1266:                         S = S + ( AA / SCALE )**2
 1267:                      END IF
 1268:                   END IF
 1269:                   L = L + LDA
 1270: *                 -> U(0,0) at A(0,k)
 1271:                   DO J = K, N - 1
 1272:                      AA = DBLE( A( L ) )
 1273: *                    -> U(j-k,j-k)
 1274:                      IF( AA.NE.ZERO ) THEN
 1275:                         IF( SCALE.LT.AA ) THEN
 1276:                            S = ONE + S*( SCALE / AA )**2
 1277:                            SCALE = AA
 1278:                         ELSE
 1279:                            S = S + ( AA / SCALE )**2
 1280:                         END IF
 1281:                      END IF
 1282:                      AA = DBLE( A( L+1 ) )
 1283: *                    -> U(j,j)
 1284:                      IF( AA.NE.ZERO ) THEN
 1285:                         IF( SCALE.LT.AA ) THEN
 1286:                            S = ONE + S*( SCALE / AA )**2
 1287:                            SCALE = AA
 1288:                         ELSE
 1289:                            S = S + ( AA / SCALE )**2
 1290:                         END IF
 1291:                      END IF
 1292:                      L = L + LDA + 1
 1293:                   END DO
 1294:                ELSE
 1295: *                 A**H is lower
 1296:                   DO J = 1, K - 1
 1297:                      CALL ZLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
 1298: *                    U at A(0,0)
 1299:                   END DO
 1300:                   DO J = K, N - 1
 1301:                      CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
 1302: *                    k by k-1 rect. at A(0,k)
 1303:                   END DO
 1304:                   DO J = 0, K - 3
 1305:                      CALL ZLASSQ( K-J-2, A( J+2+J*LDA ), 1, SCALE, S )
 1306: *                    L at A(1,0)
 1307:                   END DO
 1308:                   S = S + S
 1309: *                 double s for the off diagonal elements
 1310:                   L = 0
 1311: *                 -> L(0,0) at A(0,0)
 1312:                   DO I = 0, K - 2
 1313:                      AA = DBLE( A( L ) )
 1314: *                    L(i,i)
 1315:                      IF( AA.NE.ZERO ) THEN
 1316:                         IF( SCALE.LT.AA ) THEN
 1317:                            S = ONE + S*( SCALE / AA )**2
 1318:                            SCALE = AA
 1319:                         ELSE
 1320:                            S = S + ( AA / SCALE )**2
 1321:                         END IF
 1322:                      END IF
 1323:                      AA = DBLE( A( L+1 ) )
 1324: *                    L(k+i,k+i)
 1325:                      IF( AA.NE.ZERO ) THEN
 1326:                         IF( SCALE.LT.AA ) THEN
 1327:                            S = ONE + S*( SCALE / AA )**2
 1328:                            SCALE = AA
 1329:                         ELSE
 1330:                            S = S + ( AA / SCALE )**2
 1331:                         END IF
 1332:                      END IF
 1333:                      L = L + LDA + 1
 1334:                   END DO
 1335: *                 L-> k-1 + (k-1)*lda or L(k-1,k-1) at A(k-1,k-1)
 1336:                   AA = DBLE( A( L ) )
 1337: *                 L(k-1,k-1) at A(k-1,k-1)
 1338:                   IF( AA.NE.ZERO ) THEN
 1339:                      IF( SCALE.LT.AA ) THEN
 1340:                         S = ONE + S*( SCALE / AA )**2
 1341:                         SCALE = AA
 1342:                      ELSE
 1343:                         S = S + ( AA / SCALE )**2
 1344:                      END IF
 1345:                   END IF
 1346:                END IF
 1347:             END IF
 1348:          ELSE
 1349: *           n is even
 1350:             IF( IFM.EQ.1 ) THEN
 1351: *              A is normal
 1352:                IF( ILU.EQ.0 ) THEN
 1353: *                 A is upper
 1354:                   DO J = 0, K - 2
 1355:                      CALL ZLASSQ( K-J-1, A( K+J+2+J*LDA ), 1, SCALE, S )
 1356: *                 L at A(k+1,0)
 1357:                   END DO
 1358:                   DO J = 0, K - 1
 1359:                      CALL ZLASSQ( K+J, A( 0+J*LDA ), 1, SCALE, S )
 1360: *                 trap U at A(0,0)
 1361:                   END DO
 1362:                   S = S + S
 1363: *                 double s for the off diagonal elements
 1364:                   L = K
 1365: *                 -> U(k,k) at A(k,0)
 1366:                   DO I = 0, K - 1
 1367:                      AA = DBLE( A( L ) )
 1368: *                    U(k+i,k+i)
 1369:                      IF( AA.NE.ZERO ) THEN
 1370:                         IF( SCALE.LT.AA ) THEN
 1371:                            S = ONE + S*( SCALE / AA )**2
 1372:                            SCALE = AA
 1373:                         ELSE
 1374:                            S = S + ( AA / SCALE )**2
 1375:                         END IF
 1376:                      END IF
 1377:                      AA = DBLE( A( L+1 ) )
 1378: *                    U(i,i)
 1379:                      IF( AA.NE.ZERO ) THEN
 1380:                         IF( SCALE.LT.AA ) THEN
 1381:                            S = ONE + S*( SCALE / AA )**2
 1382:                            SCALE = AA
 1383:                         ELSE
 1384:                            S = S + ( AA / SCALE )**2
 1385:                         END IF
 1386:                      END IF
 1387:                      L = L + LDA + 1
 1388:                   END DO
 1389:                ELSE
 1390: *                 ilu=1 & A is lower
 1391:                   DO J = 0, K - 1
 1392:                      CALL ZLASSQ( N-J-1, A( J+2+J*LDA ), 1, SCALE, S )
 1393: *                    trap L at A(1,0)
 1394:                   END DO
 1395:                   DO J = 1, K - 1
 1396:                      CALL ZLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
 1397: *                    U at A(0,0)
 1398:                   END DO
 1399:                   S = S + S
 1400: *                 double s for the off diagonal elements
 1401:                   L = 0
 1402: *                 -> L(k,k) at A(0,0)
 1403:                   DO I = 0, K - 1
 1404:                      AA = DBLE( A( L ) )
 1405: *                    L(k-1+i,k-1+i)
 1406:                      IF( AA.NE.ZERO ) THEN
 1407:                         IF( SCALE.LT.AA ) THEN
 1408:                            S = ONE + S*( SCALE / AA )**2
 1409:                            SCALE = AA
 1410:                         ELSE
 1411:                            S = S + ( AA / SCALE )**2
 1412:                         END IF
 1413:                      END IF
 1414:                      AA = DBLE( A( L+1 ) )
 1415: *                    L(i,i)
 1416:                      IF( AA.NE.ZERO ) THEN
 1417:                         IF( SCALE.LT.AA ) THEN
 1418:                            S = ONE + S*( SCALE / AA )**2
 1419:                            SCALE = AA
 1420:                         ELSE
 1421:                            S = S + ( AA / SCALE )**2
 1422:                         END IF
 1423:                      END IF
 1424:                      L = L + LDA + 1
 1425:                   END DO
 1426:                END IF
 1427:             ELSE
 1428: *              A is xpose
 1429:                IF( ILU.EQ.0 ) THEN
 1430: *                 A**H is upper
 1431:                   DO J = 1, K - 1
 1432:                      CALL ZLASSQ( J, A( 0+( K+1+J )*LDA ), 1, SCALE, S )
 1433: *                 U at A(0,k+1)
 1434:                   END DO
 1435:                   DO J = 0, K - 1
 1436:                      CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
 1437: *                 k by k rect. at A(0,0)
 1438:                   END DO
 1439:                   DO J = 0, K - 2
 1440:                      CALL ZLASSQ( K-J-1, A( J+1+( J+K )*LDA ), 1, SCALE,
 1441:      $                            S )
 1442: *                 L at A(0,k)
 1443:                   END DO
 1444:                   S = S + S
 1445: *                 double s for the off diagonal elements
 1446:                   L = 0 + K*LDA
 1447: *                 -> U(k,k) at A(0,k)
 1448:                   AA = DBLE( A( L ) )
 1449: *                 U(k,k)
 1450:                   IF( AA.NE.ZERO ) THEN
 1451:                      IF( SCALE.LT.AA ) THEN
 1452:                         S = ONE + S*( SCALE / AA )**2
 1453:                         SCALE = AA
 1454:                      ELSE
 1455:                         S = S + ( AA / SCALE )**2
 1456:                      END IF
 1457:                   END IF
 1458:                   L = L + LDA
 1459: *                 -> U(0,0) at A(0,k+1)
 1460:                   DO J = K + 1, N - 1
 1461:                      AA = DBLE( A( L ) )
 1462: *                    -> U(j-k-1,j-k-1)
 1463:                      IF( AA.NE.ZERO ) THEN
 1464:                         IF( SCALE.LT.AA ) THEN
 1465:                            S = ONE + S*( SCALE / AA )**2
 1466:                            SCALE = AA
 1467:                         ELSE
 1468:                            S = S + ( AA / SCALE )**2
 1469:                         END IF
 1470:                      END IF
 1471:                      AA = DBLE( A( L+1 ) )
 1472: *                    -> U(j,j)
 1473:                      IF( AA.NE.ZERO ) THEN
 1474:                         IF( SCALE.LT.AA ) THEN
 1475:                            S = ONE + S*( SCALE / AA )**2
 1476:                            SCALE = AA
 1477:                         ELSE
 1478:                            S = S + ( AA / SCALE )**2
 1479:                         END IF
 1480:                      END IF
 1481:                      L = L + LDA + 1
 1482:                   END DO
 1483: *                 L=k-1+n*lda
 1484: *                 -> U(k-1,k-1) at A(k-1,n)
 1485:                   AA = DBLE( A( L ) )
 1486: *                 U(k,k)
 1487:                   IF( AA.NE.ZERO ) THEN
 1488:                      IF( SCALE.LT.AA ) THEN
 1489:                         S = ONE + S*( SCALE / AA )**2
 1490:                         SCALE = AA
 1491:                      ELSE
 1492:                         S = S + ( AA / SCALE )**2
 1493:                      END IF
 1494:                   END IF
 1495:                ELSE
 1496: *                 A**H is lower
 1497:                   DO J = 1, K - 1
 1498:                      CALL ZLASSQ( J, A( 0+( J+1 )*LDA ), 1, SCALE, S )
 1499: *                 U at A(0,1)
 1500:                   END DO
 1501:                   DO J = K + 1, N
 1502:                      CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
 1503: *                 k by k rect. at A(0,k+1)
 1504:                   END DO
 1505:                   DO J = 0, K - 2
 1506:                      CALL ZLASSQ( K-J-1, A( J+1+J*LDA ), 1, SCALE, S )
 1507: *                 L at A(0,0)
 1508:                   END DO
 1509:                   S = S + S
 1510: *                 double s for the off diagonal elements
 1511:                   L = 0
 1512: *                 -> L(k,k) at A(0,0)
 1513:                   AA = DBLE( A( L ) )
 1514: *                 L(k,k) at A(0,0)
 1515:                   IF( AA.NE.ZERO ) THEN
 1516:                      IF( SCALE.LT.AA ) THEN
 1517:                         S = ONE + S*( SCALE / AA )**2
 1518:                         SCALE = AA
 1519:                      ELSE
 1520:                         S = S + ( AA / SCALE )**2
 1521:                      END IF
 1522:                   END IF
 1523:                   L = LDA
 1524: *                 -> L(0,0) at A(0,1)
 1525:                   DO I = 0, K - 2
 1526:                      AA = DBLE( A( L ) )
 1527: *                    L(i,i)
 1528:                      IF( AA.NE.ZERO ) THEN
 1529:                         IF( SCALE.LT.AA ) THEN
 1530:                            S = ONE + S*( SCALE / AA )**2
 1531:                            SCALE = AA
 1532:                         ELSE
 1533:                            S = S + ( AA / SCALE )**2
 1534:                         END IF
 1535:                      END IF
 1536:                      AA = DBLE( A( L+1 ) )
 1537: *                    L(k+i+1,k+i+1)
 1538:                      IF( AA.NE.ZERO ) THEN
 1539:                         IF( SCALE.LT.AA ) THEN
 1540:                            S = ONE + S*( SCALE / AA )**2
 1541:                            SCALE = AA
 1542:                         ELSE
 1543:                            S = S + ( AA / SCALE )**2
 1544:                         END IF
 1545:                      END IF
 1546:                      L = L + LDA + 1
 1547:                   END DO
 1548: *                 L-> k - 1 + k*lda or L(k-1,k-1) at A(k-1,k)
 1549:                   AA = DBLE( A( L ) )
 1550: *                 L(k-1,k-1) at A(k-1,k)
 1551:                   IF( AA.NE.ZERO ) THEN
 1552:                      IF( SCALE.LT.AA ) THEN
 1553:                         S = ONE + S*( SCALE / AA )**2
 1554:                         SCALE = AA
 1555:                      ELSE
 1556:                         S = S + ( AA / SCALE )**2
 1557:                      END IF
 1558:                   END IF
 1559:                END IF
 1560:             END IF
 1561:          END IF
 1562:          VALUE = SCALE*SQRT( S )
 1563:       END IF
 1564: *
 1565:       ZLANHF = VALUE
 1566:       RETURN
 1567: *
 1568: *     End of ZLANHF
 1569: *
 1570:       END

CVSweb interface <joel.bertrand@systella.fr>