LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ sla_syamv()

subroutine sla_syamv ( integer uplo,
integer n,
real alpha,
real, dimension( lda, * ) a,
integer lda,
real, dimension( * ) x,
integer incx,
real beta,
real, dimension( * ) y,
integer incy )

SLA_SYAMV computes a matrix-vector product using a symmetric indefinite matrix to calculate error bounds.

Download SLA_SYAMV + dependencies [TGZ] [ZIP] [TXT]

Purpose:
!>
!> SLA_SYAMV  performs the matrix-vector operation
!>
!>         y := alpha*abs(A)*abs(x) + beta*abs(y),
!>
!> where alpha and beta are scalars, x and y are vectors and A is an
!> n by n symmetric matrix.
!>
!> This function is primarily used in calculating error bounds.
!> To protect against underflow during evaluation, components in
!> the resulting vector are perturbed away from zero by (N+1)
!> times the underflow threshold.  To prevent unnecessarily large
!> errors for block-structure embedded in general matrices,
!>  zero components are not perturbed.  A zero
!> entry is considered  if all multiplications involved
!> in computing that entry have at least one zero multiplicand.
!> 
Parameters
[in]UPLO
!>          UPLO is INTEGER
!>           On entry, UPLO specifies whether the upper or lower
!>           triangular part of the array A is to be referenced as
!>           follows:
!>
!>              UPLO = BLAS_UPPER   Only the upper triangular part of A
!>                                  is to be referenced.
!>
!>              UPLO = BLAS_LOWER   Only the lower triangular part of A
!>                                  is to be referenced.
!>
!>           Unchanged on exit.
!> 
[in]N
!>          N is INTEGER
!>           On entry, N specifies the number of columns of the matrix A.
!>           N must be at least zero.
!>           Unchanged on exit.
!> 
[in]ALPHA
!>          ALPHA is REAL .
!>           On entry, ALPHA specifies the scalar alpha.
!>           Unchanged on exit.
!> 
[in]A
!>          A is REAL array, dimension ( LDA, n ).
!>           Before entry, the leading m by n part of the array A must
!>           contain the matrix of coefficients.
!>           Unchanged on exit.
!> 
[in]LDA
!>          LDA is INTEGER
!>           On entry, LDA specifies the first dimension of A as declared
!>           in the calling (sub) program. LDA must be at least
!>           max( 1, n ).
!>           Unchanged on exit.
!> 
[in]X
!>          X is REAL array, dimension
!>           ( 1 + ( n - 1 )*abs( INCX ) )
!>           Before entry, the incremented array X must contain the
!>           vector x.
!>           Unchanged on exit.
!> 
[in]INCX
!>          INCX is INTEGER
!>           On entry, INCX specifies the increment for the elements of
!>           X. INCX must not be zero.
!>           Unchanged on exit.
!> 
[in]BETA
!>          BETA is REAL .
!>           On entry, BETA specifies the scalar beta. When BETA is
!>           supplied as zero then Y need not be set on input.
!>           Unchanged on exit.
!> 
[in,out]Y
!>          Y is REAL array, dimension
!>           ( 1 + ( n - 1 )*abs( INCY ) )
!>           Before entry with BETA non-zero, the incremented array Y
!>           must contain the vector y. On exit, Y is overwritten by the
!>           updated vector y.
!> 
[in]INCY
!>          INCY is INTEGER
!>           On entry, INCY specifies the increment for the elements of
!>           Y. INCY must not be zero.
!>           Unchanged on exit.
!> 
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details:
!>
!>  Level 2 Blas routine.
!>
!>  -- Written on 22-October-1986.
!>     Jack Dongarra, Argonne National Lab.
!>     Jeremy Du Croz, Nag Central Office.
!>     Sven Hammarling, Nag Central Office.
!>     Richard Hanson, Sandia National Labs.
!>  -- Modified for the absolute-value product, April 2006
!>     Jason Riedy, UC Berkeley
!> 

Definition at line 173 of file sla_syamv.f.

