LAPACK  3.4.0
LAPACK: Linear Algebra PACKage
dlansf.f
Go to the documentation of this file.
00001 *> \brief \b DLANSF
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *> \htmlonly
00009 *> Download DLANSF + dependencies 
00010 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlansf.f"> 
00011 *> [TGZ]</a> 
00012 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlansf.f"> 
00013 *> [ZIP]</a> 
00014 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlansf.f"> 
00015 *> [TXT]</a>
00016 *> \endhtmlonly 
00017 *
00018 *  Definition:
00019 *  ===========
00020 *
00021 *       DOUBLE PRECISION FUNCTION DLANSF( NORM, TRANSR, UPLO, N, A, WORK )
00022 * 
00023 *       .. Scalar Arguments ..
00024 *       CHARACTER          NORM, TRANSR, UPLO
00025 *       INTEGER            N
00026 *       ..
00027 *       .. Array Arguments ..
00028 *       DOUBLE PRECISION   A( 0: * ), WORK( 0: * )
00029 *       ..
00030 *  
00031 *
00032 *> \par Purpose:
00033 *  =============
00034 *>
00035 *> \verbatim
00036 *>
00037 *> DLANSF 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 DLANSF
00043 *> \verbatim
00044 *>
00045 *>    DLANSF = ( 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 DLANSF 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, DLANSF is
00091 *>          set to zero.
00092 *> \endverbatim
00093 *>
00094 *> \param[in] A
00095 *> \verbatim
00096 *>          A is DOUBLE PRECISION 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 DOUBLE PRECISION 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 doubleOTHERcomputational
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       DOUBLE PRECISION FUNCTION DLANSF( 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       DOUBLE PRECISION   A( 0: * ), WORK( 0: * )
00223 *     ..
00224 *
00225 *  =====================================================================
00226 *
00227 *     .. Parameters ..
00228       DOUBLE PRECISION   ONE, ZERO
00229       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
00230 *     ..
00231 *     .. Local Scalars ..
00232       INTEGER            I, J, IFM, ILU, NOE, N1, K, L, LDA
00233       DOUBLE PRECISION   SCALE, S, VALUE, AA
00234 *     ..
00235 *     .. External Functions ..
00236       LOGICAL            LSAME
00237       INTEGER            IDAMAX
00238       EXTERNAL           LSAME, IDAMAX
00239 *     ..
00240 *     .. External Subroutines ..
00241       EXTERNAL           DLASSQ
00242 *     ..
00243 *     .. Intrinsic Functions ..
00244       INTRINSIC          ABS, MAX, SQRT
00245 *     ..
00246 *     .. Executable Statements ..
00247 *
00248       IF( N.EQ.0 ) THEN
00249          DLANSF = ZERO
00250          RETURN
00251       END IF
00252 *
00253 *     set noe = 1 if n is odd. if n is even set noe=0
00254 *
00255       NOE = 1
00256       IF( MOD( N, 2 ).EQ.0 )
00257      $   NOE = 0
00258 *
00259 *     set ifm = 0 when form='T or 't' and 1 otherwise
00260 *
00261       IFM = 1
00262       IF( LSAME( TRANSR, 'T' ) )
00263      $   IFM = 0
00264 *
00265 *     set ilu = 0 when uplo='U or 'u' and 1 otherwise
00266 *
00267       ILU = 1
00268       IF( LSAME( UPLO, 'U' ) )
00269      $   ILU = 0
00270 *
00271 *     set lda = (n+1)/2 when ifm = 0
00272 *     set lda = n when ifm = 1 and noe = 1
00273 *     set lda = n+1 when ifm = 1 and noe = 0
00274 *
00275       IF( IFM.EQ.1 ) THEN
00276          IF( NOE.EQ.1 ) THEN
00277             LDA = N
00278          ELSE
00279 *           noe=0
00280             LDA = N + 1
00281          END IF
00282       ELSE
00283 *        ifm=0
00284          LDA = ( N+1 ) / 2
00285       END IF
00286 *
00287       IF( LSAME( NORM, 'M' ) ) THEN
00288 *
00289 *       Find max(abs(A(i,j))).
00290 *
00291          K = ( N+1 ) / 2
00292          VALUE = ZERO
00293          IF( NOE.EQ.1 ) THEN
00294 *           n is odd
00295             IF( IFM.EQ.1 ) THEN
00296 *           A is n by k
00297                DO J = 0, K - 1
00298                   DO I = 0, N - 1
00299                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00300                   END DO
00301                END DO
00302             ELSE
00303 *              xpose case; A is k by n
00304                DO J = 0, N - 1
00305                   DO I = 0, K - 1
00306                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00307                   END DO
00308                END DO
00309             END IF
00310          ELSE
00311 *           n is even
00312             IF( IFM.EQ.1 ) THEN
00313 *              A is n+1 by k
00314                DO J = 0, K - 1
00315                   DO I = 0, N
00316                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00317                   END DO
00318                END DO
00319             ELSE
00320 *              xpose case; A is k by n+1
00321                DO J = 0, N
00322                   DO I = 0, K - 1
00323                      VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
00324                   END DO
00325                END DO
00326             END IF
00327          END IF
00328       ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
00329      $         ( NORM.EQ.'1' ) ) THEN
00330 *
00331 *        Find normI(A) ( = norm1(A), since A is symmetric).
00332 *
00333          IF( IFM.EQ.1 ) THEN
00334             K = N / 2
00335             IF( NOE.EQ.1 ) THEN
00336 *              n is odd
00337                IF( ILU.EQ.0 ) THEN
00338                   DO I = 0, K - 1
00339                      WORK( I ) = ZERO
00340                   END DO
00341                   DO J = 0, K
00342                      S = ZERO
00343                      DO I = 0, K + J - 1
00344                         AA = ABS( A( I+J*LDA ) )
00345 *                       -> A(i,j+k)
00346                         S = S + AA
00347                         WORK( I ) = WORK( I ) + AA
00348                      END DO
00349                      AA = ABS( A( I+J*LDA ) )
00350 *                    -> A(j+k,j+k)
00351                      WORK( J+K ) = S + AA
00352                      IF( I.EQ.K+K )
00353      $                  GO TO 10
00354                      I = I + 1
00355                      AA = ABS( A( I+J*LDA ) )
00356 *                    -> A(j,j)
00357                      WORK( J ) = WORK( J ) + AA
00358                      S = ZERO
00359                      DO L = J + 1, K - 1
00360                         I = I + 1
00361                         AA = ABS( A( I+J*LDA ) )
00362 *                       -> A(l,j)
00363                         S = S + AA
00364                         WORK( L ) = WORK( L ) + AA
00365                      END DO
00366                      WORK( J ) = WORK( J ) + S
00367                   END DO
00368    10             CONTINUE
00369                   I = IDAMAX( N, WORK, 1 )
00370                   VALUE = WORK( I-1 )
00371                ELSE
00372 *                 ilu = 1
00373                   K = K + 1
00374 *                 k=(n+1)/2 for n odd and ilu=1
00375                   DO I = K, N - 1
00376                      WORK( I ) = ZERO
00377                   END DO
00378                   DO J = K - 1, 0, -1
00379                      S = ZERO
00380                      DO I = 0, J - 2
00381                         AA = ABS( A( I+J*LDA ) )
00382 *                       -> A(j+k,i+k)
00383                         S = S + AA
00384                         WORK( I+K ) = WORK( I+K ) + AA
00385                      END DO
00386                      IF( J.GT.0 ) THEN
00387                         AA = ABS( A( I+J*LDA ) )
00388 *                       -> A(j+k,j+k)
00389                         S = S + AA
00390                         WORK( I+K ) = WORK( I+K ) + S
00391 *                       i=j
00392                         I = I + 1
00393                      END IF
00394                      AA = ABS( A( I+J*LDA ) )
00395 *                    -> A(j,j)
00396                      WORK( J ) = AA
00397                      S = ZERO
00398                      DO L = J + 1, N - 1
00399                         I = I + 1
00400                         AA = ABS( A( I+J*LDA ) )
00401 *                       -> A(l,j)
00402                         S = S + AA
00403                         WORK( L ) = WORK( L ) + AA
00404                      END DO
00405                      WORK( J ) = WORK( J ) + S
00406                   END DO
00407                   I = IDAMAX( N, WORK, 1 )
00408                   VALUE = WORK( I-1 )
00409                END IF
00410             ELSE
00411 *              n is even
00412                IF( ILU.EQ.0 ) THEN
00413                   DO I = 0, K - 1
00414                      WORK( I ) = ZERO
00415                   END DO
00416                   DO J = 0, K - 1
00417                      S = ZERO
00418                      DO I = 0, K + J - 1
00419                         AA = ABS( A( I+J*LDA ) )
00420 *                       -> A(i,j+k)
00421                         S = S + AA
00422                         WORK( I ) = WORK( I ) + AA
00423                      END DO
00424                      AA = ABS( A( I+J*LDA ) )
00425 *                    -> A(j+k,j+k)
00426                      WORK( J+K ) = S + AA
00427                      I = I + 1
00428                      AA = ABS( A( I+J*LDA ) )
00429 *                    -> A(j,j)
00430                      WORK( J ) = WORK( J ) + AA
00431                      S = ZERO
00432                      DO L = J + 1, K - 1
00433                         I = I + 1
00434                         AA = ABS( A( I+J*LDA ) )
00435 *                       -> A(l,j)
00436                         S = S + AA
00437                         WORK( L ) = WORK( L ) + AA
00438                      END DO
00439                      WORK( J ) = WORK( J ) + S
00440                   END DO
00441                   I = IDAMAX( N, WORK, 1 )
00442                   VALUE = WORK( I-1 )
00443                ELSE
00444 *                 ilu = 1
00445                   DO I = K, N - 1
00446                      WORK( I ) = ZERO
00447                   END DO
00448                   DO J = K - 1, 0, -1
00449                      S = ZERO
00450                      DO I = 0, J - 1
00451                         AA = ABS( A( I+J*LDA ) )
00452 *                       -> A(j+k,i+k)
00453                         S = S + AA
00454                         WORK( I+K ) = WORK( I+K ) + AA
00455                      END DO
00456                      AA = ABS( A( I+J*LDA ) )
00457 *                    -> A(j+k,j+k)
00458                      S = S + AA
00459                      WORK( I+K ) = WORK( I+K ) + S
00460 *                    i=j
00461                      I = I + 1
00462                      AA = ABS( A( I+J*LDA ) )
00463 *                    -> A(j,j)
00464                      WORK( J ) = AA
00465                      S = ZERO
00466                      DO L = J + 1, N - 1
00467                         I = I + 1
00468                         AA = ABS( A( I+J*LDA ) )
00469 *                       -> A(l,j)
00470                         S = S + AA
00471                         WORK( L ) = WORK( L ) + AA
00472                      END DO
00473                      WORK( J ) = WORK( J ) + S
00474                   END DO
00475                   I = IDAMAX( N, WORK, 1 )
00476                   VALUE = WORK( I-1 )
00477                END IF
00478             END IF
00479          ELSE
00480 *           ifm=0
00481             K = N / 2
00482             IF( NOE.EQ.1 ) THEN
00483 *              n is odd
00484                IF( ILU.EQ.0 ) THEN
00485                   N1 = K
00486 *                 n/2
00487                   K = K + 1
00488 *                 k is the row size and lda
00489                   DO I = N1, N - 1
00490                      WORK( I ) = ZERO
00491                   END DO
00492                   DO J = 0, N1 - 1
00493                      S = ZERO
00494                      DO I = 0, K - 1
00495                         AA = ABS( A( I+J*LDA ) )
00496 *                       A(j,n1+i)
00497                         WORK( I+N1 ) = WORK( I+N1 ) + AA
00498                         S = S + AA
00499                      END DO
00500                      WORK( J ) = S
00501                   END DO
00502 *                 j=n1=k-1 is special
00503                   S = ABS( A( 0+J*LDA ) )
00504 *                 A(k-1,k-1)
00505                   DO I = 1, K - 1
00506                      AA = ABS( A( I+J*LDA ) )
00507 *                    A(k-1,i+n1)
00508                      WORK( I+N1 ) = WORK( I+N1 ) + AA
00509                      S = S + AA
00510                   END DO
00511                   WORK( J ) = WORK( J ) + S
00512                   DO J = K, N - 1
00513                      S = ZERO
00514                      DO I = 0, J - K - 1
00515                         AA = ABS( A( I+J*LDA ) )
00516 *                       A(i,j-k)
00517                         WORK( I ) = WORK( I ) + AA
00518                         S = S + AA
00519                      END DO
00520 *                    i=j-k
00521                      AA = ABS( A( I+J*LDA ) )
00522 *                    A(j-k,j-k)
00523                      S = S + AA
00524                      WORK( J-K ) = WORK( J-K ) + S
00525                      I = I + 1
00526                      S = ABS( A( I+J*LDA ) )
00527 *                    A(j,j)
00528                      DO L = J + 1, N - 1
00529                         I = I + 1
00530                         AA = ABS( A( I+J*LDA ) )
00531 *                       A(j,l)
00532                         WORK( L ) = WORK( L ) + AA
00533                         S = S + AA
00534                      END DO
00535                      WORK( J ) = WORK( J ) + S
00536                   END DO
00537                   I = IDAMAX( N, WORK, 1 )
00538                   VALUE = WORK( I-1 )
00539                ELSE
00540 *                 ilu=1
00541                   K = K + 1
00542 *                 k=(n+1)/2 for n odd and ilu=1
00543                   DO I = K, N - 1
00544                      WORK( I ) = ZERO
00545                   END DO
00546                   DO J = 0, K - 2
00547 *                    process
00548                      S = ZERO
00549                      DO I = 0, J - 1
00550                         AA = ABS( A( I+J*LDA ) )
00551 *                       A(j,i)
00552                         WORK( I ) = WORK( I ) + AA
00553                         S = S + AA
00554                      END DO
00555                      AA = ABS( A( I+J*LDA ) )
00556 *                    i=j so process of A(j,j)
00557                      S = S + AA
00558                      WORK( J ) = S
00559 *                    is initialised here
00560                      I = I + 1
00561 *                    i=j process A(j+k,j+k)
00562                      AA = ABS( A( I+J*LDA ) )
00563                      S = AA
00564                      DO L = K + J + 1, N - 1
00565                         I = I + 1
00566                         AA = ABS( A( I+J*LDA ) )
00567 *                       A(l,k+j)
00568                         S = S + AA
00569                         WORK( L ) = WORK( L ) + AA
00570                      END DO
00571                      WORK( K+J ) = WORK( K+J ) + S
00572                   END DO
00573 *                 j=k-1 is special :process col A(k-1,0:k-1)
00574                   S = ZERO
00575                   DO I = 0, K - 2
00576                      AA = ABS( A( I+J*LDA ) )
00577 *                    A(k,i)
00578                      WORK( I ) = WORK( I ) + AA
00579                      S = S + AA
00580                   END DO
00581 *                 i=k-1
00582                   AA = ABS( A( I+J*LDA ) )
00583 *                 A(k-1,k-1)
00584                   S = S + AA
00585                   WORK( I ) = S
00586 *                 done with col j=k+1
00587                   DO J = K, N - 1
00588 *                    process col j of A = A(j,0:k-1)
00589                      S = ZERO
00590                      DO I = 0, K - 1
00591                         AA = ABS( A( I+J*LDA ) )
00592 *                       A(j,i)
00593                         WORK( I ) = WORK( I ) + AA
00594                         S = S + AA
00595                      END DO
00596                      WORK( J ) = WORK( J ) + S
00597                   END DO
00598                   I = IDAMAX( N, WORK, 1 )
00599                   VALUE = WORK( I-1 )
00600                END IF
00601             ELSE
00602 *              n is even
00603                IF( ILU.EQ.0 ) THEN
00604                   DO I = K, N - 1
00605                      WORK( I ) = ZERO
00606                   END DO
00607                   DO J = 0, K - 1
00608                      S = ZERO
00609                      DO I = 0, K - 1
00610                         AA = ABS( A( I+J*LDA ) )
00611 *                       A(j,i+k)
00612                         WORK( I+K ) = WORK( I+K ) + AA
00613                         S = S + AA
00614                      END DO
00615                      WORK( J ) = S
00616                   END DO
00617 *                 j=k
00618                   AA = ABS( A( 0+J*LDA ) )
00619 *                 A(k,k)
00620                   S = AA
00621                   DO I = 1, K - 1
00622                      AA = ABS( A( I+J*LDA ) )
00623 *                    A(k,k+i)
00624                      WORK( I+K ) = WORK( I+K ) + AA
00625                      S = S + AA
00626                   END DO
00627                   WORK( J ) = WORK( J ) + S
00628                   DO J = K + 1, N - 1
00629                      S = ZERO
00630                      DO I = 0, J - 2 - K
00631                         AA = ABS( A( I+J*LDA ) )
00632 *                       A(i,j-k-1)
00633                         WORK( I ) = WORK( I ) + AA
00634                         S = S + AA
00635                      END DO
00636 *                     i=j-1-k
00637                      AA = ABS( A( I+J*LDA ) )
00638 *                    A(j-k-1,j-k-1)
00639                      S = S + AA
00640                      WORK( J-K-1 ) = WORK( J-K-1 ) + S
00641                      I = I + 1
00642                      AA = ABS( A( I+J*LDA ) )
00643 *                    A(j,j)
00644                      S = AA
00645                      DO L = J + 1, N - 1
00646                         I = I + 1
00647                         AA = ABS( A( I+J*LDA ) )
00648 *                       A(j,l)
00649                         WORK( L ) = WORK( L ) + AA
00650                         S = S + AA
00651                      END DO
00652                      WORK( J ) = WORK( J ) + S
00653                   END DO
00654 *                 j=n
00655                   S = ZERO
00656                   DO I = 0, K - 2
00657                      AA = ABS( A( I+J*LDA ) )
00658 *                    A(i,k-1)
00659                      WORK( I ) = WORK( I ) + AA
00660                      S = S + AA
00661                   END DO
00662 *                 i=k-1
00663                   AA = ABS( A( I+J*LDA ) )
00664 *                 A(k-1,k-1)
00665                   S = S + AA
00666                   WORK( I ) = WORK( I ) + S
00667                   I = IDAMAX( N, WORK, 1 )
00668                   VALUE = WORK( I-1 )
00669                ELSE
00670 *                 ilu=1
00671                   DO I = K, N - 1
00672                      WORK( I ) = ZERO
00673                   END DO
00674 *                 j=0 is special :process col A(k:n-1,k)
00675                   S = ABS( A( 0 ) )
00676 *                 A(k,k)
00677                   DO I = 1, K - 1
00678                      AA = ABS( A( I ) )
00679 *                    A(k+i,k)
00680                      WORK( I+K ) = WORK( I+K ) + AA
00681                      S = S + AA
00682                   END DO
00683                   WORK( K ) = WORK( K ) + S
00684                   DO J = 1, K - 1
00685 *                    process
00686                      S = ZERO
00687                      DO I = 0, J - 2
00688                         AA = ABS( A( I+J*LDA ) )
00689 *                       A(j-1,i)
00690                         WORK( I ) = WORK( I ) + AA
00691                         S = S + AA
00692                      END DO
00693                      AA = ABS( A( I+J*LDA ) )
00694 *                    i=j-1 so process of A(j-1,j-1)
00695                      S = S + AA
00696                      WORK( J-1 ) = S
00697 *                    is initialised here
00698                      I = I + 1
00699 *                    i=j process A(j+k,j+k)
00700                      AA = ABS( A( I+J*LDA ) )
00701                      S = AA
00702                      DO L = K + J + 1, N - 1
00703                         I = I + 1
00704                         AA = ABS( A( I+J*LDA ) )
00705 *                       A(l,k+j)
00706                         S = S + AA
00707                         WORK( L ) = WORK( L ) + AA
00708                      END DO
00709                      WORK( K+J ) = WORK( K+J ) + S
00710                   END DO
00711 *                 j=k is special :process col A(k,0:k-1)
00712                   S = ZERO
00713                   DO I = 0, K - 2
00714                      AA = ABS( A( I+J*LDA ) )
00715 *                    A(k,i)
00716                      WORK( I ) = WORK( I ) + AA
00717                      S = S + AA
00718                   END DO
00719 *                 i=k-1
00720                   AA = ABS( A( I+J*LDA ) )
00721 *                 A(k-1,k-1)
00722                   S = S + AA
00723                   WORK( I ) = S
00724 *                 done with col j=k+1
00725                   DO J = K + 1, N
00726 *                    process col j-1 of A = A(j-1,0:k-1)
00727                      S = ZERO
00728                      DO I = 0, K - 1
00729                         AA = ABS( A( I+J*LDA ) )
00730 *                       A(j-1,i)
00731                         WORK( I ) = WORK( I ) + AA
00732                         S = S + AA
00733                      END DO
00734                      WORK( J-1 ) = WORK( J-1 ) + S
00735                   END DO
00736                   I = IDAMAX( N, WORK, 1 )
00737                   VALUE = WORK( I-1 )
00738                END IF
00739             END IF
00740          END IF
00741       ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
00742 *
00743 *       Find normF(A).
00744 *
00745          K = ( N+1 ) / 2
00746          SCALE = ZERO
00747          S = ONE
00748          IF( NOE.EQ.1 ) THEN
00749 *           n is odd
00750             IF( IFM.EQ.1 ) THEN
00751 *              A is normal
00752                IF( ILU.EQ.0 ) THEN
00753 *                 A is upper
00754                   DO J = 0, K - 3
00755                      CALL DLASSQ( K-J-2, A( K+J+1+J*LDA ), 1, SCALE, S )
00756 *                    L at A(k,0)
00757                   END DO
00758                   DO J = 0, K - 1
00759                      CALL DLASSQ( K+J-1, A( 0+J*LDA ), 1, SCALE, S )
00760 *                    trap U at A(0,0)
00761                   END DO
00762                   S = S + S
00763 *                 double s for the off diagonal elements
00764                   CALL DLASSQ( K-1, A( K ), LDA+1, SCALE, S )
00765 *                 tri L at A(k,0)
00766                   CALL DLASSQ( K, A( K-1 ), LDA+1, SCALE, S )
00767 *                 tri U at A(k-1,0)
00768                ELSE
00769 *                 ilu=1 & A is lower
00770                   DO J = 0, K - 1
00771                      CALL DLASSQ( N-J-1, A( J+1+J*LDA ), 1, SCALE, S )
00772 *                    trap L at A(0,0)
00773                   END DO
00774                   DO J = 0, K - 2
00775                      CALL DLASSQ( J, A( 0+( 1+J )*LDA ), 1, SCALE, S )
00776 *                    U at A(0,1)
00777                   END DO
00778                   S = S + S
00779 *                 double s for the off diagonal elements
00780                   CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00781 *                 tri L at A(0,0)
00782                   CALL DLASSQ( K-1, A( 0+LDA ), LDA+1, SCALE, S )
00783 *                 tri U at A(0,1)
00784                END IF
00785             ELSE
00786 *              A is xpose
00787                IF( ILU.EQ.0 ) THEN
00788 *                 A**T is upper
00789                   DO J = 1, K - 2
00790                      CALL DLASSQ( J, A( 0+( K+J )*LDA ), 1, SCALE, S )
00791 *                    U at A(0,k)
00792                   END DO
00793                   DO J = 0, K - 2
00794                      CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00795 *                    k by k-1 rect. at A(0,0)
00796                   END DO
00797                   DO J = 0, K - 2
00798                      CALL DLASSQ( K-J-1, A( J+1+( J+K-1 )*LDA ), 1,
00799      $                            SCALE, S )
00800 *                    L at A(0,k-1)
00801                   END DO
00802                   S = S + S
00803 *                 double s for the off diagonal elements
00804                   CALL DLASSQ( K-1, A( 0+K*LDA ), LDA+1, SCALE, S )
00805 *                 tri U at A(0,k)
00806                   CALL DLASSQ( K, A( 0+( K-1 )*LDA ), LDA+1, SCALE, S )
00807 *                 tri L at A(0,k-1)
00808                ELSE
00809 *                 A**T is lower
00810                   DO J = 1, K - 1
00811                      CALL DLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
00812 *                    U at A(0,0)
00813                   END DO
00814                   DO J = K, N - 1
00815                      CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00816 *                    k by k-1 rect. at A(0,k)
00817                   END DO
00818                   DO J = 0, K - 3
00819                      CALL DLASSQ( K-J-2, A( J+2+J*LDA ), 1, SCALE, S )
00820 *                    L at A(1,0)
00821                   END DO
00822                   S = S + S
00823 *                 double s for the off diagonal elements
00824                   CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00825 *                 tri U at A(0,0)
00826                   CALL DLASSQ( K-1, A( 1 ), LDA+1, SCALE, S )
00827 *                 tri L at A(1,0)
00828                END IF
00829             END IF
00830          ELSE
00831 *           n is even
00832             IF( IFM.EQ.1 ) THEN
00833 *              A is normal
00834                IF( ILU.EQ.0 ) THEN
00835 *                 A is upper
00836                   DO J = 0, K - 2
00837                      CALL DLASSQ( K-J-1, A( K+J+2+J*LDA ), 1, SCALE, S )
00838 *                    L at A(k+1,0)
00839                   END DO
00840                   DO J = 0, K - 1
00841                      CALL DLASSQ( K+J, A( 0+J*LDA ), 1, SCALE, S )
00842 *                    trap U at A(0,0)
00843                   END DO
00844                   S = S + S
00845 *                 double s for the off diagonal elements
00846                   CALL DLASSQ( K, A( K+1 ), LDA+1, SCALE, S )
00847 *                 tri L at A(k+1,0)
00848                   CALL DLASSQ( K, A( K ), LDA+1, SCALE, S )
00849 *                 tri U at A(k,0)
00850                ELSE
00851 *                 ilu=1 & A is lower
00852                   DO J = 0, K - 1
00853                      CALL DLASSQ( N-J-1, A( J+2+J*LDA ), 1, SCALE, S )
00854 *                    trap L at A(1,0)
00855                   END DO
00856                   DO J = 1, K - 1
00857                      CALL DLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
00858 *                    U at A(0,0)
00859                   END DO
00860                   S = S + S
00861 *                 double s for the off diagonal elements
00862                   CALL DLASSQ( K, A( 1 ), LDA+1, SCALE, S )
00863 *                 tri L at A(1,0)
00864                   CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00865 *                 tri U at A(0,0)
00866                END IF
00867             ELSE
00868 *              A is xpose
00869                IF( ILU.EQ.0 ) THEN
00870 *                 A**T is upper
00871                   DO J = 1, K - 1
00872                      CALL DLASSQ( J, A( 0+( K+1+J )*LDA ), 1, SCALE, S )
00873 *                    U at A(0,k+1)
00874                   END DO
00875                   DO J = 0, K - 1
00876                      CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00877 *                    k by k rect. at A(0,0)
00878                   END DO
00879                   DO J = 0, K - 2
00880                      CALL DLASSQ( K-J-1, A( J+1+( J+K )*LDA ), 1, SCALE,
00881      $                            S )
00882 *                    L at A(0,k)
00883                   END DO
00884                   S = S + S
00885 *                 double s for the off diagonal elements
00886                   CALL DLASSQ( K, A( 0+( K+1 )*LDA ), LDA+1, SCALE, S )
00887 *                 tri U at A(0,k+1)
00888                   CALL DLASSQ( K, A( 0+K*LDA ), LDA+1, SCALE, S )
00889 *                 tri L at A(0,k)
00890                ELSE
00891 *                 A**T is lower
00892                   DO J = 1, K - 1
00893                      CALL DLASSQ( J, A( 0+( J+1 )*LDA ), 1, SCALE, S )
00894 *                    U at A(0,1)
00895                   END DO
00896                   DO J = K + 1, N
00897                      CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
00898 *                    k by k rect. at A(0,k+1)
00899                   END DO
00900                   DO J = 0, K - 2
00901                      CALL DLASSQ( K-J-1, A( J+1+J*LDA ), 1, SCALE, S )
00902 *                    L at A(0,0)
00903                   END DO
00904                   S = S + S
00905 *                 double s for the off diagonal elements
00906                   CALL DLASSQ( K, A( LDA ), LDA+1, SCALE, S )
00907 *                 tri L at A(0,1)
00908                   CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
00909 *                 tri U at A(0,0)
00910                END IF
00911             END IF
00912          END IF
00913          VALUE = SCALE*SQRT( S )
00914       END IF
00915 *
00916       DLANSF = VALUE
00917       RETURN
00918 *
00919 *     End of DLANSF
00920 *
00921       END
 All Files Functions