1       DOUBLE PRECISION FUNCTION DLANSF( NORM, TRANSR, UPLO, N, A, WORK )
  2 *
  3 *  -- LAPACK routine (version 3.3.1)                                    --
  4 *
  5 *  -- Contributed by Fred Gustavson of the IBM Watson Research Center --
  6 *  -- April 2011                                                      --
  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*1
 48 *          Specifies the value to be returned in DLANSF as described
 49 *          above.
 50 *
 51 *  TRANSR  (input) CHARACTER*1
 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*1
 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          ABSMAXSQRT
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       IFMOD( 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 = MAXVALUEABS( 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 = MAXVALUEABS( 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 = MAXVALUEABS( 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 = MAXVALUEABS( 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 - 10-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 - 10-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 ), 1SCALE, 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 ), 1SCALE, 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+1SCALE, S )
704 *                 tri L at A(k,0)
705                   CALL DLASSQ( K, A( K-1 ), LDA+1SCALE, 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 ), 1SCALE, 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 ), 1SCALE, 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+1SCALE, S )
720 *                 tri L at A(0,0)
721                   CALL DLASSQ( K-1, A( 0+LDA ), LDA+1SCALE, 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**T is upper
728                   DO J = 1, K - 2
729                      CALL DLASSQ( J, A( 0+( K+J )*LDA ), 1SCALE, S )
730 *                    U at A(0,k)
731                   END DO
732                   DO J = 0, K - 2
733                      CALL DLASSQ( K, A( 0+J*LDA ), 1SCALE, 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+1SCALE, S )
744 *                 tri U at A(0,k)
745                   CALL DLASSQ( K, A( 0+( K-1 )*LDA ), LDA+1SCALE, S )
746 *                 tri L at A(0,k-1)
747                ELSE
748 *                 A**T is lower
749                   DO J = 1, K - 1
750                      CALL DLASSQ( J, A( 0+J*LDA ), 1SCALE, S )
751 *                    U at A(0,0)
752                   END DO
753                   DO J = K, N - 1
754                      CALL DLASSQ( K, A( 0+J*LDA ), 1SCALE, 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 ), 1SCALE, 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+1SCALE, S )
764 *                 tri U at A(0,0)
765                   CALL DLASSQ( K-1, A( 1 ), LDA+1SCALE, 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 ), 1SCALE, 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 ), 1SCALE, 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+1SCALE, S )
786 *                 tri L at A(k+1,0)
787                   CALL DLASSQ( K, A( K ), LDA+1SCALE, 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 ), 1SCALE, 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 ), 1SCALE, 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+1SCALE, S )
802 *                 tri L at A(1,0)
803                   CALL DLASSQ( K, A( 0 ), LDA+1SCALE, 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**T is upper
810                   DO J = 1, K - 1
811                      CALL DLASSQ( J, A( 0+( K+1+J )*LDA ), 1SCALE, 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 ), 1SCALE, 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 ), 1SCALE,
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+1SCALE, S )
826 *                 tri U at A(0,k+1)
827                   CALL DLASSQ( K, A( 0+K*LDA ), LDA+1SCALE, S )
828 *                 tri L at A(0,k)
829                ELSE
830 *                 A**T is lower
831                   DO J = 1, K - 1
832                      CALL DLASSQ( J, A( 0+( J+1 )*LDA ), 1SCALE, S )
833 *                    U at A(0,1)
834                   END DO
835                   DO J = K + 1, N
836                      CALL DLASSQ( K, A( 0+J*LDA ), 1SCALE, 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 ), 1SCALE, 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+1SCALE, S )
846 *                 tri L at A(0,1)
847                   CALL DLASSQ( K, A( 0 ), LDA+1SCALE, 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