00001 DOUBLE PRECISION FUNCTION ZLANSP( NORM, UPLO, N, AP, WORK )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER NORM, UPLO
00010 INTEGER N
00011
00012
00013 DOUBLE PRECISION WORK( * )
00014 COMPLEX*16 AP( * )
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 DOUBLE PRECISION ONE, ZERO
00074 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
00075
00076
00077 INTEGER I, J, K
00078 DOUBLE PRECISION ABSA, SCALE, SUM, VALUE
00079
00080
00081 LOGICAL LSAME
00082 EXTERNAL LSAME
00083
00084
00085 EXTERNAL ZLASSQ
00086
00087
00088 INTRINSIC ABS, DBLE, DIMAG, MAX, SQRT
00089
00090
00091
00092 IF( N.EQ.0 ) THEN
00093 VALUE = ZERO
00094 ELSE IF( LSAME( NORM, 'M' ) ) THEN
00095
00096
00097
00098 VALUE = ZERO
00099 IF( LSAME( UPLO, 'U' ) ) THEN
00100 K = 1
00101 DO 20 J = 1, N
00102 DO 10 I = K, K + J - 1
00103 VALUE = MAX( VALUE, ABS( AP( I ) ) )
00104 10 CONTINUE
00105 K = K + J
00106 20 CONTINUE
00107 ELSE
00108 K = 1
00109 DO 40 J = 1, N
00110 DO 30 I = K, K + N - J
00111 VALUE = MAX( VALUE, ABS( AP( I ) ) )
00112 30 CONTINUE
00113 K = K + N - J + 1
00114 40 CONTINUE
00115 END IF
00116 ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
00117 $ ( NORM.EQ.'1' ) ) THEN
00118
00119
00120
00121 VALUE = ZERO
00122 K = 1
00123 IF( LSAME( UPLO, 'U' ) ) THEN
00124 DO 60 J = 1, N
00125 SUM = ZERO
00126 DO 50 I = 1, J - 1
00127 ABSA = ABS( AP( K ) )
00128 SUM = SUM + ABSA
00129 WORK( I ) = WORK( I ) + ABSA
00130 K = K + 1
00131 50 CONTINUE
00132 WORK( J ) = SUM + ABS( AP( K ) )
00133 K = K + 1
00134 60 CONTINUE
00135 DO 70 I = 1, N
00136 VALUE = MAX( VALUE, WORK( I ) )
00137 70 CONTINUE
00138 ELSE
00139 DO 80 I = 1, N
00140 WORK( I ) = ZERO
00141 80 CONTINUE
00142 DO 100 J = 1, N
00143 SUM = WORK( J ) + ABS( AP( K ) )
00144 K = K + 1
00145 DO 90 I = J + 1, N
00146 ABSA = ABS( AP( K ) )
00147 SUM = SUM + ABSA
00148 WORK( I ) = WORK( I ) + ABSA
00149 K = K + 1
00150 90 CONTINUE
00151 VALUE = MAX( VALUE, SUM )
00152 100 CONTINUE
00153 END IF
00154 ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
00155
00156
00157
00158 SCALE = ZERO
00159 SUM = ONE
00160 K = 2
00161 IF( LSAME( UPLO, 'U' ) ) THEN
00162 DO 110 J = 2, N
00163 CALL ZLASSQ( J-1, AP( K ), 1, SCALE, SUM )
00164 K = K + J
00165 110 CONTINUE
00166 ELSE
00167 DO 120 J = 1, N - 1
00168 CALL ZLASSQ( N-J, AP( K ), 1, SCALE, SUM )
00169 K = K + N - J + 1
00170 120 CONTINUE
00171 END IF
00172 SUM = 2*SUM
00173 K = 1
00174 DO 130 I = 1, N
00175 IF( DBLE( AP( K ) ).NE.ZERO ) THEN
00176 ABSA = ABS( DBLE( AP( K ) ) )
00177 IF( SCALE.LT.ABSA ) THEN
00178 SUM = ONE + SUM*( SCALE / ABSA )**2
00179 SCALE = ABSA
00180 ELSE
00181 SUM = SUM + ( ABSA / SCALE )**2
00182 END IF
00183 END IF
00184 IF( DIMAG( AP( K ) ).NE.ZERO ) THEN
00185 ABSA = ABS( DIMAG( AP( K ) ) )
00186 IF( SCALE.LT.ABSA ) THEN
00187 SUM = ONE + SUM*( SCALE / ABSA )**2
00188 SCALE = ABSA
00189 ELSE
00190 SUM = SUM + ( ABSA / SCALE )**2
00191 END IF
00192 END IF
00193 IF( LSAME( UPLO, 'U' ) ) THEN
00194 K = K + I + 1
00195 ELSE
00196 K = K + N - I + 1
00197 END IF
00198 130 CONTINUE
00199 VALUE = SCALE*SQRT( SUM )
00200 END IF
00201
00202 ZLANSP = VALUE
00203 RETURN
00204
00205
00206
00207 END