Performs a single small-bulge multi-shift QR sweep collecting the transformations.
void slaqr6(char* job, MKL_INT* wantt, MKL_INT* wantz, MKL_INT* kacc22, MKL_INT* n, MKL_INT* ktop, MKL_INT* kbot, MKL_INT* nshfts, float* sr, float* si, float* h, MKL_INT* ldh, MKL_INT* iloz, MKL_INT* ihiz, float* z, MKL_INT* ldz, float* v, MKL_INT* ldv, float* u, MKL_INT* ldu, MKL_INT* nv, float* wv, MKL_INT* ldwv, MKL_INT* nh, float* wh, MKL_INT* ldwh);
void dlaqr6(char* job, MKL_INT* wantt, MKL_INT* wantz, MKL_INT* kacc22, MKL_INT* n, MKL_INT* ktop, MKL_INT* kbot, MKL_INT* nshfts, double* sr, double* si, double* h, MKL_INT* ldh, MKL_INT* iloz, MKL_INT* ihiz, double* z, MKL_INT* ldz, double* v, MKL_INT* ldv, double* u, MKL_INT* ldu, MKL_INT* nv, double* wv, MKL_INT* ldwv, MKL_INT* nh, double* wh, MKL_INT* ldwh);
This auxiliary function performs a single small-bulge multi-shift QR sweep, moving the chain of bulges from top to bottom in the submatrix H(ktop:kbot,ktop:kbot), collecting the transformations in the matrix V or accumulating the transformations in the matrix Z (see below).
This is a modified version of ?laqr5 from LAPACK 3.1.
Set the kind of job to do in ?laqr6, as follows:
job = 'I': Introduce and chase bulges in submatrix
job = 'C': Chase bulges from top to bottom of submatrix
job = 'O': Chase bulges off submatrix
wanttis non-zero if the quasi-triangular Schur factor is being computed. wantt is set to zero otherwise.
wantzis non-zero if the orthogonal Schur factor is being computed. wantz is set to zero otherwise.
Specifies the computation mode of far-from-diagonal orthogonal updates.
= 0: ?laqr6 does not accumulate reflections and does not use matrix-matrix multiply to update far-from-diagonal matrix entries.
= 1: ?laqr6 accumulates reflections and uses matrix-matrix multiply to update the far-from-diagonal matrix entries.
= 2: ?laqr6 accumulates reflections, uses matrix-matrix multiply to update the far-from-diagonal matrix entries, and takes advantage of 2-by-2 block structure during matrix multiplies.
n is the order of the Hessenberg matrix H upon which this function operates.
These are the first and last rows and columns of an isolated diagonal block upon which the QR sweep is to be applied. It is assumed without a check that either ktop = 1 or H(ktop,ktop-1) = 0 and either kbot = n or H(kbot+1,kbot) = 0.
nshfts gives the number of simultaneous shifts. nshfts must be positive and even.
Array of size nshfts
sr contains the real parts and si contains the imaginary parts of the nshfts shifts of origin that define the multi-shift QR sweep.
Array of size ldh * n
On input h contains a Hessenberg matrix H.
ldh is the leading dimension of H just as declared in the calling function. ldh≥ max(1,n).
Specify the rows of the matrix Zto which transformations must be applied if wantzis non-zero. 1≤iloz≤ihiz≤n
Array of size ldz * ktop
If wantzis non-zero, then the QR sweep orthogonal similarity transformation is accumulated into the matrix Z(iloz:ihiz,kbot:ktop), stored in the array z, from the right.
If wantzequals zero, then z is unreferenced.
ldz is the leading dimension of z just as declared in the calling function. ldz≥n.
(workspace) array of size ldv * nshfts/2
ldv is the leading dimension of v as declared in the calling function. ldv≥3.
(workspace) array of size ldu * (3*nshfts-3)
ldu is the leading dimension of u just as declared in the calling function. ldu≥3*nshfts-3.
nh is the number of columns in array wh available for workspace. nh≥1 is required for usage of this workspace, otherwise the updates of the far-from-diagonal elements will be updated without level 3 BLAS.
(workspace) array of size ldwh * nh
Leading dimension of wh just as declared in the calling function. ldwh≥3*nshfts-3.
nv is the number of rows in wv available for workspace. nv≥1 is required for usage of this workspace, otherwise the updates of the far-from-diagonal elements will be updated without level 3 BLAS.
(workspace) array of size ldwv * 3*nshfts
scalar
ldwv is the leading dimension of wv as declared in the in the calling function. ldwv≥nv.
A multi-shift QR sweep with shifts sr[j]+i*si[j] is applied to the isolated diagonal block in matrix rows and columns ktop through kbot.
If wantzis non-zero, then the QR sweep orthogonal/unitary similarity transformation is accumulated into the matrix Z(iloz:ihiz,kbot:ktop) from the right.
If wantzequals zero, then z is unreferenced.
Notes
Based on contributions by Karen Braman and Ralph Byers, Department of Mathematics, University of Kansas, USA Robert Granat, Department of Computing Science and HPC2N, Umea University, Sweden