# iparmq

Environmental enquiry function which returns values for tuning algorithmic performance.

## Syntax

value = iparmq( ispec, name, opts, n, ilo, ihi, lwork )

## Description

This function sets problem and machine dependent parameters useful for ?hseqr and its subroutines. It is called whenever ilaenv is called with `12≤ispec≤16`.

## Input Parameters

ispec

  INTEGER.

  Specifies the parameter to be returned as the value of iparmq:

  = 12: (inmin) Matrices of order nmin or less are sent directly to ?lahqr, the implicit double shift QR algorithm. nmin must be at least `11`.

  = 13: (inwin) Size of the deflation window. This is best set greater than or equal to the number of simultaneous shifts ns. Larger matrices benefit from larger deflation windows.

  = 14: (inibl) Determines when to stop nibbling and invest in an (expensive) multi-shift QR sweep. If the aggressive early deflation subroutine finds ld converged eigenvalues from an order nw deflation window and `ld>(nw*nibble)/100`, then the next QR sweep is skipped and early deflation is applied immediately to the remaining active diagonal block. Setting `iparmq(ispec=14)=0` causes TTQRE to skip a multi-shift QR sweep whenever early deflation finds a converged eigenvalue. Setting iparmq(ispec=14) greater than or equal to 100 prevents TTQRE from skipping a multi-shift QR sweep.

  = 15: (nshfts) The number of simultaneous shifts in a multi-shift QR iteration.

  = 16: (iacc22) iparmq is set to `0`, `1` or `2` with the following meanings.

  `0:` During the multi-shift QR sweep, ?laqr5 does not accumulate reflections and does not use matrix-matrix multiply to update the far-from-diagonal matrix entries.

  `1:` During the multi-shift QR sweep, ?laqr5 and/or ?laqr3 accumulates reflections and uses matrix-matrix multiply to update the far-from-diagonal matrix entries.

  `2:` During the multi-shift QR sweep, ?laqr5 accumulates reflections and takes advantage of 2-by-2 block structure during matrix-matrix multiplies.

  (If ?trrm is slower than ?gemm, then `iparmq(ispec=16)=1` may be more efficient than `iparmq(ispec=16)=2` despite the greater level of arithmetic work implied by the latter choice.)

name

  CHARACTER*(*). The name of the calling subroutine.

opts

  CHARACTER*(*). This is a concatenation of the string arguments to TTQRE.

n

  INTEGER. n is the order of the Hessenberg matrix H.

ilo, ihi

  INTEGER.

  It is assumed that H is already upper triangular in rows and columns `1:ilo-1` and `ihi+1:n`.

lwork

  INTEGER.

  The amount of workspace available.

## Output Parameters

value

  INTEGER.

  If `value ≥ 0`: the value of the parameter specified by iparmq;

  If `value = -k < 0`: the k-th argument had an illegal value.

## Application Notes

The following conventions have been used when calling ilaenv from the LAPACK routines:

1. opts is a concatenation of all of the character options to subroutine name, in the same order that they appear in the argument list for name, even if they are not used in determining the value of the parameter specified by ispec.

2. The problem dimensions n1, n2, n3, n4 are specified in the order that they appear in the argument list for name. n1 is used first, n2 second, and so on, and unused problem dimensions are passed a value of -1.

3. The parameter value returned by ilaenv is checked for validity in the calling subroutine. For example, ilaenv is used to retrieve the optimal blocksize for strtri as follows:
   `nb = ilaenv( 1, 'strtri', uplo // diag, n, -1, -1, -1> )`
   `if( nb.le.1 ) nb = max( 1, n )`

Parent topic: Utility Functions and Routines