File:  [local] / rpl / lapack / lapack / zlaqz1.f
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 08:55:31 2023 UTC (8 months, 3 weeks ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, HEAD
Ajout de fichiers de lapack 3.11

    1: *> \brief \b ZLAQZ1
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at
    6: *            http://www.netlib.org/lapack/explore-html/
    7: *
    8: *> \htmlonly
    9: *> Download ZLAQZ1 + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ZLAQZ1.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ZLAQZ1.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ZLAQZ1.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *      SUBROUTINE ZLAQZ1( ILQ, ILZ, K, ISTARTM, ISTOPM, IHI, A, LDA, B,
   22: *     $    LDB, NQ, QSTART, Q, LDQ, NZ, ZSTART, Z, LDZ )
   23: *      IMPLICIT NONE
   24: *
   25: *      Arguments
   26: *      LOGICAL, INTENT( IN ) :: ILQ, ILZ
   27: *      INTEGER, INTENT( IN ) :: K, LDA, LDB, LDQ, LDZ, ISTARTM, ISTOPM,
   28: *     $    NQ, NZ, QSTART, ZSTART, IHI
   29: *      COMPLEX*16 :: A( LDA, * ), B( LDB, * ), Q( LDQ, * ), Z( LDZ, * )
   30: *       ..
   31: *
   32: *
   33: *> \par Purpose:
   34: *  =============
   35: *>
   36: *> \verbatim
   37: *>
   38: *>      ZLAQZ1 chases a 1x1 shift bulge in a matrix pencil down a single position
   39: *> \endverbatim
   40: *
   41: *
   42: *  Arguments:
   43: *  ==========
   44: *
   45: *>
   46: *> \param[in] ILQ
   47: *> \verbatim
   48: *>          ILQ is LOGICAL
   49: *>              Determines whether or not to update the matrix Q
   50: *> \endverbatim
   51: *>
   52: *> \param[in] ILZ
   53: *> \verbatim
   54: *>          ILZ is LOGICAL
   55: *>              Determines whether or not to update the matrix Z
   56: *> \endverbatim
   57: *>
   58: *> \param[in] K
   59: *> \verbatim
   60: *>          K is INTEGER
   61: *>              Index indicating the position of the bulge.
   62: *>              On entry, the bulge is located in
   63: *>              (A(k+1,k),B(k+1,k)).
   64: *>              On exit, the bulge is located in
   65: *>              (A(k+2,k+1),B(k+2,k+1)).
   66: *> \endverbatim
   67: *>
   68: *> \param[in] ISTARTM
   69: *> \verbatim
   70: *>          ISTARTM is INTEGER
   71: *> \endverbatim
   72: *>
   73: *> \param[in] ISTOPM
   74: *> \verbatim
   75: *>          ISTOPM is INTEGER
   76: *>              Updates to (A,B) are restricted to
   77: *>              (istartm:k+2,k:istopm). It is assumed
   78: *>              without checking that istartm <= k+1 and
   79: *>              k+2 <= istopm
   80: *> \endverbatim
   81: *>
   82: *> \param[in] IHI
   83: *> \verbatim
   84: *>          IHI is INTEGER
   85: *> \endverbatim
   86: *>
   87: *> \param[inout] A
   88: *> \verbatim
   89: *>          A is COMPLEX*16 array, dimension (LDA,N)
   90: *> \endverbatim
   91: *>
   92: *> \param[in] LDA
   93: *> \verbatim
   94: *>          LDA is INTEGER
   95: *>              The leading dimension of A as declared in
   96: *>              the calling procedure.
   97: *> \endverbatim
   98: *
   99: *> \param[inout] B
  100: *> \verbatim
  101: *>          B is COMPLEX*16 array, dimension (LDB,N)
  102: *> \endverbatim
  103: *>
  104: *> \param[in] LDB
  105: *> \verbatim
  106: *>          LDB is INTEGER
  107: *>              The leading dimension of B as declared in
  108: *>              the calling procedure.
  109: *> \endverbatim
  110: *>
  111: *> \param[in] NQ
  112: *> \verbatim
  113: *>          NQ is INTEGER
  114: *>              The order of the matrix Q
  115: *> \endverbatim
  116: *>
  117: *> \param[in] QSTART
  118: *> \verbatim
  119: *>          QSTART is INTEGER
  120: *>              Start index of the matrix Q. Rotations are applied
  121: *>              To columns k+2-qStart:k+3-qStart of Q.
  122: *> \endverbatim
  123: *
  124: *> \param[inout] Q
  125: *> \verbatim
  126: *>          Q is COMPLEX*16 array, dimension (LDQ,NQ)
  127: *> \endverbatim
  128: *>
  129: *> \param[in] LDQ
  130: *> \verbatim
  131: *>          LDQ is INTEGER
  132: *>              The leading dimension of Q as declared in
  133: *>              the calling procedure.
  134: *> \endverbatim
  135: *>
  136: *> \param[in] NZ
  137: *> \verbatim
  138: *>          NZ is INTEGER
  139: *>              The order of the matrix Z
  140: *> \endverbatim
  141: *>
  142: *> \param[in] ZSTART
  143: *> \verbatim
  144: *>          ZSTART is INTEGER
  145: *>              Start index of the matrix Z. Rotations are applied
  146: *>              To columns k+1-qStart:k+2-qStart of Z.
  147: *> \endverbatim
  148: *
  149: *> \param[inout] Z
  150: *> \verbatim
  151: *>          Z is COMPLEX*16 array, dimension (LDZ,NZ)
  152: *> \endverbatim
  153: *>
  154: *> \param[in] LDZ
  155: *> \verbatim
  156: *>          LDZ is INTEGER
  157: *>              The leading dimension of Q as declared in
  158: *>              the calling procedure.
  159: *> \endverbatim
  160: *
  161: *  Authors:
  162: *  ========
  163: *
  164: *> \author Thijs Steel, KU Leuven
  165: *
  166: *> \date May 2020
  167: *
  168: *> \ingroup complex16GEcomputational
  169: *>
  170: *  =====================================================================
  171:       SUBROUTINE ZLAQZ1( ILQ, ILZ, K, ISTARTM, ISTOPM, IHI, A, LDA, B,
  172:      $                   LDB, NQ, QSTART, Q, LDQ, NZ, ZSTART, Z, LDZ )
  173:       IMPLICIT NONE
  174: *
  175: *     Arguments
  176:       LOGICAL, INTENT( IN ) :: ILQ, ILZ
  177:       INTEGER, INTENT( IN ) :: K, LDA, LDB, LDQ, LDZ, ISTARTM, ISTOPM,
  178:      $         NQ, NZ, QSTART, ZSTART, IHI
  179:       COMPLEX*16 :: A( LDA, * ), B( LDB, * ), Q( LDQ, * ), Z( LDZ, * )
  180: *
  181: *     Parameters
  182:       COMPLEX*16         CZERO, CONE
  183:       PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ), CONE = ( 1.0D+0,
  184:      $                     0.0D+0 ) )
  185:       DOUBLE PRECISION :: ZERO, ONE, HALF
  186:       PARAMETER( ZERO = 0.0D0, ONE = 1.0D0, HALF = 0.5D0 )
  187: *
  188: *     Local variables
  189:       DOUBLE PRECISION :: C
  190:       COMPLEX*16 :: S, TEMP
  191: *
  192: *     External Functions
  193:       EXTERNAL :: ZLARTG, ZROT
  194: *
  195:       IF( K+1 .EQ. IHI ) THEN
  196: *
  197: *        Shift is located on the edge of the matrix, remove it
  198: *
  199:          CALL ZLARTG( B( IHI, IHI ), B( IHI, IHI-1 ), C, S, TEMP )
  200:          B( IHI, IHI ) = TEMP
  201:          B( IHI, IHI-1 ) = CZERO
  202:          CALL ZROT( IHI-ISTARTM, B( ISTARTM, IHI ), 1, B( ISTARTM,
  203:      $              IHI-1 ), 1, C, S )
  204:          CALL ZROT( IHI-ISTARTM+1, A( ISTARTM, IHI ), 1, A( ISTARTM,
  205:      $              IHI-1 ), 1, C, S )
  206:          IF ( ILZ ) THEN
  207:             CALL ZROT( NZ, Z( 1, IHI-ZSTART+1 ), 1, Z( 1, IHI-1-ZSTART+
  208:      $                 1 ), 1, C, S )
  209:          END IF
  210: *
  211:       ELSE
  212: *
  213: *        Normal operation, move bulge down
  214: *
  215: *
  216: *        Apply transformation from the right
  217: *
  218:          CALL ZLARTG( B( K+1, K+1 ), B( K+1, K ), C, S, TEMP )
  219:          B( K+1, K+1 ) = TEMP
  220:          B( K+1, K ) = CZERO
  221:          CALL ZROT( K+2-ISTARTM+1, A( ISTARTM, K+1 ), 1, A( ISTARTM,
  222:      $              K ), 1, C, S )
  223:          CALL ZROT( K-ISTARTM+1, B( ISTARTM, K+1 ), 1, B( ISTARTM, K ),
  224:      $              1, C, S )
  225:          IF ( ILZ ) THEN
  226:             CALL ZROT( NZ, Z( 1, K+1-ZSTART+1 ), 1, Z( 1, K-ZSTART+1 ),
  227:      $                 1, C, S )
  228:          END IF
  229: *
  230: *        Apply transformation from the left
  231: *
  232:          CALL ZLARTG( A( K+1, K ), A( K+2, K ), C, S, TEMP )
  233:          A( K+1, K ) = TEMP
  234:          A( K+2, K ) = CZERO
  235:          CALL ZROT( ISTOPM-K, A( K+1, K+1 ), LDA, A( K+2, K+1 ), LDA, C,
  236:      $              S )
  237:          CALL ZROT( ISTOPM-K, B( K+1, K+1 ), LDB, B( K+2, K+1 ), LDB, C,
  238:      $              S )
  239:          IF ( ILQ ) THEN
  240:             CALL ZROT( NQ, Q( 1, K+1-QSTART+1 ), 1, Q( 1, K+2-QSTART+
  241:      $                 1 ), 1, C, DCONJG( S ) )
  242:          END IF
  243: *
  244:       END IF
  245: *
  246: *     End of ZLAQZ1
  247: *
  248:       END SUBROUTINE

CVSweb interface <joel.bertrand@systella.fr>