134 SUBROUTINE claic1( JOB, J, X, SEST, W, GAMMA, SESTPR, S, C )
146 COMPLEX W( j ), X( j )
153 parameter( zero = 0.0e0, one = 1.0e0, two = 2.0e0 )
155 parameter( half = 0.5e0, four = 4.0e0 )
158 REAL ABSALP, ABSEST, ABSGAM, B, EPS, NORMA, S1, S2,
159 $ scl, t, test, tmp, zeta1, zeta2
160 COMPLEX ALPHA, COSINE, SINE
163 INTRINSIC abs, conjg, max, sqrt
168 EXTERNAL slamch, cdotc
172 eps = slamch(
'Epsilon' )
173 alpha = cdotc( j, x, 1, w, 1 )
175 absalp = abs( alpha )
176 absgam = abs( gamma )
185 IF( sest.EQ.zero )
THEN 186 s1 = max( absgam, absalp )
187 IF( s1.EQ.zero )
THEN 194 tmp =
REAL( SQRT( S*CONJG( S )+C*CONJG( C ) ) )
200 ELSE IF( absgam.LE.eps*absest )
THEN 203 tmp = max( absest, absalp )
206 sestpr = tmp*sqrt( s1*s1+s2*s2 )
208 ELSE IF( absalp.LE.eps*absest )
THEN 221 ELSE IF( absest.LE.eps*absalp .OR. absest.LE.eps*absgam )
THEN 226 scl = sqrt( one+tmp*tmp )
228 s = ( alpha / s2 ) / scl
229 c = ( gamma / s2 ) / scl
232 scl = sqrt( one+tmp*tmp )
234 s = ( alpha / s1 ) / scl
235 c = ( gamma / s1 ) / scl
242 zeta1 = absalp / absest
243 zeta2 = absgam / absest
245 b = ( one-zeta1*zeta1-zeta2*zeta2 )*half
248 t =
REAL( C / ( B+SQRT( B*B+C ) ) )
250 t =
REAL( SQRT( B*B+C ) - B )
253 sine = -( alpha / absest ) / t
254 cosine = -( gamma / absest ) / ( one+t )
255 tmp =
REAL( SQRT( SINE * CONJG( SINE )
$ + COSINE * CONJG( COSINE ) ) 262 ELSE IF( job.EQ.2 )
THEN 268 IF( sest.EQ.zero )
THEN 270 IF( max( absgam, absalp ).EQ.zero )
THEN 274 sine = -conjg( gamma )
275 cosine = conjg( alpha )
277 s1 = max( abs( sine ), abs( cosine ) )
280 tmp =
REAL( SQRT( S*CONJG( S )+C*CONJG( C ) ) )
284 ELSE IF( absgam.LE.eps*absest )
THEN 289 ELSE IF( absalp.LE.eps*absest )
THEN 302 ELSE IF( absest.LE.eps*absalp .OR. absest.LE.eps*absgam )
THEN 307 scl = sqrt( one+tmp*tmp )
308 sestpr = absest*( tmp / scl )
309 s = -( conjg( gamma ) / s2 ) / scl
310 c = ( conjg( alpha ) / s2 ) / scl
313 scl = sqrt( one+tmp*tmp )
314 sestpr = absest / scl
315 s = -( conjg( gamma ) / s1 ) / scl
316 c = ( conjg( alpha ) / s1 ) / scl
323 zeta1 = absalp / absest
324 zeta2 = absgam / absest
326 norma = max( one+zeta1*zeta1+zeta1*zeta2,
327 $ zeta1*zeta2+zeta2*zeta2 )
331 test = one + two*( zeta1-zeta2 )*( zeta1+zeta2 )
332 IF( test.GE.zero )
THEN 336 b = ( zeta1*zeta1+zeta2*zeta2+one )*half
338 t =
REAL( C / ( B+SQRT( ABS( B*B-C ) ) ) )
339 sine = ( alpha / absest ) / ( one-t )
340 cosine = -( gamma / absest ) / t
341 sestpr = sqrt( t+four*eps*eps*norma )*absest
346 b = ( zeta2*zeta2+zeta1*zeta1-one )*half
349 t =
REAL( -C / ( B+SQRT( B*B+C ) ) )
351 t =
REAL( B - SQRT( B*B+C ) )
353 sine = -( alpha / absest ) / t
354 cosine = -( gamma / absest ) / ( one+t )
355 sestpr = sqrt( one+t+four*eps*eps*norma )*absest
357 tmp =
REAL( SQRT( SINE * CONJG( SINE )
$ + COSINE * CONJG( COSINE ) ) 369 subroutine claic1(JOB, J, X, SEST, W, GAMMA, SESTPR, S, C)
CLAIC1 applies one step of incremental condition estimation.