LAPACK  3.4.0
LAPACK: Linear Algebra PACKage
slansf.f
Go to the documentation of this file.
00001 *> \brief \b SLANSF
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *> \htmlonly
00009 *> Download SLANSF + dependencies 
00010 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slansf.f"> 
00011 *> [TGZ]</a> 
00012 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slansf.f"> 
00013 *> [ZIP]</a> 
00014 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slansf.f"> 
00015 *> [TXT]</a>
00016 *> \endhtmlonly 
00017 *
00018 *  Definition:
00019 *  ===========
00020 *
00021 *       REAL FUNCTION SLANSF( NORM, TRANSR, UPLO, N, A, WORK )
00022 * 
00023 *       .. Scalar Arguments ..
00024 *       CHARACTER          NORM, TRANSR, UPLO
00025 *       INTEGER            N
00026 *       ..
00027 *       .. Array Arguments ..
00028 *       REAL               A( 0: * ), WORK( 0: * )
00029 *       ..
00030 *  
00031 *
00032 *> \par Purpose:
00033 *  =============
00034 *>
00035 *> \verbatim
00036 *>
00037 *> SLANSF returns the value of the one norm, or the Frobenius norm, or
00038 *> the infinity norm, or the element of largest absolute value of a
00039 *> real symmetric matrix A in RFP format.
00040 *> \endverbatim
00041 *>
00042 *> \return SLANSF
00043 *> \verbatim
00044 *>
00045 *>    SLANSF = ( max(abs(A(i,j))), NORM = 'M' or 'm'
00046 *>             (
00047 *>             ( norm1(A),         NORM = '1', 'O' or 'o'
00048 *>             (
00049 *>             ( normI(A),         NORM = 'I' or 'i'
00050 *>             (
00051 *>             ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
00052 *>
00053 *> where  norm1  denotes the  one norm of a matrix (maximum column sum),
00054 *> normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
00055 *> normF  denotes the  Frobenius norm of a matrix (square root of sum of
00056 *> squares).  Note that  max(abs(A(i,j)))  is not a  matrix norm.
00057 *> \endverbatim
00058 *
00059 *  Arguments:
00060 *  ==========
00061 *
00062 *> \param[in] NORM
00063 *> \verbatim
00064 *>          NORM is CHARACTER*1
00065 *>          Specifies the value to be returned in SLANSF as described
00066 *>          above.
00067 *> \endverbatim
00068 *>
00069 *> \param[in] TRANSR
00070 *> \verbatim
00071 *>          TRANSR is CHARACTER*1
00072 *>          Specifies whether the RFP format of A is normal or
00073 *>          transposed format.
00074 *>          = 'N':  RFP format is Normal;
00075 *>          = 'T':  RFP format is Transpose.
00076 *> \endverbatim
00077 *>
00078 *> \param[in] UPLO
00079 *> \verbatim
00080 *>          UPLO is CHARACTER*1
00081 *>           On entry, UPLO specifies whether the RFP matrix A came from
00082 *>           an upper or lower triangular matrix as follows:
00083 *>           = 'U': RFP A came from an upper triangular matrix;
00084 *>           = 'L': RFP A came from a lower triangular matrix.
00085 *> \endverbatim
00086 *>
00087 *> \param[in] N
00088 *> \verbatim
00089 *>          N is INTEGER
00090 *>          The order of the matrix A. N >= 0. When N = 0, SLANSF is
00091 *>          set to zero.
00092 *> \endverbatim
00093 *>
00094 *> \param[in] A
00095 *> \verbatim
00096 *>          A is REAL array, dimension ( N*(N+1)/2 );
00097 *>          On entry, the upper (if UPLO = 'U') or lower (if UPLO = 'L')
00098 *>          part of the symmetric matrix A stored in RFP format. See the
00099 *>          "Notes" below for more details.
00100 *>          Unchanged on exit.
00101 *> \endverbatim
00102 *>
00103 *> \param[out] WORK
00104 *> \verbatim
00105 *>          WORK is REAL array, dimension (MAX(1,LWORK)),
00106 *>          where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
00107 *>          WORK is not referenced.
00108 *> \endverbatim
00109 *
00110 *  Authors:
00111 *  ========
00112 *
00113 *> \author Univ. of Tennessee 
00114 *> \author Univ. of California Berkeley 
00115 *> \author Univ. of Colorado Denver 
00116 *> \author NAG Ltd. 
00117 *
00118 *> \date November 2011
00119 *
00120 *> \ingroup realOTHERcomputational
00121 *
00122 *> \par Further Details:
00123 *  =====================
00124 *>
00125 *> \verbatim
00126 *>
00127 *>  We first consider Rectangular Full Packed (RFP) Format when N is
00128 *>  even. We give an example where N = 6.
00129 *>
00130 *>      AP is Upper             AP is Lower
00131 *>
00132 *>   00 01 02 03 04 05       00
00133 *>      11 12 13 14 15       10 11
00134 *>         22 23 24 25       20 21 22
00135 *>            33 34 35       30 31 32 33
00136 *>               44 45       40 41 42 43 44
00137 *>                  55       50 51 52 53 54 55
00138 *>
00139 *>
00140 *>  Let TRANSR = 'N'. RFP holds AP as follows:
00141 *>  For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
00142 *>  three columns of AP upper. The lower triangle A(4:6,0:2) consists of
00143 *>  the transpose of the first three columns of AP upper.
00144 *>  For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
00145 *>  three columns of AP lower. The upper triangle A(0:2,0:2) consists of
00146 *>  the transpose of the last three columns of AP lower.
00147 *>  This covers the case N even and TRANSR = 'N'.
00148 *>
00149 *>         RFP A                   RFP A
00150 *>
00151 *>        03 04 05                33 43 53
00152 *>        13 14 15                00 44 54
00153 *>        23 24 25                10 11 55
00154 *>        33 34 35                20 21 22
00155 *>        00 44 45                30 31 32
00156 *>        01 11 55                40 41 42
00157 *>        02 12 22                50 51 52
00158 *>
00159 *>  Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
00160 *>  transpose of RFP A above. One therefore gets:
00161 *>
00162 *>
00163 *>           RFP A                   RFP A
00164 *>
00165 *>     03 13 23 33 00 01 02    33 00 10 20 30 40 50
00166 *>     04 14 24 34 44 11 12    43 44 11 21 31 41 51
00167 *>     05 15 25 35 45 55 22    53 54 55 22 32 42 52
00168 *>
00169 *>
00170 *>  We then consider Rectangular Full Packed (RFP) Format when N is
00171 *>  odd. We give an example where N = 5.
00172 *>
00173 *>     AP is Upper                 AP is Lower
00174 *>
00175 *>   00 01 02 03 04              00
00176 *>      11 12 13 14              10 11
00177 *>         22 23 24              20 21 22
00178 *>            33 34              30 31 32 33
00179 *>               44              40 41 42 43 44
00180 *>
00181 *>
00182 *>  Let TRANSR = 'N'. RFP holds AP as follows:
00183 *>  For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
00184 *>  three columns of AP upper. The lower triangle A(3:4,0:1) consists of
00185 *>  the transpose of the first two columns of AP upper.
00186 *>  For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
00187 *>  three columns of AP lower. The upper triangle A(0:1,1:2) consists of
00188 *>  the transpose of the last two columns of AP lower.
00189 *>  This covers the case N odd and TRANSR = 'N'.
00190 *>
00191 *>         RFP A                   RFP A
00192 *>
00193 *>        02 03 04                00 33 43
00194 *>        12 13 14                10 11 44
00195 *>        22 23 24                20 21 22
00196 *>        00 33 34                30 31 32
00197 *>        01 11 44                40 41 42
00198 *>
00199 *>  Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
00200 *>  transpose of RFP A above. One therefore gets:
00201 *>
00202 *>           RFP A                   RFP A
00203 *>
00204 *>     02 12 22 00 01             00 10 20 30 40 50
00205 *>     03 13 23 33 11             33 11 21 31 41 51
00206 *>     04 14 24 34 44             43 44 22 32 42 52
00207 *> \endverbatim
00208 *
00209 *  =====================================================================
00210       REAL FUNCTION SLANSF( NORM, TRANSR, UPLO, N, A, WORK )
00211 *
00212 *  -- LAPACK computational routine (version 3.4.0) --
00213 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00214 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00215 *     November 2011
00216 *
00217 *     .. Scalar Arguments ..
00218       CHARACTER          NORM, TRANSR, UPLO
00219       INTEGER            N
00220 *     ..
00221 *     .. Array Arguments ..
00222       REAL               A( 0: * ), WORK( 0: * )
00223 *     ..
00224 *
00225 *  =====================================================================
00226 *
00227 *     ..
00228 *     .. Parameters ..
00229       REAL               ONE, ZERO
00230       PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
00231 *     ..
00232 *     .. Local Scalars ..
00233       INTEGER            I, J, IFM, ILU, NOE, N1, K, L, LDA
00234       REAL               SCALE, S, VALUE, AA
00235 *     ..
00236 *     .. External Functions ..
00237       LOGICAL            LSAME
00238       INTEGER            ISAMAX
00239       EXTERNAL           LSAME, ISAMAX
00240 *     ..
00241 *     .. External Subroutines ..
00242       EXTERNAL           SLASSQ
00243 *     ..
00244 *     .. Intrinsic Functions ..
00245       INTRINSIC          ABS, MAX, SQRT
00246 *     ..
00247 *     .. Executable Statements ..
00248 *
00249       IF( N.EQ.0 ) THEN
00250          SLANSF = ZERO
00251          RETURN
00252       END IF
00253 *
00254 *     set noe = 1 if n is odd. if n is even set noe=0
00255 *
00256       NOE = 1
00257       IF( MOD( N, 2 ).EQ.0 )
00258      $   NOE = 0
00259 *
00260 *     set ifm = 0 when form='T or 't' and 1 otherwise
00261 *
00262       IFM = 1
00263       IF( LSAME( TRANSR, 'T' ) )
00264      $   IFM = 0
00265 *
00266 *     set ilu = 0 when uplo='U or 'u' and 1 otherwise
00267 *
00268       ILU = 1
00269       IF( LSAME( UPLO, 'U' ) )
00270      $   ILU = 0
00271 *
00272 *     set lda = (n+1)/2 when ifm = 0
00273 *     set lda = n when ifm = 1 and noe = 1
00274 *     set lda = n+1 when ifm = 1 and noe = 0
00275 *
00276       IF( IFM.EQ.1 ) THEN
00277          IF( NOE.EQ.1 ) THEN
00278             LDA = N
00279          ELSE
00280 *           noe=0
00281             LDA = N + 1
00282          END IF
00283       ELSE
00284 *        ifm=0
00285          LDA = ( N+1 ) / 2
00286       END IF
00287 *
00288       IF( LSAME( NORM, 'M' ) ) THEN
00289 *
00290 *       Find max(abs(A(i,j))).
00291 *
00292          K = ( N+1 ) / 2
00293          VALUE = ZERO
00294          IF( NOE.EQ.1 ) THEN
00295 *           n is odd
00296             IF( IFM.EQ.1 ) THEN
00297 *           A is n by k
00298                DO J = 0, K - 1
00299                   DO I = 0, N - 1
00300                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00301                   END DO
00302                END DO
00303             ELSE
00304 *              xpose case; A is k by n
00305                DO J = 0, N - 1
00306                   DO I = 0, K - 1
00307                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00308                   END DO
00309                END DO
00310             END IF
00311          ELSE
00312 *           n is even
00313             IF( IFM.EQ.1 ) THEN
00314 *              A is n+1 by k
00315                DO J = 0, K - 1
00316                   DO I = 0, N
00317                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00318                   END DO
00319                END DO
00320             ELSE
00321 *              xpose case; A is k by n+1
00322                DO J = 0, N
00323                   DO I = 0, K - 1
00324                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00325                   END DO
00326                END DO
00327             END IF
00328          END IF
00329       ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
00330      $         ( NORM.EQ.'1' ) ) THEN
00331 *
00332 *        Find normI(A) ( = norm1(A), since A is symmetric).
00333 *
00334          IF( IFM.EQ.1 ) THEN
00335             K = N / 2
00336             IF( NOE.EQ.1 ) THEN
00337 *              n is odd
00338                IF( ILU.EQ.0 ) THEN
00339                   DO I = 0, K - 1
00340                      WORK( I ) = ZERO
00341                   END DO
00342                   DO J = 0, K
00343                      S = ZERO
00344                      DO I = 0, K + J - 1
00345                         AA = ABS( A( I+J*LDA ) )
00346 *                       -> A(i,j+k)
00347                         S = S + AA
00348                         WORK( I ) = WORK( I ) + AA
00349                      END DO
00350                      AA = ABS( A( I+J*LDA ) )
00351 *                    -> A(j+k,j+k)
00352                      WORK( J+K ) = S + AA
00353                      IF( I.EQ.K+K )
00354      $                  GO TO 10
00355                      I = I + 1
00356                      AA = ABS( A( I+J*LDA ) )
00357 *                    -> A(j,j)
00358                      WORK( J ) = WORK( J ) + AA
00359                      S = ZERO
00360                      DO L = J + 1, K - 1
00361                         I = I + 1
00362                         AA = ABS( A( I+J*LDA ) )
00363 *                       -> A(l,j)
00364                         S = S + AA
00365                         WORK( L ) = WORK( L ) + AA
00366                      END DO
00367                      WORK( J ) = WORK( J ) + S
00368                   END DO
00369    10             CONTINUE
00370                   I = ISAMAX( N, WORK, 1 )
00371                   VALUE = WORK( I-1 )
00372                ELSE
00373 *                 ilu = 1
00374                   K = K + 1
00375 *                 k=(n+1)/2 for n odd and ilu=1
00376                   DO I = K, N - 1
00377                      WORK( I ) = ZERO
00378                   END DO
00379                   DO J = K - 1, 0, -1
00380                      S = ZERO
00381                      DO I = 0, J - 2
00382                         AA = ABS( A( I+J*LDA ) )
00383 *                       -> A(j+k,i+k)
00384                         S = S + AA
00385                         WORK( I+K ) = WORK( I+K ) + AA
00386                      END DO
00387                      IF( J.GT.0 ) THEN
00388                         AA = ABS( A( I+J*LDA ) )
00389 *                       -> A(j+k,j+k)
00390                         S = S + AA
00391                         WORK( I+K ) = WORK( I+K ) + S
00392 *                       i=j
00393                         I = I + 1
00394                      END IF
00395                      AA = ABS( A( I+J*LDA ) )
00396 *                    -> A(j,j)
00397                      WORK( J ) = AA
00398                      S = ZERO
00399                      DO L = J + 1, N - 1
00400                         I = I + 1
00401                         AA = ABS( A( I+J*LDA ) )
00402 *                       -> A(l,j)
00403                         S = S + AA
00404                         WORK( L ) = WORK( L ) + AA
00405                      END DO
00406                      WORK( J ) = WORK( J ) + S
00407                   END DO
00408                   I = ISAMAX( N, WORK, 1 )
00409                   VALUE = WORK( I-1 )
00410                END IF
00411             ELSE
00412 *              n is even
00413                IF( ILU.EQ.0 ) THEN
00414                   DO I = 0, K - 1
00415                      WORK( I ) = ZERO
00416                   END DO
00417                   DO J = 0, K - 1
00418                      S = ZERO
00419                      DO I = 0, K + J - 1
00420                         AA = ABS( A( I+J*LDA ) )
00421 *                       -> A(i,j+k)
00422                         S = S + AA
00423                         WORK( I ) = WORK( I ) + AA
00424                      END DO
00425                      AA = ABS( A( I+J*LDA ) )
00426 *                    -> A(j+k,j+k)
00427                      WORK( J+K ) = S + AA
00428                      I = I + 1
00429                      AA = ABS( A( I+J*LDA ) )
00430 *                    -> A(j,j)
00431                      WORK( J ) = WORK( J ) + AA
00432                      S = ZERO
00433                      DO L = J + 1, K - 1
00434                         I = I + 1
00435                         AA = ABS( A( I+J*LDA ) )
00436 *                       -> A(l,j)
00437                         S = S + AA
00438                         WORK( L ) = WORK( L ) + AA
00439                      END DO
00440                      WORK( J ) = WORK( J ) + S
00441                   END DO
00442                   I = ISAMAX( N, WORK, 1 )
00443                   VALUE = WORK( I-1 )
00444                ELSE
00445 *                 ilu = 1
00446                   DO I = K, N - 1
00447                      WORK( I ) = ZERO
00448                   END DO
00449                   DO J = K - 1, 0, -1
00450                      S = ZERO
00451                      DO I = 0, J - 1
00452                         AA = ABS( A( I+J*LDA ) )
00453 *                       -> A(j+k,i+k)
00454                         S = S + AA
00455                         WORK( I+K ) = WORK( I+K ) + AA
00456                      END DO
00457                      AA = ABS( A( I+J*LDA ) )
00458 *                    -> A(j+k,j+k)
00459                      S = S + AA
00460                      WORK( I+K ) = WORK( I+K ) + S
00461 *                    i=j
00462                      I = I + 1
00463                      AA = ABS( A( I+J*LDA ) )
00464 *                    -> A(j,j)
00465                      WORK( J ) = AA
00466                      S = ZERO
00467                      DO L = J + 1, N - 1
00468                         I = I + 1
00469                         AA = ABS( A( I+J*LDA ) )
00470 *                       -> A(l,j)
00471                         S = S + AA
00472                         WORK( L ) = WORK( L ) + AA
00473                      END DO
00474                      WORK( J ) = WORK( J ) + S
00475                   END DO
00476                   I = ISAMAX( N, WORK, 1 )
00477                   VALUE = WORK( I-1 )
00478                END IF
00479             END IF
00480          ELSE
00481 *           ifm=0
00482             K = N / 2
00483             IF( NOE.EQ.1 ) THEN
00484 *              n is odd
00485                IF( ILU.EQ.0 ) THEN
00486                   N1 = K
00487 *                 n/2
00488                   K = K + 1
00489 *                 k is the row size and lda
00490                   DO I = N1, N - 1
00491                      WORK( I ) = ZERO
00492                   END DO
00493                   DO J = 0, N1 - 1
00494                      S = ZERO
00495                      DO I = 0, K - 1
00496                         AA = ABS( A( I+J*LDA ) )
00497 *                       A(j,n1+i)
00498                         WORK( I+N1 ) = WORK( I+N1 ) + AA
00499                         S = S + AA
00500                      END DO
00501                      WORK( J ) = S
00502                   END DO
00503 *                 j=n1=k-1 is special
00504                   S = ABS( A( 0+J*LDA ) )
00505 *                 A(k-1,k-1)
00506                   DO I = 1, K - 1
00507                      AA = ABS( A( I+J*LDA ) )
00508 *                    A(k-1,i+n1)
00509                      WORK( I+N1 ) = WORK( I+N1 ) + AA
00510                      S = S + AA
00511                   END DO
00512                   WORK( J ) = WORK( J ) + S
00513                   DO J = K, N - 1
00514                      S = ZERO
00515                      DO I = 0, J - K - 1
00516                         AA = ABS( A( I+J*LDA ) )
00517 *                       A(i,j-k)
00518                         WORK( I ) = WORK( I ) + AA
00519                         S = S + AA
00520                      END DO
00521 *                    i=j-k
00522                      AA = ABS( A( I+J*LDA ) )
00523 *                    A(j-k,j-k)
00524                      S = S + AA
00525                      WORK( J-K ) = WORK( J-K ) + S
00526                      I = I + 1
00527                      S = ABS( A( I+J*LDA ) )
00528 *                    A(j,j)
00529                      DO L = J + 1, N - 1
00530                         I = I + 1
00531                         AA = ABS( A( I+J*LDA ) )
00532 *                       A(j,l)
00533                         WORK( L ) = WORK( L ) + AA
00534                         S = S + AA
00535                      END DO
00536                      WORK( J ) = WORK( J ) + S
00537                   END DO
00538                   I = ISAMAX( N, WORK, 1 )
00539                   VALUE = WORK( I-1 )
00540                ELSE
00541 *                 ilu=1
00542                   K = K + 1
00543 *                 k=(n+1)/2 for n odd and ilu=1
00544                   DO I = K, N - 1
00545                      WORK( I ) = ZERO
00546                   END DO
00547                   DO J = 0, K - 2
00548 *                    process
00549                      S = ZERO
00550                      DO I = 0, J - 1
00551                         AA = ABS( A( I+J*LDA ) )
00552 *                       A(j,i)
00553                         WORK( I ) = WORK( I ) + AA
00554                         S = S + AA
00555                      END DO
00556                      AA = ABS( A( I+J*LDA ) )
00557 *                    i=j so process of A(j,j)
00558                      S = S + AA
00559                      WORK( J ) = S
00560 *                    is initialised here
00561                      I = I + 1
00562 *                    i=j process A(j+k,j+k)
00563                      AA = ABS( A( I+J*LDA ) )
00564                      S = AA
00565                      DO L = K + J + 1, N - 1
00566                         I = I + 1
00567                         AA = ABS( A( I+J*LDA ) )
00568 *                       A(l,k+j)
00569                         S = S + AA
00570                         WORK( L ) = WORK( L ) + AA
00571                      END DO
00572                      WORK( K+J ) = WORK( K+J ) + S
00573                   END DO
00574 *                 j=k-1 is special :process col A(k-1,0:k-1)
00575                   S = ZERO
00576                   DO I = 0, K - 2
00577                      AA = ABS( A( I+J*LDA ) )
00578 *                    A(k,i)
00579                      WORK( I ) = WORK( I ) + AA
00580                      S = S + AA
00581                   END DO
00582 *                 i=k-1
00583                   AA = ABS( A( I+J*LDA ) )
00584 *                 A(k-1,k-1)
00585                   S = S + AA
00586                   WORK( I ) = S
00587 *                 done with col j=k+1
00588                   DO J = K, N - 1
00589 *                    process col j of A = A(j,0:k-1)
00590                      S = ZERO
00591                      DO I = 0, K - 1
00592                         AA = ABS( A( I+J*LDA ) )
00593 *                       A(j,i)
00594                         WORK( I ) = WORK( I ) + AA
00595                         S = S + AA
00596                      END DO
00597                      WORK( J ) = WORK( J ) + S
00598                   END DO
00599                   I = ISAMAX( N, WORK, 1 )
00600                   VALUE = WORK( I-1 )
00601                END IF
00602             ELSE
00603 *              n is even
00604                IF( ILU.EQ.0 ) THEN
00605                   DO I = K, N - 1
00606                      WORK( I ) = ZERO
00607                   END DO
00608                   DO J = 0, K - 1
00609                      S = ZERO
00610                      DO I = 0, K - 1
00611                         AA = ABS( A( I+J*LDA ) )
00612 *                       A(j,i+k)
00613                         WORK( I+K ) = WORK( I+K ) + AA
00614                         S = S + AA
00615                      END DO
00616                      WORK( J ) = S
00617                   END DO
00618 *                 j=k
00619                   AA = ABS( A( 0+J*LDA ) )
00620 *                 A(k,k)
00621                   S = AA
00622                   DO I = 1, K - 1
00623                      AA = ABS( A( I+J*LDA ) )
00624 *                    A(k,k+i)
00625                      WORK( I+K ) = WORK( I+K ) + AA
00626                      S = S + AA
00627                   END DO
00628                   WORK( J ) = WORK( J ) + S
00629                   DO J = K + 1, N - 1
00630                      S = ZERO
00631                      DO I = 0, J - 2 - K
00632                         AA = ABS( A( I+J*LDA ) )
00633 *                       A(i,j-k-1)
00634                         WORK( I ) = WORK( I ) + AA
00635                         S = S + AA
00636                      END DO
00637 *                     i=j-1-k
00638                      AA = ABS( A( I+J*LDA ) )
00639 *                    A(j-k-1,j-k-1)
00640                      S = S + AA
00641                      WORK( J-K-1 ) = WORK( J-K-1 ) + S
00642                      I = I + 1
00643                      AA = ABS( A( I+J*LDA ) )
00644 *                    A(j,j)
00645                      S = AA
00646                      DO L = J + 1, N - 1
00647                         I = I + 1
00648                         AA = ABS( A( I+J*LDA ) )
00649 *                       A(j,l)
00650                         WORK( L ) = WORK( L ) + AA
00651                         S = S + AA
00652                      END DO
00653                      WORK( J ) = WORK( J ) + S
00654                   END DO
00655 *                 j=n
00656                   S = ZERO
00657                   DO I = 0, K - 2
00658                      AA = ABS( A( I+J*LDA ) )
00659 *                    A(i,k-1)
00660                      WORK( I ) = WORK( I ) + AA
00661                      S = S + AA
00662                   END DO
00663 *                 i=k-1
00664                   AA = ABS( A( I+J*LDA ) )
00665 *                 A(k-1,k-1)
00666                   S = S + AA
00667                   WORK( I ) = WORK( I ) + S
00668                   I = ISAMAX( N, WORK, 1 )
00669                   VALUE = WORK( I-1 )
00670                ELSE
00671 *                 ilu=1
00672                   DO I = K, N - 1
00673                      WORK( I ) = ZERO
00674                   END DO
00675 *                 j=0 is special :process col A(k:n-1,k)
00676                   S = ABS( A( 0 ) )
00677 *                 A(k,k)
00678                   DO I = 1, K - 1
00679                      AA = ABS( A( I ) )
00680 *                    A(k+i,k)
00681                      WORK( I+K ) = WORK( I+K ) + AA
00682                      S = S + AA
00683                   END DO
00684                   WORK( K ) = WORK( K ) + S
00685                   DO J = 1, K - 1
00686 *                    process
00687                      S = ZERO
00688                      DO I = 0, J - 2
00689                         AA = ABS( A( I+J*LDA ) )
00690 *                       A(j-1,i)
00691                         WORK( I ) = WORK( I ) + AA
00692                         S = S + AA
00693                      END DO
00694                      AA = ABS( A( I+J*LDA ) )
00695 *                    i=j-1 so process of A(j-1,j-1)
00696                      S = S + AA
00697                      WORK( J-1 ) = S
00698 *                    is initialised here
00699                      I = I + 1
00700 *                    i=j process A(j+k,j+k)
00701                      AA = ABS( A( I+J*LDA ) )
00702                      S = AA
00703                      DO L = K + J + 1, N - 1
00704                         I = I + 1
00705                         AA = ABS( A( I+J*LDA ) )
00706 *                       A(l,k+j)
00707                         S = S + AA
00708                         WORK( L ) = WORK( L ) + AA
00709                      END DO
00710                      WORK( K+J ) = WORK( K+J ) + S
00711                   END DO
00712 *                 j=k is special :process col A(k,0:k-1)
00713                   S = ZERO
00714                   DO I = 0, K - 2
00715                      AA = ABS( A( I+J*LDA ) )
00716 *                    A(k,i)
00717                      WORK( I ) = WORK( I ) + AA
00718                      S = S + AA
00719                   END DO
00720 *                 i=k-1
00721                   AA = ABS( A( I+J*LDA ) )
00722 *                 A(k-1,k-1)
00723                   S = S + AA
00724                   WORK( I ) = S
00725 *                 done with col j=k+1
00726                   DO J = K + 1, N
00727 *                    process col j-1 of A = A(j-1,0:k-1)
00728                      S = ZERO
00729                      DO I = 0, K - 1
00730                         AA = ABS( A( I+J*LDA ) )
00731 *                       A(j-1,i)
00732                         WORK( I ) = WORK( I ) + AA
00733                         S = S + AA
00734                      END DO
00735                      WORK( J-1 ) = WORK( J-1 ) + S
00736                   END DO
00737                   I = ISAMAX( N, WORK, 1 )
00738                   VALUE = WORK( I-1 )
00739                END IF
00740             END IF
00741          END IF
00742       ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
00743 *
00744 *       Find normF(A).
00745 *
00746          K = ( N+1 ) / 2
00747          SCALE = ZERO
00748          S = ONE
00749          IF( NOE.EQ.1 ) THEN
00750 *           n is odd
00751             IF( IFM.EQ.1 ) THEN
00752 *              A is normal
00753                IF( ILU.EQ.0 ) THEN
00754 *                 A is upper
00755                   DO J = 0, K - 3
00756                      CALL SLASSQ( K-J-2, A( K+J+1+J*LDA ), 1, SCALE, S )
00757 *                    L at A(k,0)
00758                   END DO
00759                   DO J = 0, K - 1
00760                      CALL SLASSQ( K+J-1, A( 0+J*LDA ), 1, SCALE, S )
00761 *                    trap U at A(0,0)
00762                   END DO
00763                   S = S + S
00764 *                 double s for the off diagonal elements
00765                   CALL SLASSQ( K-1, A( K ), LDA+1, SCALE, S )
00766 *                 tri L at A(k,0)
00767                   CALL SLASSQ( K, A( K-1 ), LDA+1, SCALE, S )
00768 *                 tri U at A(k-1,0)
00769                ELSE
00770 *                 ilu=1 & A is lower
00771                   DO J = 0, K - 1
00772                      CALL SLASSQ( N-J-1, A( J+1+J*LDA ), 1, SCALE, S )
00773 *                    trap L at A(0,0)
00774                   END DO
00775                   DO J = 0, K - 2
00776                      CALL SLASSQ( J, A( 0+( 1+J )*LDA ), 1, SCALE, S )
00777 *                    U at A(0,1)
00778                   END DO
00779                   S = S + S
00780 *                 double s for the off diagonal elements
00781                   CALL SLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00782 *                 tri L at A(0,0)
00783                   CALL SLASSQ( K-1, A( 0+LDA ), LDA+1, SCALE, S )
00784 *                 tri U at A(0,1)
00785                END IF
00786             ELSE
00787 *              A is xpose
00788                IF( ILU.EQ.0 ) THEN
00789 *                 A**T is upper
00790                   DO J = 1, K - 2
00791                      CALL SLASSQ( J, A( 0+( K+J )*LDA ), 1, SCALE, S )
00792 *                    U at A(0,k)
00793                   END DO
00794                   DO J = 0, K - 2
00795                      CALL SLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00796 *                    k by k-1 rect. at A(0,0)
00797                   END DO
00798                   DO J = 0, K - 2
00799                      CALL SLASSQ( K-J-1, A( J+1+( J+K-1 )*LDA ), 1,
00800      $                            SCALE, S )
00801 *                    L at A(0,k-1)
00802                   END DO
00803                   S = S + S
00804 *                 double s for the off diagonal elements
00805                   CALL SLASSQ( K-1, A( 0+K*LDA ), LDA+1, SCALE, S )
00806 *                 tri U at A(0,k)
00807                   CALL SLASSQ( K, A( 0+( K-1 )*LDA ), LDA+1, SCALE, S )
00808 *                 tri L at A(0,k-1)
00809                ELSE
00810 *                 A**T is lower
00811                   DO J = 1, K - 1
00812                      CALL SLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
00813 *                    U at A(0,0)
00814                   END DO
00815                   DO J = K, N - 1
00816                      CALL SLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00817 *                    k by k-1 rect. at A(0,k)
00818                   END DO
00819                   DO J = 0, K - 3
00820                      CALL SLASSQ( K-J-2, A( J+2+J*LDA ), 1, SCALE, S )
00821 *                    L at A(1,0)
00822                   END DO
00823                   S = S + S
00824 *                 double s for the off diagonal elements
00825                   CALL SLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00826 *                 tri U at A(0,0)
00827                   CALL SLASSQ( K-1, A( 1 ), LDA+1, SCALE, S )
00828 *                 tri L at A(1,0)
00829                END IF
00830             END IF
00831          ELSE
00832 *           n is even
00833             IF( IFM.EQ.1 ) THEN
00834 *              A is normal
00835                IF( ILU.EQ.0 ) THEN
00836 *                 A is upper
00837                   DO J = 0, K - 2
00838                      CALL SLASSQ( K-J-1, A( K+J+2+J*LDA ), 1, SCALE, S )
00839 *                    L at A(k+1,0)
00840                   END DO
00841                   DO J = 0, K - 1
00842                      CALL SLASSQ( K+J, A( 0+J*LDA ), 1, SCALE, S )
00843 *                    trap U at A(0,0)
00844                   END DO
00845                   S = S + S
00846 *                 double s for the off diagonal elements
00847                   CALL SLASSQ( K, A( K+1 ), LDA+1, SCALE, S )
00848 *                 tri L at A(k+1,0)
00849                   CALL SLASSQ( K, A( K ), LDA+1, SCALE, S )
00850 *                 tri U at A(k,0)
00851                ELSE
00852 *                 ilu=1 & A is lower
00853                   DO J = 0, K - 1
00854                      CALL SLASSQ( N-J-1, A( J+2+J*LDA ), 1, SCALE, S )
00855 *                    trap L at A(1,0)
00856                   END DO
00857                   DO J = 1, K - 1
00858                      CALL SLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
00859 *                    U at A(0,0)
00860                   END DO
00861                   S = S + S
00862 *                 double s for the off diagonal elements
00863                   CALL SLASSQ( K, A( 1 ), LDA+1, SCALE, S )
00864 *                 tri L at A(1,0)
00865                   CALL SLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00866 *                 tri U at A(0,0)
00867                END IF
00868             ELSE
00869 *              A is xpose
00870                IF( ILU.EQ.0 ) THEN
00871 *                 A**T is upper
00872                   DO J = 1, K - 1
00873                      CALL SLASSQ( J, A( 0+( K+1+J )*LDA ), 1, SCALE, S )
00874 *                    U at A(0,k+1)
00875                   END DO
00876                   DO J = 0, K - 1
00877                      CALL SLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00878 *                    k by k rect. at A(0,0)
00879                   END DO
00880                   DO J = 0, K - 2
00881                      CALL SLASSQ( K-J-1, A( J+1+( J+K )*LDA ), 1, SCALE,
00882      $                            S )
00883 *                    L at A(0,k)
00884                   END DO
00885                   S = S + S
00886 *                 double s for the off diagonal elements
00887                   CALL SLASSQ( K, A( 0+( K+1 )*LDA ), LDA+1, SCALE, S )
00888 *                 tri U at A(0,k+1)
00889                   CALL SLASSQ( K, A( 0+K*LDA ), LDA+1, SCALE, S )
00890 *                 tri L at A(0,k)
00891                ELSE
00892 *                 A**T is lower
00893                   DO J = 1, K - 1
00894                      CALL SLASSQ( J, A( 0+( J+1 )*LDA ), 1, SCALE, S )
00895 *                    U at A(0,1)
00896                   END DO
00897                   DO J = K + 1, N
00898                      CALL SLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00899 *                    k by k rect. at A(0,k+1)
00900                   END DO
00901                   DO J = 0, K - 2
00902                      CALL SLASSQ( K-J-1, A( J+1+J*LDA ), 1, SCALE, S )
00903 *                    L at A(0,0)
00904                   END DO
00905                   S = S + S
00906 *                 double s for the off diagonal elements
00907                   CALL SLASSQ( K, A( LDA ), LDA+1, SCALE, S )
00908 *                 tri L at A(0,1)
00909                   CALL SLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00910 *                 tri U at A(0,0)
00911                END IF
00912             END IF
00913          END IF
00914          VALUE = SCALE*SQRT( S )
00915       END IF
00916 *
00917       SLANSF = VALUE
00918       RETURN
00919 *
00920 *     End of SLANSF
00921 *
00922       END
 All Files Functions