00001 SUBROUTINE ZGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER INFO, LDB, N, NRHS
00010
00011
00012 COMPLEX*16 B( LDB, * ), D( * ), DL( * ), DU( * )
00013
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
00072 COMPLEX*16 ZERO
00073 PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) )
00074
00075
00076 INTEGER J, K
00077 COMPLEX*16 MULT, TEMP, ZDUM
00078
00079
00080 INTRINSIC ABS, DBLE, DIMAG, MAX
00081
00082
00083 EXTERNAL XERBLA
00084
00085
00086 DOUBLE PRECISION CABS1
00087
00088
00089 CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
00090
00091
00092
00093 INFO = 0
00094 IF( N.LT.0 ) THEN
00095 INFO = -1
00096 ELSE IF( NRHS.LT.0 ) THEN
00097 INFO = -2
00098 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
00099 INFO = -7
00100 END IF
00101 IF( INFO.NE.0 ) THEN
00102 CALL XERBLA( 'ZGTSV ', -INFO )
00103 RETURN
00104 END IF
00105
00106 IF( N.EQ.0 )
00107 $ RETURN
00108
00109 DO 30 K = 1, N - 1
00110 IF( DL( K ).EQ.ZERO ) THEN
00111
00112
00113
00114 IF( D( K ).EQ.ZERO ) THEN
00115
00116
00117
00118
00119 INFO = K
00120 RETURN
00121 END IF
00122 ELSE IF( CABS1( D( K ) ).GE.CABS1( DL( K ) ) ) THEN
00123
00124
00125
00126 MULT = DL( K ) / D( K )
00127 D( K+1 ) = D( K+1 ) - MULT*DU( K )
00128 DO 10 J = 1, NRHS
00129 B( K+1, J ) = B( K+1, J ) - MULT*B( K, J )
00130 10 CONTINUE
00131 IF( K.LT.( N-1 ) )
00132 $ DL( K ) = ZERO
00133 ELSE
00134
00135
00136
00137 MULT = D( K ) / DL( K )
00138 D( K ) = DL( K )
00139 TEMP = D( K+1 )
00140 D( K+1 ) = DU( K ) - MULT*TEMP
00141 IF( K.LT.( N-1 ) ) THEN
00142 DL( K ) = DU( K+1 )
00143 DU( K+1 ) = -MULT*DL( K )
00144 END IF
00145 DU( K ) = TEMP
00146 DO 20 J = 1, NRHS
00147 TEMP = B( K, J )
00148 B( K, J ) = B( K+1, J )
00149 B( K+1, J ) = TEMP - MULT*B( K+1, J )
00150 20 CONTINUE
00151 END IF
00152 30 CONTINUE
00153 IF( D( N ).EQ.ZERO ) THEN
00154 INFO = N
00155 RETURN
00156 END IF
00157
00158
00159
00160 DO 50 J = 1, NRHS
00161 B( N, J ) = B( N, J ) / D( N )
00162 IF( N.GT.1 )
00163 $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
00164 DO 40 K = N - 2, 1, -1
00165 B( K, J ) = ( B( K, J )-DU( K )*B( K+1, J )-DL( K )*
00166 $ B( K+2, J ) ) / D( K )
00167 40 CONTINUE
00168 50 CONTINUE
00169
00170 RETURN
00171
00172
00173
00174 END