175*
176* -- LAPACK computational routine --
177* -- LAPACK is a software package provided by Univ. of Tennessee, --
178* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
179*
180* .. Scalar Arguments ..
181 REAL ALPHA, BETA
182 INTEGER INCX, INCY, LDA, N, UPLO
183* ..
184* .. Array Arguments ..
185 REAL A( LDA, * ), X( * ), Y( * )
186* ..
187*
188* =====================================================================
189*
190* .. Parameters ..
191 REAL ONE, ZERO
192 parameter( one = 1.0e+0, zero = 0.0e+0 )
193* ..
194* .. Local Scalars ..
195 LOGICAL SYMB_ZERO
196 REAL TEMP, SAFE1
197 INTEGER I, INFO, IY, J, JX, KX, KY
198* ..
199* .. External Subroutines ..
200 EXTERNAL xerbla, slamch
201 REAL SLAMCH
202* ..
203* .. External Functions ..
204 EXTERNAL ilauplo
205 INTEGER ILAUPLO
206* ..
207* .. Intrinsic Functions ..
208 INTRINSIC max, abs, sign
209* ..
210* .. Executable Statements ..
211*
212* Test the input parameters.
213*
214 info = 0
215 IF ( uplo.NE.ilauplo( 'U' ) .AND.
216 $ uplo.NE.ilauplo( 'L' ) ) THEN
217 info = 1
218 ELSE IF( n.LT.0 )THEN
219 info = 2
220 ELSE IF( lda.LT.max( 1, n ) )THEN
221 info = 5
222 ELSE IF( incx.EQ.0 )THEN
223 info = 7
224 ELSE IF( incy.EQ.0 )THEN
225 info = 10
226 END IF
227 IF( info.NE.0 )THEN
228 CALL xerbla( 'SLA_SYAMV', info )
229 RETURN
230 END IF
231*
232* Quick return if possible.
233*
234 IF( ( n.EQ.0 ).OR.( ( alpha.EQ.zero ).AND.( beta.EQ.one ) ) )
235 $ RETURN
236*
237* Set up the start points in X and Y.
238*
239 IF( incx.GT.0 )THEN
240 kx = 1
241 ELSE
242 kx = 1 - ( n - 1 )*incx
243 END IF
244 IF( incy.GT.0 )THEN
245 ky = 1
246 ELSE
247 ky = 1 - ( n - 1 )*incy
248 END IF
249*
250* Set SAFE1 essentially to be the underflow threshold times the
251* number of additions in each row.
252*
253 safe1 = slamch( 'Safe minimum' )
254 safe1 = (n+1)*safe1
255*
256* Form y := alpha*abs(A)*abs(x) + beta*abs(y).
257*
258* The O(N^2) SYMB_ZERO tests could be replaced by O(N) queries to
259* the inexact flag. Still doesn't help change the iteration order
260* to per-column.
261*
262 iy = ky
263 IF ( incx.EQ.1 ) THEN
264 IF ( uplo .EQ. ilauplo( 'U' ) ) THEN
265 DO i = 1, n
266 IF ( beta .EQ. zero ) THEN
267 symb_zero = .true.
268 y( iy ) = 0.0
269 ELSE IF ( y( iy ) .EQ. zero ) THEN
270 symb_zero = .true.
271 ELSE
272 symb_zero = .false.
273 y( iy ) = beta * abs( y( iy ) )
274 END IF
275 IF ( alpha .NE. zero ) THEN
276 DO j = 1, i
277 temp = abs( a( j, i ) )
278 symb_zero = symb_zero .AND.
279 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
280
281 y( iy ) = y( iy ) + alpha*abs( x( j ) )*temp
282 END DO
283 DO j = i+1, n
284 temp = abs( a( i, j ) )
285 symb_zero = symb_zero .AND.
286 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
287
288 y( iy ) = y( iy ) + alpha*abs( x( j ) )*temp
289 END DO
290 END IF
291
292 IF ( .NOT.symb_zero )
293 $ y( iy ) = y( iy ) + sign( safe1, y( iy ) )
294
295 iy = iy + incy
296 END DO
297 ELSE
298 DO i = 1, n
299 IF ( beta .EQ. zero ) THEN
300 symb_zero = .true.
301 y( iy ) = 0.0
302 ELSE IF ( y( iy ) .EQ. zero ) THEN
303 symb_zero = .true.
304 ELSE
305 symb_zero = .false.
306 y( iy ) = beta * abs( y( iy ) )
307 END IF
308 IF ( alpha .NE. zero ) THEN
309 DO j = 1, i
310 temp = abs( a( i, j ) )
311 symb_zero = symb_zero .AND.
312 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
313
314 y( iy ) = y( iy ) + alpha*abs( x( j ) )*temp
315 END DO
316 DO j = i+1, n
317 temp = abs( a( j, i ) )
318 symb_zero = symb_zero .AND.
319 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
320
321 y( iy ) = y( iy ) + alpha*abs( x( j ) )*temp
322 END DO
323 END IF
324
325 IF ( .NOT.symb_zero )
326 $ y( iy ) = y( iy ) + sign( safe1, y( iy ) )
327
328 iy = iy + incy
329 END DO
330 END IF
331 ELSE
332 IF ( uplo .EQ. ilauplo( 'U' ) ) THEN
333 DO i = 1, n
334 IF ( beta .EQ. zero ) THEN
335 symb_zero = .true.
336 y( iy ) = 0.0
337 ELSE IF ( y( iy ) .EQ. zero ) THEN
338 symb_zero = .true.
339 ELSE
340 symb_zero = .false.
341 y( iy ) = beta * abs( y( iy ) )
342 END IF
343 jx = kx
344 IF ( alpha .NE. zero ) THEN
345 DO j = 1, i
346 temp = abs( a( j, i ) )
347 symb_zero = symb_zero .AND.
348 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
349
350 y( iy ) = y( iy ) + alpha*abs( x( jx ) )*temp
351 jx = jx + incx
352 END DO
353 DO j = i+1, n
354 temp = abs( a( i, j ) )
355 symb_zero = symb_zero .AND.
356 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
357
358 y( iy ) = y( iy ) + alpha*abs( x( jx ) )*temp
359 jx = jx + incx
360 END DO
361 END IF
362
363 IF ( .NOT.symb_zero )
364 $ y( iy ) = y( iy ) + sign( safe1, y( iy ) )
365
366 iy = iy + incy
367 END DO
368 ELSE
369 DO i = 1, n
370 IF ( beta .EQ. zero ) THEN
371 symb_zero = .true.
372 y( iy ) = 0.0
373 ELSE IF ( y( iy ) .EQ. zero ) THEN
374 symb_zero = .true.
375 ELSE
376 symb_zero = .false.
377 y( iy ) = beta * abs( y( iy ) )
378 END IF
379 jx = kx
380 IF ( alpha .NE. zero ) THEN
381 DO j = 1, i
382 temp = abs( a( i, j ) )
383 symb_zero = symb_zero .AND.
384 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
385
386 y( iy ) = y( iy ) + alpha*abs( x( jx ) )*temp
387 jx = jx + incx
388 END DO
389 DO j = i+1, n
390 temp = abs( a( j, i ) )
391 symb_zero = symb_zero .AND.
392 $ ( x( j ) .EQ. zero .OR. temp .EQ. zero )
393
394 y( iy ) = y( iy ) + alpha*abs( x( jx ) )*temp
395 jx = jx + incx
396 END DO
397 END IF
398
399 IF ( .NOT.symb_zero )
400 $ y( iy ) = y( iy ) + sign( safe1, y( iy ) )
401
402 iy = iy + incy
403 END DO
404 END IF
405
406 END IF
407*
408 RETURN
409*
410* End of SLA_SYAMV
411*
subroutine xerbla(srname, info)
Definition cblat2.f:3285
integer function ilauplo(uplo)
ILAUPLO
Definition ilauplo.f:56
real function slamch(cmach)
SLAMCH
Definition slamch.f:68
Here is the call graph for this function:
Here is the caller graph for this function: