MAGMA  2.7.1
Matrix Algebra for GPU and Multicore Architectures
 All Classes Files Functions Friends Groups Pages
laqtrsd: Quasi-Triangular solve with modified diagonal; used by trevc

Functions

magma_int_t magma_dlaqtrsd (magma_trans_t trans, magma_int_t n, const double *T, magma_int_t ldt, double *x, magma_int_t ldx, const double *cnorm, magma_int_t *info)
 DLAQTRSD is used by DTREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow. More...
 
magma_int_t magma_slaqtrsd (magma_trans_t trans, magma_int_t n, const float *T, magma_int_t ldt, float *x, magma_int_t ldx, const float *cnorm, magma_int_t *info)
 SLAQTRSD is used by STREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow. More...
 

Detailed Description

Function Documentation

magma_int_t magma_dlaqtrsd ( magma_trans_t  trans,
magma_int_t  n,
const double *  T,
magma_int_t  ldt,
double *  x,
magma_int_t  ldx,
const double *  cnorm,
magma_int_t *  info 
)

DLAQTRSD is used by DTREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow.

Here T is an upper quasi-triangular matrix with 1x1 or 2x2 diagonal blocks, A**T denotes the transpose of A, and x is an n-element real or complex vector. The eigenvalue lambda is computed from the block diagonal of T. It does not modify T during the computation.

If trans = MagmaNoTrans, lambda is an eigenvalue for the lower 1x1 or 2x2 block, and it solves ( [ That u ] - lambda*I ) * x = 0, ( [ 0 lambda ] ) which becomes (That - lambda*I) * w = -s*u, with x = [ w; 1 ] and scaling s. If the lower block is 1x1, lambda and x are real; if the lower block is 2x2, lambda and x are complex.

If trans = MagmaTrans, lambda is an eigenvalue for the upper 1x1 or 2x2 block, and it solves ( [ lambda v^T ] - lambda I )**T * x = 0, ( [ 0 That ] ) which becomes (That - lambda*I)**T * w = -s*v, with x = [ 1; w ] and scaling s. If the upper block is 1x1, lambda and x are real; if the upper block is 2x2, lambda and x are complex.

Parameters
[in]transmagma_trans_t Specifies the operation applied to T.
  • = MagmaNoTrans: Solve (T - lambda*I) * x = 0 (No transpose)
  • = MagmaTrans: Solve (T - lambda*I)**T * x = 0 (Transpose)
[in]nINTEGER The order of the matrix T. N >= 0.
[in]TDOUBLE PRECISION array, dimension (LDT,N) The triangular matrix T. The leading n by n upper triangular part of the array T contains the upper triangular matrix, and the strictly lower triangular part of T is not referenced.
[in]ldtINTEGER The leading dimension of the array T. LDT >= max (1,N).
[out]xDOUBLE PRECISION array, dimension (LDX,1) or (LDX,2). On exit, X is overwritten by the solution vector x. If LAMBDAI .EQ. 0, X is real and has dimension (LDX,1). If LAMBDAI .NE. 0, X is complex and has dimension (LDX,2); the real part is in X(:,0), the imaginary part in X(:,1).
[in]ldxINTEGER The leading dimension of the array X. LDX >= max(1,N).
[in,out]cnorm(input) DOUBLE PRECISION array, dimension (N) CNORM(j) contains the norm of the off-diagonal part of the j-th column of T. If TRANS = MagmaNoTrans, CNORM(j) must be greater than or equal to the infinity-norm, and if TRANS = MagmaTrans or MagmaConjTrans, CNORM(j) must be greater than or equal to the 1-norm.
[out]infoINTEGER
  • = 0: successful exit
  • < 0: if INFO = -k, the k-th argument had an illegal value
magma_int_t magma_slaqtrsd ( magma_trans_t  trans,
magma_int_t  n,
const float *  T,
magma_int_t  ldt,
float *  x,
magma_int_t  ldx,
const float *  cnorm,
magma_int_t *  info 
)

SLAQTRSD is used by STREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow.

Here T is an upper quasi-triangular matrix with 1x1 or 2x2 diagonal blocks, A**T denotes the transpose of A, and x is an n-element real or complex vector. The eigenvalue lambda is computed from the block diagonal of T. It does not modify T during the computation.

If trans = MagmaNoTrans, lambda is an eigenvalue for the lower 1x1 or 2x2 block, and it solves ( [ That u ] - lambda*I ) * x = 0, ( [ 0 lambda ] ) which becomes (That - lambda*I) * w = -s*u, with x = [ w; 1 ] and scaling s. If the lower block is 1x1, lambda and x are real; if the lower block is 2x2, lambda and x are complex.

If trans = MagmaTrans, lambda is an eigenvalue for the upper 1x1 or 2x2 block, and it solves ( [ lambda v^T ] - lambda I )**T * x = 0, ( [ 0 That ] ) which becomes (That - lambda*I)**T * w = -s*v, with x = [ 1; w ] and scaling s. If the upper block is 1x1, lambda and x are real; if the upper block is 2x2, lambda and x are complex.

Parameters
[in]transmagma_trans_t Specifies the operation applied to T.
  • = MagmaNoTrans: Solve (T - lambda*I) * x = 0 (No transpose)
  • = MagmaTrans: Solve (T - lambda*I)**T * x = 0 (Transpose)
[in]nINTEGER The order of the matrix T. N >= 0.
[in]TREAL array, dimension (LDT,N) The triangular matrix T. The leading n by n upper triangular part of the array T contains the upper triangular matrix, and the strictly lower triangular part of T is not referenced.
[in]ldtINTEGER The leading dimension of the array T. LDT >= max (1,N).
[out]xREAL array, dimension (LDX,1) or (LDX,2). On exit, X is overwritten by the solution vector x. If LAMBDAI .EQ. 0, X is real and has dimension (LDX,1). If LAMBDAI .NE. 0, X is complex and has dimension (LDX,2); the real part is in X(:,0), the imaginary part in X(:,1).
[in]ldxINTEGER The leading dimension of the array X. LDX >= max(1,N).
[in,out]cnorm(input) REAL array, dimension (N) CNORM(j) contains the norm of the off-diagonal part of the j-th column of T. If TRANS = MagmaNoTrans, CNORM(j) must be greater than or equal to the infinity-norm, and if TRANS = MagmaTrans or MagmaConjTrans, CNORM(j) must be greater than or equal to the 1-norm.
[out]infoINTEGER
  • = 0: successful exit
  • < 0: if INFO = -k, the k-th argument had an illegal value