/*  -- 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   
   > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/iparmq.
f">   
   > [TGZ]</a>   
   > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/iparmq.
f">   
   > [ZIP]</a>   
   > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/iparmq.
f">   
   > [TXT]</a>   
   > \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_ */

