![]() |
LAPACK
3.4.0
LAPACK: Linear Algebra PACKage
|
00001 *> \brief \b ZLANHF 00002 * 00003 * =========== DOCUMENTATION =========== 00004 * 00005 * Online html documentation available at 00006 * http://www.netlib.org/lapack/explore-html/ 00007 * 00008 *> \htmlonly 00009 *> Download ZLANHF + dependencies 00010 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlanhf.f"> 00011 *> [TGZ]</a> 00012 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlanhf.f"> 00013 *> [ZIP]</a> 00014 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlanhf.f"> 00015 *> [TXT]</a> 00016 *> \endhtmlonly 00017 * 00018 * Definition: 00019 * =========== 00020 * 00021 * DOUBLE PRECISION FUNCTION ZLANHF( 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 WORK( 0: * ) 00029 * COMPLEX*16 A( 0: * ) 00030 * .. 00031 * 00032 * 00033 *> \par Purpose: 00034 * ============= 00035 *> 00036 *> \verbatim 00037 *> 00038 *> ZLANHF returns the value of the one norm, or the Frobenius norm, or 00039 *> the infinity norm, or the element of largest absolute value of a 00040 *> complex Hermitian matrix A in RFP format. 00041 *> \endverbatim 00042 *> 00043 *> \return ZLANHF 00044 *> \verbatim 00045 *> 00046 *> ZLANHF = ( max(abs(A(i,j))), NORM = 'M' or 'm' 00047 *> ( 00048 *> ( norm1(A), NORM = '1', 'O' or 'o' 00049 *> ( 00050 *> ( normI(A), NORM = 'I' or 'i' 00051 *> ( 00052 *> ( normF(A), NORM = 'F', 'f', 'E' or 'e' 00053 *> 00054 *> where norm1 denotes the one norm of a matrix (maximum column sum), 00055 *> normI denotes the infinity norm of a matrix (maximum row sum) and 00056 *> normF denotes the Frobenius norm of a matrix (square root of sum of 00057 *> squares). Note that max(abs(A(i,j))) is not a matrix norm. 00058 *> \endverbatim 00059 * 00060 * Arguments: 00061 * ========== 00062 * 00063 *> \param[in] NORM 00064 *> \verbatim 00065 *> NORM is CHARACTER 00066 *> Specifies the value to be returned in ZLANHF as described 00067 *> above. 00068 *> \endverbatim 00069 *> 00070 *> \param[in] TRANSR 00071 *> \verbatim 00072 *> TRANSR is CHARACTER 00073 *> Specifies whether the RFP format of A is normal or 00074 *> conjugate-transposed format. 00075 *> = 'N': RFP format is Normal 00076 *> = 'C': RFP format is Conjugate-transposed 00077 *> \endverbatim 00078 *> 00079 *> \param[in] UPLO 00080 *> \verbatim 00081 *> UPLO is CHARACTER 00082 *> On entry, UPLO specifies whether the RFP matrix A came from 00083 *> an upper or lower triangular matrix as follows: 00084 *> 00085 *> UPLO = 'U' or 'u' RFP A came from an upper triangular 00086 *> matrix 00087 *> 00088 *> UPLO = 'L' or 'l' RFP A came from a lower triangular 00089 *> matrix 00090 *> \endverbatim 00091 *> 00092 *> \param[in] N 00093 *> \verbatim 00094 *> N is INTEGER 00095 *> The order of the matrix A. N >= 0. When N = 0, ZLANHF is 00096 *> set to zero. 00097 *> \endverbatim 00098 *> 00099 *> \param[in] A 00100 *> \verbatim 00101 *> A is COMPLEX*16 array, dimension ( N*(N+1)/2 ); 00102 *> On entry, the matrix A in RFP Format. 00103 *> RFP Format is described by TRANSR, UPLO and N as follows: 00104 *> If TRANSR='N' then RFP A is (0:N,0:K-1) when N is even; 00105 *> K=N/2. RFP A is (0:N-1,0:K) when N is odd; K=N/2. If 00106 *> TRANSR = 'C' then RFP is the Conjugate-transpose of RFP A 00107 *> as defined when TRANSR = 'N'. The contents of RFP A are 00108 *> defined by UPLO as follows: If UPLO = 'U' the RFP A 00109 *> contains the ( N*(N+1)/2 ) elements of upper packed A 00110 *> either in normal or conjugate-transpose Format. If 00111 *> UPLO = 'L' the RFP A contains the ( N*(N+1) /2 ) elements 00112 *> of lower packed A either in normal or conjugate-transpose 00113 *> Format. The LDA of RFP A is (N+1)/2 when TRANSR = 'C'. When 00114 *> TRANSR is 'N' the LDA is N+1 when N is even and is N when 00115 *> is odd. See the Note below for more details. 00116 *> Unchanged on exit. 00117 *> \endverbatim 00118 *> 00119 *> \param[out] WORK 00120 *> \verbatim 00121 *> WORK is DOUBLE PRECISION array, dimension (LWORK), 00122 *> where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, 00123 *> WORK is not referenced. 00124 *> \endverbatim 00125 * 00126 * Authors: 00127 * ======== 00128 * 00129 *> \author Univ. of Tennessee 00130 *> \author Univ. of California Berkeley 00131 *> \author Univ. of Colorado Denver 00132 *> \author NAG Ltd. 00133 * 00134 *> \date November 2011 00135 * 00136 *> \ingroup complex16OTHERcomputational 00137 * 00138 *> \par Further Details: 00139 * ===================== 00140 *> 00141 *> \verbatim 00142 *> 00143 *> We first consider Standard Packed Format when N is even. 00144 *> We give an example where N = 6. 00145 *> 00146 *> AP is Upper AP is Lower 00147 *> 00148 *> 00 01 02 03 04 05 00 00149 *> 11 12 13 14 15 10 11 00150 *> 22 23 24 25 20 21 22 00151 *> 33 34 35 30 31 32 33 00152 *> 44 45 40 41 42 43 44 00153 *> 55 50 51 52 53 54 55 00154 *> 00155 *> 00156 *> Let TRANSR = 'N'. RFP holds AP as follows: 00157 *> For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last 00158 *> three columns of AP upper. The lower triangle A(4:6,0:2) consists of 00159 *> conjugate-transpose of the first three columns of AP upper. 00160 *> For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first 00161 *> three columns of AP lower. The upper triangle A(0:2,0:2) consists of 00162 *> conjugate-transpose of the last three columns of AP lower. 00163 *> To denote conjugate we place -- above the element. This covers the 00164 *> case N even and TRANSR = 'N'. 00165 *> 00166 *> RFP A RFP A 00167 *> 00168 *> -- -- -- 00169 *> 03 04 05 33 43 53 00170 *> -- -- 00171 *> 13 14 15 00 44 54 00172 *> -- 00173 *> 23 24 25 10 11 55 00174 *> 00175 *> 33 34 35 20 21 22 00176 *> -- 00177 *> 00 44 45 30 31 32 00178 *> -- -- 00179 *> 01 11 55 40 41 42 00180 *> -- -- -- 00181 *> 02 12 22 50 51 52 00182 *> 00183 *> Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate- 00184 *> transpose of RFP A above. One therefore gets: 00185 *> 00186 *> 00187 *> RFP A RFP A 00188 *> 00189 *> -- -- -- -- -- -- -- -- -- -- 00190 *> 03 13 23 33 00 01 02 33 00 10 20 30 40 50 00191 *> -- -- -- -- -- -- -- -- -- -- 00192 *> 04 14 24 34 44 11 12 43 44 11 21 31 41 51 00193 *> -- -- -- -- -- -- -- -- -- -- 00194 *> 05 15 25 35 45 55 22 53 54 55 22 32 42 52 00195 *> 00196 *> 00197 *> We next consider Standard Packed Format when N is odd. 00198 *> We give an example where N = 5. 00199 *> 00200 *> AP is Upper AP is Lower 00201 *> 00202 *> 00 01 02 03 04 00 00203 *> 11 12 13 14 10 11 00204 *> 22 23 24 20 21 22 00205 *> 33 34 30 31 32 33 00206 *> 44 40 41 42 43 44 00207 *> 00208 *> 00209 *> Let TRANSR = 'N'. RFP holds AP as follows: 00210 *> For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last 00211 *> three columns of AP upper. The lower triangle A(3:4,0:1) consists of 00212 *> conjugate-transpose of the first two columns of AP upper. 00213 *> For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first 00214 *> three columns of AP lower. The upper triangle A(0:1,1:2) consists of 00215 *> conjugate-transpose of the last two columns of AP lower. 00216 *> To denote conjugate we place -- above the element. This covers the 00217 *> case N odd and TRANSR = 'N'. 00218 *> 00219 *> RFP A RFP A 00220 *> 00221 *> -- -- 00222 *> 02 03 04 00 33 43 00223 *> -- 00224 *> 12 13 14 10 11 44 00225 *> 00226 *> 22 23 24 20 21 22 00227 *> -- 00228 *> 00 33 34 30 31 32 00229 *> -- -- 00230 *> 01 11 44 40 41 42 00231 *> 00232 *> Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate- 00233 *> transpose of RFP A above. One therefore gets: 00234 *> 00235 *> 00236 *> RFP A RFP A 00237 *> 00238 *> -- -- -- -- -- -- -- -- -- 00239 *> 02 12 22 00 01 00 10 20 30 40 50 00240 *> -- -- -- -- -- -- -- -- -- 00241 *> 03 13 23 33 11 33 11 21 31 41 51 00242 *> -- -- -- -- -- -- -- -- -- 00243 *> 04 14 24 34 44 43 44 22 32 42 52 00244 *> \endverbatim 00245 *> 00246 * ===================================================================== 00247 DOUBLE PRECISION FUNCTION ZLANHF( NORM, TRANSR, UPLO, N, A, WORK ) 00248 * 00249 * -- LAPACK computational routine (version 3.4.0) -- 00250 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00251 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00252 * November 2011 00253 * 00254 * .. Scalar Arguments .. 00255 CHARACTER NORM, TRANSR, UPLO 00256 INTEGER N 00257 * .. 00258 * .. Array Arguments .. 00259 DOUBLE PRECISION WORK( 0: * ) 00260 COMPLEX*16 A( 0: * ) 00261 * .. 00262 * 00263 * ===================================================================== 00264 * 00265 * .. Parameters .. 00266 DOUBLE PRECISION ONE, ZERO 00267 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) 00268 * .. 00269 * .. Local Scalars .. 00270 INTEGER I, J, IFM, ILU, NOE, N1, K, L, LDA 00271 DOUBLE PRECISION SCALE, S, VALUE, AA 00272 * .. 00273 * .. External Functions .. 00274 LOGICAL LSAME 00275 INTEGER IDAMAX 00276 EXTERNAL LSAME, IDAMAX 00277 * .. 00278 * .. External Subroutines .. 00279 EXTERNAL ZLASSQ 00280 * .. 00281 * .. Intrinsic Functions .. 00282 INTRINSIC ABS, DBLE, MAX, SQRT 00283 * .. 00284 * .. Executable Statements .. 00285 * 00286 IF( N.EQ.0 ) THEN 00287 ZLANHF = ZERO 00288 RETURN 00289 END IF 00290 * 00291 * set noe = 1 if n is odd. if n is even set noe=0 00292 * 00293 NOE = 1 00294 IF( MOD( N, 2 ).EQ.0 ) 00295 $ NOE = 0 00296 * 00297 * set ifm = 0 when form='C' or 'c' and 1 otherwise 00298 * 00299 IFM = 1 00300 IF( LSAME( TRANSR, 'C' ) ) 00301 $ IFM = 0 00302 * 00303 * set ilu = 0 when uplo='U or 'u' and 1 otherwise 00304 * 00305 ILU = 1 00306 IF( LSAME( UPLO, 'U' ) ) 00307 $ ILU = 0 00308 * 00309 * set lda = (n+1)/2 when ifm = 0 00310 * set lda = n when ifm = 1 and noe = 1 00311 * set lda = n+1 when ifm = 1 and noe = 0 00312 * 00313 IF( IFM.EQ.1 ) THEN 00314 IF( NOE.EQ.1 ) THEN 00315 LDA = N 00316 ELSE 00317 * noe=0 00318 LDA = N + 1 00319 END IF 00320 ELSE 00321 * ifm=0 00322 LDA = ( N+1 ) / 2 00323 END IF 00324 * 00325 IF( LSAME( NORM, 'M' ) ) THEN 00326 * 00327 * Find max(abs(A(i,j))). 00328 * 00329 K = ( N+1 ) / 2 00330 VALUE = ZERO 00331 IF( NOE.EQ.1 ) THEN 00332 * n is odd & n = k + k - 1 00333 IF( IFM.EQ.1 ) THEN 00334 * A is n by k 00335 IF( ILU.EQ.1 ) THEN 00336 * uplo ='L' 00337 J = 0 00338 * -> L(0,0) 00339 VALUE = MAX( VALUE, ABS( DBLE( A( J+J*LDA ) ) ) ) 00340 DO I = 1, N - 1 00341 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00342 END DO 00343 DO J = 1, K - 1 00344 DO I = 0, J - 2 00345 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00346 END DO 00347 I = J - 1 00348 * L(k+j,k+j) 00349 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00350 I = J 00351 * -> L(j,j) 00352 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00353 DO I = J + 1, N - 1 00354 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00355 END DO 00356 END DO 00357 ELSE 00358 * uplo = 'U' 00359 DO J = 0, K - 2 00360 DO I = 0, K + J - 2 00361 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00362 END DO 00363 I = K + J - 1 00364 * -> U(i,i) 00365 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00366 I = I + 1 00367 * =k+j; i -> U(j,j) 00368 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00369 DO I = K + J + 1, N - 1 00370 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00371 END DO 00372 END DO 00373 DO I = 0, N - 2 00374 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00375 * j=k-1 00376 END DO 00377 * i=n-1 -> U(n-1,n-1) 00378 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00379 END IF 00380 ELSE 00381 * xpose case; A is k by n 00382 IF( ILU.EQ.1 ) THEN 00383 * uplo ='L' 00384 DO J = 0, K - 2 00385 DO I = 0, J - 1 00386 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00387 END DO 00388 I = J 00389 * L(i,i) 00390 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00391 I = J + 1 00392 * L(j+k,j+k) 00393 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00394 DO I = J + 2, K - 1 00395 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00396 END DO 00397 END DO 00398 J = K - 1 00399 DO I = 0, K - 2 00400 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00401 END DO 00402 I = K - 1 00403 * -> L(i,i) is at A(i,j) 00404 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00405 DO J = K, N - 1 00406 DO I = 0, K - 1 00407 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00408 END DO 00409 END DO 00410 ELSE 00411 * uplo = 'U' 00412 DO J = 0, K - 2 00413 DO I = 0, K - 1 00414 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00415 END DO 00416 END DO 00417 J = K - 1 00418 * -> U(j,j) is at A(0,j) 00419 VALUE = MAX( VALUE, ABS( DBLE( A( 0+J*LDA ) ) ) ) 00420 DO I = 1, K - 1 00421 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00422 END DO 00423 DO J = K, N - 1 00424 DO I = 0, J - K - 1 00425 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00426 END DO 00427 I = J - K 00428 * -> U(i,i) at A(i,j) 00429 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00430 I = J - K + 1 00431 * U(j,j) 00432 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00433 DO I = J - K + 2, K - 1 00434 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00435 END DO 00436 END DO 00437 END IF 00438 END IF 00439 ELSE 00440 * n is even & k = n/2 00441 IF( IFM.EQ.1 ) THEN 00442 * A is n+1 by k 00443 IF( ILU.EQ.1 ) THEN 00444 * uplo ='L' 00445 J = 0 00446 * -> L(k,k) & j=1 -> L(0,0) 00447 VALUE = MAX( VALUE, ABS( DBLE( A( J+J*LDA ) ) ) ) 00448 VALUE = MAX( VALUE, ABS( DBLE( A( J+1+J*LDA ) ) ) ) 00449 DO I = 2, N 00450 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00451 END DO 00452 DO J = 1, K - 1 00453 DO I = 0, J - 1 00454 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00455 END DO 00456 I = J 00457 * L(k+j,k+j) 00458 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00459 I = J + 1 00460 * -> L(j,j) 00461 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00462 DO I = J + 2, N 00463 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00464 END DO 00465 END DO 00466 ELSE 00467 * uplo = 'U' 00468 DO J = 0, K - 2 00469 DO I = 0, K + J - 1 00470 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00471 END DO 00472 I = K + J 00473 * -> U(i,i) 00474 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00475 I = I + 1 00476 * =k+j+1; i -> U(j,j) 00477 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00478 DO I = K + J + 2, N 00479 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00480 END DO 00481 END DO 00482 DO I = 0, N - 2 00483 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00484 * j=k-1 00485 END DO 00486 * i=n-1 -> U(n-1,n-1) 00487 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00488 I = N 00489 * -> U(k-1,k-1) 00490 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00491 END IF 00492 ELSE 00493 * xpose case; A is k by n+1 00494 IF( ILU.EQ.1 ) THEN 00495 * uplo ='L' 00496 J = 0 00497 * -> L(k,k) at A(0,0) 00498 VALUE = MAX( VALUE, ABS( DBLE( A( J+J*LDA ) ) ) ) 00499 DO I = 1, K - 1 00500 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00501 END DO 00502 DO J = 1, K - 1 00503 DO I = 0, J - 2 00504 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00505 END DO 00506 I = J - 1 00507 * L(i,i) 00508 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00509 I = J 00510 * L(j+k,j+k) 00511 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00512 DO I = J + 1, K - 1 00513 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00514 END DO 00515 END DO 00516 J = K 00517 DO I = 0, K - 2 00518 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00519 END DO 00520 I = K - 1 00521 * -> L(i,i) is at A(i,j) 00522 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00523 DO J = K + 1, N 00524 DO I = 0, K - 1 00525 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00526 END DO 00527 END DO 00528 ELSE 00529 * uplo = 'U' 00530 DO J = 0, K - 1 00531 DO I = 0, K - 1 00532 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00533 END DO 00534 END DO 00535 J = K 00536 * -> U(j,j) is at A(0,j) 00537 VALUE = MAX( VALUE, ABS( DBLE( A( 0+J*LDA ) ) ) ) 00538 DO I = 1, K - 1 00539 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00540 END DO 00541 DO J = K + 1, N - 1 00542 DO I = 0, J - K - 2 00543 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00544 END DO 00545 I = J - K - 1 00546 * -> U(i,i) at A(i,j) 00547 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00548 I = J - K 00549 * U(j,j) 00550 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00551 DO I = J - K + 1, K - 1 00552 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00553 END DO 00554 END DO 00555 J = N 00556 DO I = 0, K - 2 00557 VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) ) 00558 END DO 00559 I = K - 1 00560 * U(k,k) at A(i,j) 00561 VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) ) 00562 END IF 00563 END IF 00564 END IF 00565 ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR. 00566 $ ( NORM.EQ.'1' ) ) THEN 00567 * 00568 * Find normI(A) ( = norm1(A), since A is Hermitian). 00569 * 00570 IF( IFM.EQ.1 ) THEN 00571 * A is 'N' 00572 K = N / 2 00573 IF( NOE.EQ.1 ) THEN 00574 * n is odd & A is n by (n+1)/2 00575 IF( ILU.EQ.0 ) THEN 00576 * uplo = 'U' 00577 DO I = 0, K - 1 00578 WORK( I ) = ZERO 00579 END DO 00580 DO J = 0, K 00581 S = ZERO 00582 DO I = 0, K + J - 1 00583 AA = ABS( A( I+J*LDA ) ) 00584 * -> A(i,j+k) 00585 S = S + AA 00586 WORK( I ) = WORK( I ) + AA 00587 END DO 00588 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00589 * -> A(j+k,j+k) 00590 WORK( J+K ) = S + AA 00591 IF( I.EQ.K+K ) 00592 $ GO TO 10 00593 I = I + 1 00594 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00595 * -> A(j,j) 00596 WORK( J ) = WORK( J ) + AA 00597 S = ZERO 00598 DO L = J + 1, K - 1 00599 I = I + 1 00600 AA = ABS( A( I+J*LDA ) ) 00601 * -> A(l,j) 00602 S = S + AA 00603 WORK( L ) = WORK( L ) + AA 00604 END DO 00605 WORK( J ) = WORK( J ) + S 00606 END DO 00607 10 CONTINUE 00608 I = IDAMAX( N, WORK, 1 ) 00609 VALUE = WORK( I-1 ) 00610 ELSE 00611 * ilu = 1 & uplo = 'L' 00612 K = K + 1 00613 * k=(n+1)/2 for n odd and ilu=1 00614 DO I = K, N - 1 00615 WORK( I ) = ZERO 00616 END DO 00617 DO J = K - 1, 0, -1 00618 S = ZERO 00619 DO I = 0, J - 2 00620 AA = ABS( A( I+J*LDA ) ) 00621 * -> A(j+k,i+k) 00622 S = S + AA 00623 WORK( I+K ) = WORK( I+K ) + AA 00624 END DO 00625 IF( J.GT.0 ) THEN 00626 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00627 * -> A(j+k,j+k) 00628 S = S + AA 00629 WORK( I+K ) = WORK( I+K ) + S 00630 * i=j 00631 I = I + 1 00632 END IF 00633 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00634 * -> A(j,j) 00635 WORK( J ) = AA 00636 S = ZERO 00637 DO L = J + 1, N - 1 00638 I = I + 1 00639 AA = ABS( A( I+J*LDA ) ) 00640 * -> A(l,j) 00641 S = S + AA 00642 WORK( L ) = WORK( L ) + AA 00643 END DO 00644 WORK( J ) = WORK( J ) + S 00645 END DO 00646 I = IDAMAX( N, WORK, 1 ) 00647 VALUE = WORK( I-1 ) 00648 END IF 00649 ELSE 00650 * n is even & A is n+1 by k = n/2 00651 IF( ILU.EQ.0 ) THEN 00652 * uplo = 'U' 00653 DO I = 0, K - 1 00654 WORK( I ) = ZERO 00655 END DO 00656 DO J = 0, K - 1 00657 S = ZERO 00658 DO I = 0, K + J - 1 00659 AA = ABS( A( I+J*LDA ) ) 00660 * -> A(i,j+k) 00661 S = S + AA 00662 WORK( I ) = WORK( I ) + AA 00663 END DO 00664 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00665 * -> A(j+k,j+k) 00666 WORK( J+K ) = S + AA 00667 I = I + 1 00668 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00669 * -> A(j,j) 00670 WORK( J ) = WORK( J ) + AA 00671 S = ZERO 00672 DO L = J + 1, K - 1 00673 I = I + 1 00674 AA = ABS( A( I+J*LDA ) ) 00675 * -> A(l,j) 00676 S = S + AA 00677 WORK( L ) = WORK( L ) + AA 00678 END DO 00679 WORK( J ) = WORK( J ) + S 00680 END DO 00681 I = IDAMAX( N, WORK, 1 ) 00682 VALUE = WORK( I-1 ) 00683 ELSE 00684 * ilu = 1 & uplo = 'L' 00685 DO I = K, N - 1 00686 WORK( I ) = ZERO 00687 END DO 00688 DO J = K - 1, 0, -1 00689 S = ZERO 00690 DO I = 0, J - 1 00691 AA = ABS( A( I+J*LDA ) ) 00692 * -> A(j+k,i+k) 00693 S = S + AA 00694 WORK( I+K ) = WORK( I+K ) + AA 00695 END DO 00696 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00697 * -> A(j+k,j+k) 00698 S = S + AA 00699 WORK( I+K ) = WORK( I+K ) + S 00700 * i=j 00701 I = I + 1 00702 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00703 * -> A(j,j) 00704 WORK( J ) = AA 00705 S = ZERO 00706 DO L = J + 1, N - 1 00707 I = I + 1 00708 AA = ABS( A( I+J*LDA ) ) 00709 * -> A(l,j) 00710 S = S + AA 00711 WORK( L ) = WORK( L ) + AA 00712 END DO 00713 WORK( J ) = WORK( J ) + S 00714 END DO 00715 I = IDAMAX( N, WORK, 1 ) 00716 VALUE = WORK( I-1 ) 00717 END IF 00718 END IF 00719 ELSE 00720 * ifm=0 00721 K = N / 2 00722 IF( NOE.EQ.1 ) THEN 00723 * n is odd & A is (n+1)/2 by n 00724 IF( ILU.EQ.0 ) THEN 00725 * uplo = 'U' 00726 N1 = K 00727 * n/2 00728 K = K + 1 00729 * k is the row size and lda 00730 DO I = N1, N - 1 00731 WORK( I ) = ZERO 00732 END DO 00733 DO J = 0, N1 - 1 00734 S = ZERO 00735 DO I = 0, K - 1 00736 AA = ABS( A( I+J*LDA ) ) 00737 * A(j,n1+i) 00738 WORK( I+N1 ) = WORK( I+N1 ) + AA 00739 S = S + AA 00740 END DO 00741 WORK( J ) = S 00742 END DO 00743 * j=n1=k-1 is special 00744 S = ABS( DBLE( A( 0+J*LDA ) ) ) 00745 * A(k-1,k-1) 00746 DO I = 1, K - 1 00747 AA = ABS( A( I+J*LDA ) ) 00748 * A(k-1,i+n1) 00749 WORK( I+N1 ) = WORK( I+N1 ) + AA 00750 S = S + AA 00751 END DO 00752 WORK( J ) = WORK( J ) + S 00753 DO J = K, N - 1 00754 S = ZERO 00755 DO I = 0, J - K - 1 00756 AA = ABS( A( I+J*LDA ) ) 00757 * A(i,j-k) 00758 WORK( I ) = WORK( I ) + AA 00759 S = S + AA 00760 END DO 00761 * i=j-k 00762 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00763 * A(j-k,j-k) 00764 S = S + AA 00765 WORK( J-K ) = WORK( J-K ) + S 00766 I = I + 1 00767 S = ABS( DBLE( A( I+J*LDA ) ) ) 00768 * A(j,j) 00769 DO L = J + 1, N - 1 00770 I = I + 1 00771 AA = ABS( A( I+J*LDA ) ) 00772 * A(j,l) 00773 WORK( L ) = WORK( L ) + AA 00774 S = S + AA 00775 END DO 00776 WORK( J ) = WORK( J ) + S 00777 END DO 00778 I = IDAMAX( N, WORK, 1 ) 00779 VALUE = WORK( I-1 ) 00780 ELSE 00781 * ilu=1 & uplo = 'L' 00782 K = K + 1 00783 * k=(n+1)/2 for n odd and ilu=1 00784 DO I = K, N - 1 00785 WORK( I ) = ZERO 00786 END DO 00787 DO J = 0, K - 2 00788 * process 00789 S = ZERO 00790 DO I = 0, J - 1 00791 AA = ABS( A( I+J*LDA ) ) 00792 * A(j,i) 00793 WORK( I ) = WORK( I ) + AA 00794 S = S + AA 00795 END DO 00796 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00797 * i=j so process of A(j,j) 00798 S = S + AA 00799 WORK( J ) = S 00800 * is initialised here 00801 I = I + 1 00802 * i=j process A(j+k,j+k) 00803 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00804 S = AA 00805 DO L = K + J + 1, N - 1 00806 I = I + 1 00807 AA = ABS( A( I+J*LDA ) ) 00808 * A(l,k+j) 00809 S = S + AA 00810 WORK( L ) = WORK( L ) + AA 00811 END DO 00812 WORK( K+J ) = WORK( K+J ) + S 00813 END DO 00814 * j=k-1 is special :process col A(k-1,0:k-1) 00815 S = ZERO 00816 DO I = 0, K - 2 00817 AA = ABS( A( I+J*LDA ) ) 00818 * A(k,i) 00819 WORK( I ) = WORK( I ) + AA 00820 S = S + AA 00821 END DO 00822 * i=k-1 00823 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00824 * A(k-1,k-1) 00825 S = S + AA 00826 WORK( I ) = S 00827 * done with col j=k+1 00828 DO J = K, N - 1 00829 * process col j of A = A(j,0:k-1) 00830 S = ZERO 00831 DO I = 0, K - 1 00832 AA = ABS( A( I+J*LDA ) ) 00833 * A(j,i) 00834 WORK( I ) = WORK( I ) + AA 00835 S = S + AA 00836 END DO 00837 WORK( J ) = WORK( J ) + S 00838 END DO 00839 I = IDAMAX( N, WORK, 1 ) 00840 VALUE = WORK( I-1 ) 00841 END IF 00842 ELSE 00843 * n is even & A is k=n/2 by n+1 00844 IF( ILU.EQ.0 ) THEN 00845 * uplo = 'U' 00846 DO I = K, N - 1 00847 WORK( I ) = ZERO 00848 END DO 00849 DO J = 0, K - 1 00850 S = ZERO 00851 DO I = 0, K - 1 00852 AA = ABS( A( I+J*LDA ) ) 00853 * A(j,i+k) 00854 WORK( I+K ) = WORK( I+K ) + AA 00855 S = S + AA 00856 END DO 00857 WORK( J ) = S 00858 END DO 00859 * j=k 00860 AA = ABS( DBLE( A( 0+J*LDA ) ) ) 00861 * A(k,k) 00862 S = AA 00863 DO I = 1, K - 1 00864 AA = ABS( A( I+J*LDA ) ) 00865 * A(k,k+i) 00866 WORK( I+K ) = WORK( I+K ) + AA 00867 S = S + AA 00868 END DO 00869 WORK( J ) = WORK( J ) + S 00870 DO J = K + 1, N - 1 00871 S = ZERO 00872 DO I = 0, J - 2 - K 00873 AA = ABS( A( I+J*LDA ) ) 00874 * A(i,j-k-1) 00875 WORK( I ) = WORK( I ) + AA 00876 S = S + AA 00877 END DO 00878 * i=j-1-k 00879 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00880 * A(j-k-1,j-k-1) 00881 S = S + AA 00882 WORK( J-K-1 ) = WORK( J-K-1 ) + S 00883 I = I + 1 00884 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00885 * A(j,j) 00886 S = AA 00887 DO L = J + 1, N - 1 00888 I = I + 1 00889 AA = ABS( A( I+J*LDA ) ) 00890 * A(j,l) 00891 WORK( L ) = WORK( L ) + AA 00892 S = S + AA 00893 END DO 00894 WORK( J ) = WORK( J ) + S 00895 END DO 00896 * j=n 00897 S = ZERO 00898 DO I = 0, K - 2 00899 AA = ABS( A( I+J*LDA ) ) 00900 * A(i,k-1) 00901 WORK( I ) = WORK( I ) + AA 00902 S = S + AA 00903 END DO 00904 * i=k-1 00905 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00906 * A(k-1,k-1) 00907 S = S + AA 00908 WORK( I ) = WORK( I ) + S 00909 I = IDAMAX( N, WORK, 1 ) 00910 VALUE = WORK( I-1 ) 00911 ELSE 00912 * ilu=1 & uplo = 'L' 00913 DO I = K, N - 1 00914 WORK( I ) = ZERO 00915 END DO 00916 * j=0 is special :process col A(k:n-1,k) 00917 S = ABS( DBLE( A( 0 ) ) ) 00918 * A(k,k) 00919 DO I = 1, K - 1 00920 AA = ABS( A( I ) ) 00921 * A(k+i,k) 00922 WORK( I+K ) = WORK( I+K ) + AA 00923 S = S + AA 00924 END DO 00925 WORK( K ) = WORK( K ) + S 00926 DO J = 1, K - 1 00927 * process 00928 S = ZERO 00929 DO I = 0, J - 2 00930 AA = ABS( A( I+J*LDA ) ) 00931 * A(j-1,i) 00932 WORK( I ) = WORK( I ) + AA 00933 S = S + AA 00934 END DO 00935 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00936 * i=j-1 so process of A(j-1,j-1) 00937 S = S + AA 00938 WORK( J-1 ) = S 00939 * is initialised here 00940 I = I + 1 00941 * i=j process A(j+k,j+k) 00942 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00943 S = AA 00944 DO L = K + J + 1, N - 1 00945 I = I + 1 00946 AA = ABS( A( I+J*LDA ) ) 00947 * A(l,k+j) 00948 S = S + AA 00949 WORK( L ) = WORK( L ) + AA 00950 END DO 00951 WORK( K+J ) = WORK( K+J ) + S 00952 END DO 00953 * j=k is special :process col A(k,0:k-1) 00954 S = ZERO 00955 DO I = 0, K - 2 00956 AA = ABS( A( I+J*LDA ) ) 00957 * A(k,i) 00958 WORK( I ) = WORK( I ) + AA 00959 S = S + AA 00960 END DO 00961 * 00962 * i=k-1 00963 AA = ABS( DBLE( A( I+J*LDA ) ) ) 00964 * A(k-1,k-1) 00965 S = S + AA 00966 WORK( I ) = S 00967 * done with col j=k+1 00968 DO J = K + 1, N 00969 * 00970 * process col j-1 of A = A(j-1,0:k-1) 00971 S = ZERO 00972 DO I = 0, K - 1 00973 AA = ABS( A( I+J*LDA ) ) 00974 * A(j-1,i) 00975 WORK( I ) = WORK( I ) + AA 00976 S = S + AA 00977 END DO 00978 WORK( J-1 ) = WORK( J-1 ) + S 00979 END DO 00980 I = IDAMAX( N, WORK, 1 ) 00981 VALUE = WORK( I-1 ) 00982 END IF 00983 END IF 00984 END IF 00985 ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN 00986 * 00987 * Find normF(A). 00988 * 00989 K = ( N+1 ) / 2 00990 SCALE = ZERO 00991 S = ONE 00992 IF( NOE.EQ.1 ) THEN 00993 * n is odd 00994 IF( IFM.EQ.1 ) THEN 00995 * A is normal & A is n by k 00996 IF( ILU.EQ.0 ) THEN 00997 * A is upper 00998 DO J = 0, K - 3 00999 CALL ZLASSQ( K-J-2, A( K+J+1+J*LDA ), 1, SCALE, S ) 01000 * L at A(k,0) 01001 END DO 01002 DO J = 0, K - 1 01003 CALL ZLASSQ( K+J-1, A( 0+J*LDA ), 1, SCALE, S ) 01004 * trap U at A(0,0) 01005 END DO 01006 S = S + S 01007 * double s for the off diagonal elements 01008 L = K - 1 01009 * -> U(k,k) at A(k-1,0) 01010 DO I = 0, K - 2 01011 AA = DBLE( A( L ) ) 01012 * U(k+i,k+i) 01013 IF( AA.NE.ZERO ) THEN 01014 IF( SCALE.LT.AA ) THEN 01015 S = ONE + S*( SCALE / AA )**2 01016 SCALE = AA 01017 ELSE 01018 S = S + ( AA / SCALE )**2 01019 END IF 01020 END IF 01021 AA = DBLE( A( L+1 ) ) 01022 * U(i,i) 01023 IF( AA.NE.ZERO ) THEN 01024 IF( SCALE.LT.AA ) THEN 01025 S = ONE + S*( SCALE / AA )**2 01026 SCALE = AA 01027 ELSE 01028 S = S + ( AA / SCALE )**2 01029 END IF 01030 END IF 01031 L = L + LDA + 1 01032 END DO 01033 AA = DBLE( A( L ) ) 01034 * U(n-1,n-1) 01035 IF( AA.NE.ZERO ) THEN 01036 IF( SCALE.LT.AA ) THEN 01037 S = ONE + S*( SCALE / AA )**2 01038 SCALE = AA 01039 ELSE 01040 S = S + ( AA / SCALE )**2 01041 END IF 01042 END IF 01043 ELSE 01044 * ilu=1 & A is lower 01045 DO J = 0, K - 1 01046 CALL ZLASSQ( N-J-1, A( J+1+J*LDA ), 1, SCALE, S ) 01047 * trap L at A(0,0) 01048 END DO 01049 DO J = 1, K - 2 01050 CALL ZLASSQ( J, A( 0+( 1+J )*LDA ), 1, SCALE, S ) 01051 * U at A(0,1) 01052 END DO 01053 S = S + S 01054 * double s for the off diagonal elements 01055 AA = DBLE( A( 0 ) ) 01056 * L(0,0) at A(0,0) 01057 IF( AA.NE.ZERO ) THEN 01058 IF( SCALE.LT.AA ) THEN 01059 S = ONE + S*( SCALE / AA )**2 01060 SCALE = AA 01061 ELSE 01062 S = S + ( AA / SCALE )**2 01063 END IF 01064 END IF 01065 L = LDA 01066 * -> L(k,k) at A(0,1) 01067 DO I = 1, K - 1 01068 AA = DBLE( A( L ) ) 01069 * L(k-1+i,k-1+i) 01070 IF( AA.NE.ZERO ) THEN 01071 IF( SCALE.LT.AA ) THEN 01072 S = ONE + S*( SCALE / AA )**2 01073 SCALE = AA 01074 ELSE 01075 S = S + ( AA / SCALE )**2 01076 END IF 01077 END IF 01078 AA = DBLE( A( L+1 ) ) 01079 * L(i,i) 01080 IF( AA.NE.ZERO ) THEN 01081 IF( SCALE.LT.AA ) THEN 01082 S = ONE + S*( SCALE / AA )**2 01083 SCALE = AA 01084 ELSE 01085 S = S + ( AA / SCALE )**2 01086 END IF 01087 END IF 01088 L = L + LDA + 1 01089 END DO 01090 END IF 01091 ELSE 01092 * A is xpose & A is k by n 01093 IF( ILU.EQ.0 ) THEN 01094 * A**H is upper 01095 DO J = 1, K - 2 01096 CALL ZLASSQ( J, A( 0+( K+J )*LDA ), 1, SCALE, S ) 01097 * U at A(0,k) 01098 END DO 01099 DO J = 0, K - 2 01100 CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S ) 01101 * k by k-1 rect. at A(0,0) 01102 END DO 01103 DO J = 0, K - 2 01104 CALL ZLASSQ( K-J-1, A( J+1+( J+K-1 )*LDA ), 1, 01105 $ SCALE, S ) 01106 * L at A(0,k-1) 01107 END DO 01108 S = S + S 01109 * double s for the off diagonal elements 01110 L = 0 + K*LDA - LDA 01111 * -> U(k-1,k-1) at A(0,k-1) 01112 AA = DBLE( A( L ) ) 01113 * U(k-1,k-1) 01114 IF( AA.NE.ZERO ) THEN 01115 IF( SCALE.LT.AA ) THEN 01116 S = ONE + S*( SCALE / AA )**2 01117 SCALE = AA 01118 ELSE 01119 S = S + ( AA / SCALE )**2 01120 END IF 01121 END IF 01122 L = L + LDA 01123 * -> U(0,0) at A(0,k) 01124 DO J = K, N - 1 01125 AA = DBLE( A( L ) ) 01126 * -> U(j-k,j-k) 01127 IF( AA.NE.ZERO ) THEN 01128 IF( SCALE.LT.AA ) THEN 01129 S = ONE + S*( SCALE / AA )**2 01130 SCALE = AA 01131 ELSE 01132 S = S + ( AA / SCALE )**2 01133 END IF 01134 END IF 01135 AA = DBLE( A( L+1 ) ) 01136 * -> U(j,j) 01137 IF( AA.NE.ZERO ) THEN 01138 IF( SCALE.LT.AA ) THEN 01139 S = ONE + S*( SCALE / AA )**2 01140 SCALE = AA 01141 ELSE 01142 S = S + ( AA / SCALE )**2 01143 END IF 01144 END IF 01145 L = L + LDA + 1 01146 END DO 01147 ELSE 01148 * A**H is lower 01149 DO J = 1, K - 1 01150 CALL ZLASSQ( J, A( 0+J*LDA ), 1, SCALE, S ) 01151 * U at A(0,0) 01152 END DO 01153 DO J = K, N - 1 01154 CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S ) 01155 * k by k-1 rect. at A(0,k) 01156 END DO 01157 DO J = 0, K - 3 01158 CALL ZLASSQ( K-J-2, A( J+2+J*LDA ), 1, SCALE, S ) 01159 * L at A(1,0) 01160 END DO 01161 S = S + S 01162 * double s for the off diagonal elements 01163 L = 0 01164 * -> L(0,0) at A(0,0) 01165 DO I = 0, K - 2 01166 AA = DBLE( A( L ) ) 01167 * L(i,i) 01168 IF( AA.NE.ZERO ) THEN 01169 IF( SCALE.LT.AA ) THEN 01170 S = ONE + S*( SCALE / AA )**2 01171 SCALE = AA 01172 ELSE 01173 S = S + ( AA / SCALE )**2 01174 END IF 01175 END IF 01176 AA = DBLE( A( L+1 ) ) 01177 * L(k+i,k+i) 01178 IF( AA.NE.ZERO ) THEN 01179 IF( SCALE.LT.AA ) THEN 01180 S = ONE + S*( SCALE / AA )**2 01181 SCALE = AA 01182 ELSE 01183 S = S + ( AA / SCALE )**2 01184 END IF 01185 END IF 01186 L = L + LDA + 1 01187 END DO 01188 * L-> k-1 + (k-1)*lda or L(k-1,k-1) at A(k-1,k-1) 01189 AA = DBLE( A( L ) ) 01190 * L(k-1,k-1) at A(k-1,k-1) 01191 IF( AA.NE.ZERO ) THEN 01192 IF( SCALE.LT.AA ) THEN 01193 S = ONE + S*( SCALE / AA )**2 01194 SCALE = AA 01195 ELSE 01196 S = S + ( AA / SCALE )**2 01197 END IF 01198 END IF 01199 END IF 01200 END IF 01201 ELSE 01202 * n is even 01203 IF( IFM.EQ.1 ) THEN 01204 * A is normal 01205 IF( ILU.EQ.0 ) THEN 01206 * A is upper 01207 DO J = 0, K - 2 01208 CALL ZLASSQ( K-J-1, A( K+J+2+J*LDA ), 1, SCALE, S ) 01209 * L at A(k+1,0) 01210 END DO 01211 DO J = 0, K - 1 01212 CALL ZLASSQ( K+J, A( 0+J*LDA ), 1, SCALE, S ) 01213 * trap U at A(0,0) 01214 END DO 01215 S = S + S 01216 * double s for the off diagonal elements 01217 L = K 01218 * -> U(k,k) at A(k,0) 01219 DO I = 0, K - 1 01220 AA = DBLE( A( L ) ) 01221 * U(k+i,k+i) 01222 IF( AA.NE.ZERO ) THEN 01223 IF( SCALE.LT.AA ) THEN 01224 S = ONE + S*( SCALE / AA )**2 01225 SCALE = AA 01226 ELSE 01227 S = S + ( AA / SCALE )**2 01228 END IF 01229 END IF 01230 AA = DBLE( A( L+1 ) ) 01231 * U(i,i) 01232 IF( AA.NE.ZERO ) THEN 01233 IF( SCALE.LT.AA ) THEN 01234 S = ONE + S*( SCALE / AA )**2 01235 SCALE = AA 01236 ELSE 01237 S = S + ( AA / SCALE )**2 01238 END IF 01239 END IF 01240 L = L + LDA + 1 01241 END DO 01242 ELSE 01243 * ilu=1 & A is lower 01244 DO J = 0, K - 1 01245 CALL ZLASSQ( N-J-1, A( J+2+J*LDA ), 1, SCALE, S ) 01246 * trap L at A(1,0) 01247 END DO 01248 DO J = 1, K - 1 01249 CALL ZLASSQ( J, A( 0+J*LDA ), 1, SCALE, S ) 01250 * U at A(0,0) 01251 END DO 01252 S = S + S 01253 * double s for the off diagonal elements 01254 L = 0 01255 * -> L(k,k) at A(0,0) 01256 DO I = 0, K - 1 01257 AA = DBLE( A( L ) ) 01258 * L(k-1+i,k-1+i) 01259 IF( AA.NE.ZERO ) THEN 01260 IF( SCALE.LT.AA ) THEN 01261 S = ONE + S*( SCALE / AA )**2 01262 SCALE = AA 01263 ELSE 01264 S = S + ( AA / SCALE )**2 01265 END IF 01266 END IF 01267 AA = DBLE( A( L+1 ) ) 01268 * L(i,i) 01269 IF( AA.NE.ZERO ) THEN 01270 IF( SCALE.LT.AA ) THEN 01271 S = ONE + S*( SCALE / AA )**2 01272 SCALE = AA 01273 ELSE 01274 S = S + ( AA / SCALE )**2 01275 END IF 01276 END IF 01277 L = L + LDA + 1 01278 END DO 01279 END IF 01280 ELSE 01281 * A is xpose 01282 IF( ILU.EQ.0 ) THEN 01283 * A**H is upper 01284 DO J = 1, K - 1 01285 CALL ZLASSQ( J, A( 0+( K+1+J )*LDA ), 1, SCALE, S ) 01286 * U at A(0,k+1) 01287 END DO 01288 DO J = 0, K - 1 01289 CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S ) 01290 * k by k rect. at A(0,0) 01291 END DO 01292 DO J = 0, K - 2 01293 CALL ZLASSQ( K-J-1, A( J+1+( J+K )*LDA ), 1, SCALE, 01294 $ S ) 01295 * L at A(0,k) 01296 END DO 01297 S = S + S 01298 * double s for the off diagonal elements 01299 L = 0 + K*LDA 01300 * -> U(k,k) at A(0,k) 01301 AA = DBLE( A( L ) ) 01302 * U(k,k) 01303 IF( AA.NE.ZERO ) THEN 01304 IF( SCALE.LT.AA ) THEN 01305 S = ONE + S*( SCALE / AA )**2 01306 SCALE = AA 01307 ELSE 01308 S = S + ( AA / SCALE )**2 01309 END IF 01310 END IF 01311 L = L + LDA 01312 * -> U(0,0) at A(0,k+1) 01313 DO J = K + 1, N - 1 01314 AA = DBLE( A( L ) ) 01315 * -> U(j-k-1,j-k-1) 01316 IF( AA.NE.ZERO ) THEN 01317 IF( SCALE.LT.AA ) THEN 01318 S = ONE + S*( SCALE / AA )**2 01319 SCALE = AA 01320 ELSE 01321 S = S + ( AA / SCALE )**2 01322 END IF 01323 END IF 01324 AA = DBLE( A( L+1 ) ) 01325 * -> U(j,j) 01326 IF( AA.NE.ZERO ) THEN 01327 IF( SCALE.LT.AA ) THEN 01328 S = ONE + S*( SCALE / AA )**2 01329 SCALE = AA 01330 ELSE 01331 S = S + ( AA / SCALE )**2 01332 END IF 01333 END IF 01334 L = L + LDA + 1 01335 END DO 01336 * L=k-1+n*lda 01337 * -> U(k-1,k-1) at A(k-1,n) 01338 AA = DBLE( A( L ) ) 01339 * U(k,k) 01340 IF( AA.NE.ZERO ) THEN 01341 IF( SCALE.LT.AA ) THEN 01342 S = ONE + S*( SCALE / AA )**2 01343 SCALE = AA 01344 ELSE 01345 S = S + ( AA / SCALE )**2 01346 END IF 01347 END IF 01348 ELSE 01349 * A**H is lower 01350 DO J = 1, K - 1 01351 CALL ZLASSQ( J, A( 0+( J+1 )*LDA ), 1, SCALE, S ) 01352 * U at A(0,1) 01353 END DO 01354 DO J = K + 1, N 01355 CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S ) 01356 * k by k rect. at A(0,k+1) 01357 END DO 01358 DO J = 0, K - 2 01359 CALL ZLASSQ( K-J-1, A( J+1+J*LDA ), 1, SCALE, S ) 01360 * L at A(0,0) 01361 END DO 01362 S = S + S 01363 * double s for the off diagonal elements 01364 L = 0 01365 * -> L(k,k) at A(0,0) 01366 AA = DBLE( A( L ) ) 01367 * L(k,k) at A(0,0) 01368 IF( AA.NE.ZERO ) THEN 01369 IF( SCALE.LT.AA ) THEN 01370 S = ONE + S*( SCALE / AA )**2 01371 SCALE = AA 01372 ELSE 01373 S = S + ( AA / SCALE )**2 01374 END IF 01375 END IF 01376 L = LDA 01377 * -> L(0,0) at A(0,1) 01378 DO I = 0, K - 2 01379 AA = DBLE( A( L ) ) 01380 * L(i,i) 01381 IF( AA.NE.ZERO ) THEN 01382 IF( SCALE.LT.AA ) THEN 01383 S = ONE + S*( SCALE / AA )**2 01384 SCALE = AA 01385 ELSE 01386 S = S + ( AA / SCALE )**2 01387 END IF 01388 END IF 01389 AA = DBLE( A( L+1 ) ) 01390 * L(k+i+1,k+i+1) 01391 IF( AA.NE.ZERO ) THEN 01392 IF( SCALE.LT.AA ) THEN 01393 S = ONE + S*( SCALE / AA )**2 01394 SCALE = AA 01395 ELSE 01396 S = S + ( AA / SCALE )**2 01397 END IF 01398 END IF 01399 L = L + LDA + 1 01400 END DO 01401 * L-> k - 1 + k*lda or L(k-1,k-1) at A(k-1,k) 01402 AA = DBLE( A( L ) ) 01403 * L(k-1,k-1) at A(k-1,k) 01404 IF( AA.NE.ZERO ) THEN 01405 IF( SCALE.LT.AA ) THEN 01406 S = ONE + S*( SCALE / AA )**2 01407 SCALE = AA 01408 ELSE 01409 S = S + ( AA / SCALE )**2 01410 END IF 01411 END IF 01412 END IF 01413 END IF 01414 END IF 01415 VALUE = SCALE*SQRT( S ) 01416 END IF 01417 * 01418 ZLANHF = VALUE 01419 RETURN 01420 * 01421 * End of ZLANHF 01422 * 01423 END