132 SUBROUTINE claic1( JOB, J, X, SEST, W, GAMMA, SESTPR, S, C )
144 COMPLEX W( J ), X( J )
151 parameter( zero = 0.0e0, one = 1.0e0, two = 2.0e0 )
153 parameter( half = 0.5e0, four = 4.0e0 )
156 REAL ABSALP, ABSEST, ABSGAM, B, EPS, NORMA, S1, S2,
157 $ SCL, T, TEST, TMP, ZETA1, ZETA2
158 COMPLEX ALPHA, COSINE, SINE
161 INTRINSIC abs, conjg, max, sqrt
166 EXTERNAL slamch, cdotc
170 eps = slamch(
'Epsilon' )
171 alpha = cdotc( j, x, 1, w, 1 )
173 absalp = abs( alpha )
174 absgam = abs( gamma )
183 IF( sest.EQ.zero )
THEN
184 s1 = max( absgam, absalp )
185 IF( s1.EQ.zero )
THEN
192 tmp = real( sqrt( s*conjg( s )+c*conjg( c ) ) )
198 ELSE IF( absgam.LE.eps*absest )
THEN
201 tmp = max( absest, absalp )
204 sestpr = tmp*sqrt( s1*s1+s2*s2 )
206 ELSE IF( absalp.LE.eps*absest )
THEN
219 ELSE IF( absest.LE.eps*absalp .OR. absest.LE.eps*absgam )
THEN
224 scl = sqrt( one+tmp*tmp )
226 s = ( alpha / s2 ) / scl
227 c = ( gamma / s2 ) / scl
230 scl = sqrt( one+tmp*tmp )
232 s = ( alpha / s1 ) / scl
233 c = ( gamma / s1 ) / scl
240 zeta1 = absalp / absest
241 zeta2 = absgam / absest
243 b = ( one-zeta1*zeta1-zeta2*zeta2 )*half
246 t = real( c / ( b+sqrt( b*b+c ) ) )
248 t = real( sqrt( b*b+c ) - b )
251 sine = -( alpha / absest ) / t
252 cosine = -( gamma / absest ) / ( one+t )
253 tmp = real( sqrt( sine * conjg( sine )
254 $ + cosine * conjg( cosine ) ) )
257 sestpr = sqrt( t+one )*absest
261 ELSE IF( job.EQ.2 )
THEN
267 IF( sest.EQ.zero )
THEN
269 IF( max( absgam, absalp ).EQ.zero )
THEN
273 sine = -conjg( gamma )
274 cosine = conjg( alpha )
276 s1 = max( abs( sine ), abs( cosine ) )
279 tmp = real( sqrt( s*conjg( s )+c*conjg( c ) ) )
283 ELSE IF( absgam.LE.eps*absest )
THEN
288 ELSE IF( absalp.LE.eps*absest )
THEN
301 ELSE IF( absest.LE.eps*absalp .OR. absest.LE.eps*absgam )
THEN
306 scl = sqrt( one+tmp*tmp )
307 sestpr = absest*( tmp / scl )
308 s = -( conjg( gamma ) / s2 ) / scl
309 c = ( conjg( alpha ) / s2 ) / scl
312 scl = sqrt( one+tmp*tmp )
313 sestpr = absest / scl
314 s = -( conjg( gamma ) / s1 ) / scl
315 c = ( conjg( alpha ) / s1 ) / scl
322 zeta1 = absalp / absest
323 zeta2 = absgam / absest
325 norma = max( one+zeta1*zeta1+zeta1*zeta2,
326 $ zeta1*zeta2+zeta2*zeta2 )
330 test = one + two*( zeta1-zeta2 )*( zeta1+zeta2 )
331 IF( test.GE.zero )
THEN
335 b = ( zeta1*zeta1+zeta2*zeta2+one )*half
337 t = real( c / ( b+sqrt( abs( b*b-c ) ) ) )
338 sine = ( alpha / absest ) / ( one-t )
339 cosine = -( gamma / absest ) / t
340 sestpr = sqrt( t+four*eps*eps*norma )*absest
345 b = ( zeta2*zeta2+zeta1*zeta1-one )*half
348 t = real( -c / ( b+sqrt( b*b+c ) ) )
350 t = real( b - sqrt( b*b+c ) )
352 sine = -( alpha / absest ) / t
353 cosine = -( gamma / absest ) / ( one+t )
354 sestpr = sqrt( one+t+four*eps*eps*norma )*absest
356 tmp = real( sqrt( sine * conjg( sine )
357 $ + cosine * conjg( cosine ) ) )
subroutine claic1(job, j, x, sest, w, gamma, sestpr, s, c)
CLAIC1 applies one step of incremental condition estimation.