/* -- translated by f2c (version 20191129).
You must link the resulting object file with libf2c:
on Microsoft Windows system, link with libf2c.lib;
on Linux or Unix systems, link with .../path/to/libf2c.a -lm
or, if you install libf2c.a in a standard place, with -lf2c -lm
-- in that order, at the end of the command line, as in
cc *.o -lf2c -lm
Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
http://www.netlib.org/f2c/libf2c.zip
*/
#include "f2c.h"
/* > \brief \b IPARMQ
=========== DOCUMENTATION ===========
Online html documentation available at
http://www.netlib.org/lapack/explore-html/
> \htmlonly
> Download IPARMQ + dependencies
>
> [TGZ]
>
> [ZIP]
>
> [TXT]
> \endhtmlonly
Definition:
===========
INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
INTEGER IHI, ILO, ISPEC, LWORK, N
CHARACTER NAME*( * ), OPTS*( * )
> \par Purpose:
=============
>
> \verbatim
>
> This program sets problem and machine dependent parameters
> useful for xHSEQR and its subroutines. It is called whenever
> ILAENV is called with 12 <= ISPEC <= 16
> \endverbatim
Arguments:
==========
> \param[in] ISPEC
> \verbatim
> ISPEC is integer scalar
> ISPEC specifies which tunable parameter IPARMQ should
> return.
>
> ISPEC=12: (INMIN) Matrices of order nmin or less
> are sent directly to xLAHQR, the implicit
> double shift QR algorithm. NMIN must be
> at least 11.
>
> ISPEC=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.
>
> ISPEC=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.GT.(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.
>
> ISPEC=15: (NSHFTS) The number of simultaneous shifts in
> a multi-shift QR iteration.
>
> ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the
> following meanings.
> 0: During the multi-shift QR sweep,
> xLAQR5 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,
> xLAQR5 and/or xLAQRaccumulates reflections and uses
> matrix-matrix multiply to update the
> far-from-diagonal matrix entries.
> 2: During the multi-shift QR sweep.
> xLAQR5 accumulates reflections and takes
> advantage of 2-by-2 block structure during
> matrix-matrix multiplies.
> (If xTRMM is slower than xGEMM, 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.)
> \endverbatim
>
> \param[in] NAME
> \verbatim
> NAME is character string
> Name of the calling subroutine
> \endverbatim
>
> \param[in] OPTS
> \verbatim
> OPTS is character string
> This is a concatenation of the string arguments to
> TTQRE.
> \endverbatim
>
> \param[in] N
> \verbatim
> N is integer scalar
> N is the order of the Hessenberg matrix H.
> \endverbatim
>
> \param[in] ILO
> \verbatim
> ILO is INTEGER
> \endverbatim
>
> \param[in] IHI
> \verbatim
> IHI is INTEGER
> It is assumed that H is already upper triangular
> in rows and columns 1:ILO-1 and IHI+1:N.
> \endverbatim
>
> \param[in] LWORK
> \verbatim
> LWORK is integer scalar
> The amount of workspace available.
> \endverbatim
Authors:
========
> \author Univ. of Tennessee
> \author Univ. of California Berkeley
> \author Univ. of Colorado Denver
> \author NAG Ltd.
> \date November 2011
> \ingroup auxOTHERauxiliary
> \par Further Details:
=====================
>
> \verbatim
>
> Little is known about how best to choose these parameters.
> It is possible to use different values of the parameters
> for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR.
>
> It is probably best to choose different parameters for
> different matrices and different parameters at different
> times during the iteration, but this has not been
> implemented --- yet.
>
>
> The best choices of most of the parameters depend
> in an ill-understood way on the relative execution
> rate of xLAQR3 and xLAQR5 and on the nature of each
> particular eigenvalue problem. Experiment may be the
> only practical way to determine which choices are most
> effective.
>
> Following is a list of default values supplied by IPARMQ.
> These defaults may be adjusted in order to attain better
> performance in any particular computational environment.
>
> IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point.
> Default: 75. (Must be at least 11.)
>
> IPARMQ(ISPEC=13) Recommended deflation window size.
> This depends on ILO, IHI and NS, the
> number of simultaneous shifts returned
> by IPARMQ(ISPEC=15). The default for
> (IHI-ILO+1).LE.500 is NS. The default
> for (IHI-ILO+1).GT.500 is 3*NS/2.
>
> IPARMQ(ISPEC=14) Nibble crossover point. Default: 14.
>
> IPARMQ(ISPEC=15) Number of simultaneous shifts, NS.
> a multi-shift QR iteration.
>
> If IHI-ILO+1 is ...
>
> greater than ...but less ... the
> or equal to ... than default is
>
> 0 30 NS = 2+
> 30 60 NS = 4+
> 60 150 NS = 10
> 150 590 NS = **
> 590 3000 NS = 64
> 3000 6000 NS = 128
> 6000 infinity NS = 256
>
> (+) By default matrices of this order are
> passed to the implicit double shift routine
> xLAHQR. See IPARMQ(ISPEC=12) above. These
> values of NS are used only in case of a rare
> xLAHQR failure.
>
> (**) The asterisks (**) indicate an ad-hoc
> function increasing from 10 to 64.
>
> IPARMQ(ISPEC=16) Select structured matrix multiply.
> (See ISPEC=16 above for details.)
> Default: 3.
> \endverbatim
>
===================================================================== */
integer igraphiparmq_(integer *ispec, char *name__, char *opts, integer *n, integer
*ilo, integer *ihi, integer *lwork)
{
/* System generated locals */
integer ret_val, i__1, i__2;
real r__1;
/* Builtin functions */
double log(doublereal);
integer i_nint(real *);
/* Local variables */
integer nh, ns;
/* -- LAPACK auxiliary routine (version 3.4.0) --
-- LAPACK is a software package provided by Univ. of Tennessee, --
-- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
November 2011
================================================================ */
if (*ispec == 15 || *ispec == 13 || *ispec == 16) {
/* ==== Set the number simultaneous shifts ==== */
nh = *ihi - *ilo + 1;
ns = 2;
if (nh >= 30) {
ns = 4;
}
if (nh >= 60) {
ns = 10;
}
if (nh >= 150) {
/* Computing MAX */
r__1 = log((real) nh) / log(2.f);
i__1 = 10, i__2 = nh / i_nint(&r__1);
ns = max(i__1,i__2);
}
if (nh >= 590) {
ns = 64;
}
if (nh >= 3000) {
ns = 128;
}
if (nh >= 6000) {
ns = 256;
}
/* Computing MAX */
i__1 = 2, i__2 = ns - ns % 2;
ns = max(i__1,i__2);
}
if (*ispec == 12) {
/* ===== Matrices of order smaller than NMIN get sent
. to xLAHQR, the classic double shift algorithm.
. This must be at least 11. ==== */
ret_val = 75;
} else if (*ispec == 14) {
/* ==== INIBL: skip a multi-shift qr iteration and
. whenever aggressive early deflation finds
. at least (NIBBLE*(window size)/100) deflations. ==== */
ret_val = 14;
} else if (*ispec == 15) {
/* ==== NSHFTS: The number of simultaneous shifts ===== */
ret_val = ns;
} else if (*ispec == 13) {
/* ==== NW: deflation window size. ==== */
if (nh <= 500) {
ret_val = ns;
} else {
ret_val = ns * 3 / 2;
}
} else if (*ispec == 16) {
/* ==== IACC22: Whether to accumulate reflections
. before updating the far-from-diagonal elements
. and whether to use 2-by-2 block structure while
. doing it. A small amount of work could be saved
. by making this choice dependent also upon the
. NH=IHI-ILO+1. */
ret_val = 0;
if (ns >= 14) {
ret_val = 1;
}
if (ns >= 14) {
ret_val = 2;
}
} else {
/* ===== invalid value of ispec ===== */
ret_val = -1;
}
/* ==== End of IPARMQ ==== */
return ret_val;
} /* igraphiparmq_ */