00001 SUBROUTINE ZTPTRI( UPLO, DIAG, N, AP, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER DIAG, UPLO
00010 INTEGER INFO, N
00011
00012
00013 COMPLEX*16 AP( * )
00014
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 COMPLEX*16 ONE, ZERO
00072 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ),
00073 $ ZERO = ( 0.0D+0, 0.0D+0 ) )
00074
00075
00076 LOGICAL NOUNIT, UPPER
00077 INTEGER J, JC, JCLAST, JJ
00078 COMPLEX*16 AJJ
00079
00080
00081 LOGICAL LSAME
00082 EXTERNAL LSAME
00083
00084
00085 EXTERNAL XERBLA, ZSCAL, ZTPMV
00086
00087
00088
00089
00090
00091 INFO = 0
00092 UPPER = LSAME( UPLO, 'U' )
00093 NOUNIT = LSAME( DIAG, 'N' )
00094 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00095 INFO = -1
00096 ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
00097 INFO = -2
00098 ELSE IF( N.LT.0 ) THEN
00099 INFO = -3
00100 END IF
00101 IF( INFO.NE.0 ) THEN
00102 CALL XERBLA( 'ZTPTRI', -INFO )
00103 RETURN
00104 END IF
00105
00106
00107
00108 IF( NOUNIT ) THEN
00109 IF( UPPER ) THEN
00110 JJ = 0
00111 DO 10 INFO = 1, N
00112 JJ = JJ + INFO
00113 IF( AP( JJ ).EQ.ZERO )
00114 $ RETURN
00115 10 CONTINUE
00116 ELSE
00117 JJ = 1
00118 DO 20 INFO = 1, N
00119 IF( AP( JJ ).EQ.ZERO )
00120 $ RETURN
00121 JJ = JJ + N - INFO + 1
00122 20 CONTINUE
00123 END IF
00124 INFO = 0
00125 END IF
00126
00127 IF( UPPER ) THEN
00128
00129
00130
00131 JC = 1
00132 DO 30 J = 1, N
00133 IF( NOUNIT ) THEN
00134 AP( JC+J-1 ) = ONE / AP( JC+J-1 )
00135 AJJ = -AP( JC+J-1 )
00136 ELSE
00137 AJJ = -ONE
00138 END IF
00139
00140
00141
00142 CALL ZTPMV( 'Upper', 'No transpose', DIAG, J-1, AP,
00143 $ AP( JC ), 1 )
00144 CALL ZSCAL( J-1, AJJ, AP( JC ), 1 )
00145 JC = JC + J
00146 30 CONTINUE
00147
00148 ELSE
00149
00150
00151
00152 JC = N*( N+1 ) / 2
00153 DO 40 J = N, 1, -1
00154 IF( NOUNIT ) THEN
00155 AP( JC ) = ONE / AP( JC )
00156 AJJ = -AP( JC )
00157 ELSE
00158 AJJ = -ONE
00159 END IF
00160 IF( J.LT.N ) THEN
00161
00162
00163
00164 CALL ZTPMV( 'Lower', 'No transpose', DIAG, N-J,
00165 $ AP( JCLAST ), AP( JC+1 ), 1 )
00166 CALL ZSCAL( N-J, AJJ, AP( JC+1 ), 1 )
00167 END IF
00168 JCLAST = JC
00169 JC = JC - N + J - 2
00170 40 CONTINUE
00171 END IF
00172
00173 RETURN
00174
00175
00176
00177 END