File:  [local] / rpl / lapack / lapack / zsyconvf_rook.f
Revision 1.6: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 08:39:38 2023 UTC (8 months, 3 weeks ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, HEAD
Première mise à jour de lapack et blas.

    1: *> \brief \b ZSYCONVF_ROOK
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at
    6: *            http://www.netlib.org/lapack/explore-html/
    7: *
    8: *> \htmlonly
    9: *> Download ZSYCONVF_ROOK + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zsyconvf_rook.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zsyconvf_rook.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zsyconvf_rook.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       SUBROUTINE ZSYCONVF_ROOK( UPLO, WAY, N, A, LDA, E, IPIV, INFO )
   22: *
   23: *       .. Scalar Arguments ..
   24: *       CHARACTER          UPLO, WAY
   25: *       INTEGER            INFO, LDA, N
   26: *       ..
   27: *       .. Array Arguments ..
   28: *       INTEGER            IPIV( * )
   29: *       COMPLEX*16         A( LDA, * ), E( * )
   30: *       ..
   31: *
   32: *
   33: *> \par Purpose:
   34: *  =============
   35: *>
   36: *> \verbatim
   37: *> If parameter WAY = 'C':
   38: *> ZSYCONVF_ROOK converts the factorization output format used in
   39: *> ZSYTRF_ROOK provided on entry in parameter A into the factorization
   40: *> output format used in ZSYTRF_RK (or ZSYTRF_BK) that is stored
   41: *> on exit in parameters A and E. IPIV format for ZSYTRF_ROOK and
   42: *> ZSYTRF_RK (or ZSYTRF_BK) is the same and is not converted.
   43: *>
   44: *> If parameter WAY = 'R':
   45: *> ZSYCONVF_ROOK performs the conversion in reverse direction, i.e.
   46: *> converts the factorization output format used in ZSYTRF_RK
   47: *> (or ZSYTRF_BK) provided on entry in parameters A and E into
   48: *> the factorization output format used in ZSYTRF_ROOK that is stored
   49: *> on exit in parameter A. IPIV format for ZSYTRF_ROOK and
   50: *> ZSYTRF_RK (or ZSYTRF_BK) is the same and is not converted.
   51: *>
   52: *> ZSYCONVF_ROOK can also convert in Hermitian matrix case, i.e. between
   53: *> formats used in ZHETRF_ROOK and ZHETRF_RK (or ZHETRF_BK).
   54: *> \endverbatim
   55: *
   56: *  Arguments:
   57: *  ==========
   58: *
   59: *> \param[in] UPLO
   60: *> \verbatim
   61: *>          UPLO is CHARACTER*1
   62: *>          Specifies whether the details of the factorization are
   63: *>          stored as an upper or lower triangular matrix A.
   64: *>          = 'U':  Upper triangular
   65: *>          = 'L':  Lower triangular
   66: *> \endverbatim
   67: *>
   68: *> \param[in] WAY
   69: *> \verbatim
   70: *>          WAY is CHARACTER*1
   71: *>          = 'C': Convert
   72: *>          = 'R': Revert
   73: *> \endverbatim
   74: *>
   75: *> \param[in] N
   76: *> \verbatim
   77: *>          N is INTEGER
   78: *>          The order of the matrix A.  N >= 0.
   79: *> \endverbatim
   80: *>
   81: *> \param[in,out] A
   82: *> \verbatim
   83: *>          A is COMPLEX*16 array, dimension (LDA,N)
   84: *>
   85: *>          1) If WAY ='C':
   86: *>
   87: *>          On entry, contains factorization details in format used in
   88: *>          ZSYTRF_ROOK:
   89: *>            a) all elements of the symmetric block diagonal
   90: *>               matrix D on the diagonal of A and on superdiagonal
   91: *>               (or subdiagonal) of A, and
   92: *>            b) If UPLO = 'U': multipliers used to obtain factor U
   93: *>               in the superdiagonal part of A.
   94: *>               If UPLO = 'L': multipliers used to obtain factor L
   95: *>               in the superdiagonal part of A.
   96: *>
   97: *>          On exit, contains factorization details in format used in
   98: *>          ZSYTRF_RK or ZSYTRF_BK:
   99: *>            a) ONLY diagonal elements of the symmetric block diagonal
  100: *>               matrix D on the diagonal of A, i.e. D(k,k) = A(k,k);
  101: *>               (superdiagonal (or subdiagonal) elements of D
  102: *>                are stored on exit in array E), and
  103: *>            b) If UPLO = 'U': factor U in the superdiagonal part of A.
  104: *>               If UPLO = 'L': factor L in the subdiagonal part of A.
  105: *>
  106: *>          2) If WAY = 'R':
  107: *>
  108: *>          On entry, contains factorization details in format used in
  109: *>          ZSYTRF_RK or ZSYTRF_BK:
  110: *>            a) ONLY diagonal elements of the symmetric block diagonal
  111: *>               matrix D on the diagonal of A, i.e. D(k,k) = A(k,k);
  112: *>               (superdiagonal (or subdiagonal) elements of D
  113: *>                are stored on exit in array E), and
  114: *>            b) If UPLO = 'U': factor U in the superdiagonal part of A.
  115: *>               If UPLO = 'L': factor L in the subdiagonal part of A.
  116: *>
  117: *>          On exit, contains factorization details in format used in
  118: *>          ZSYTRF_ROOK:
  119: *>            a) all elements of the symmetric block diagonal
  120: *>               matrix D on the diagonal of A and on superdiagonal
  121: *>               (or subdiagonal) of A, and
  122: *>            b) If UPLO = 'U': multipliers used to obtain factor U
  123: *>               in the superdiagonal part of A.
  124: *>               If UPLO = 'L': multipliers used to obtain factor L
  125: *>               in the superdiagonal part of A.
  126: *> \endverbatim
  127: *>
  128: *> \param[in] LDA
  129: *> \verbatim
  130: *>          LDA is INTEGER
  131: *>          The leading dimension of the array A.  LDA >= max(1,N).
  132: *> \endverbatim
  133: *>
  134: *> \param[in,out] E
  135: *> \verbatim
  136: *>          E is COMPLEX*16 array, dimension (N)
  137: *>
  138: *>          1) If WAY ='C':
  139: *>
  140: *>          On entry, just a workspace.
  141: *>
  142: *>          On exit, contains the superdiagonal (or subdiagonal)
  143: *>          elements of the symmetric block diagonal matrix D
  144: *>          with 1-by-1 or 2-by-2 diagonal blocks, where
  145: *>          If UPLO = 'U': E(i) = D(i-1,i), i=2:N, E(1) is set to 0;
  146: *>          If UPLO = 'L': E(i) = D(i+1,i), i=1:N-1, E(N) is set to 0.
  147: *>
  148: *>          2) If WAY = 'R':
  149: *>
  150: *>          On entry, contains the superdiagonal (or subdiagonal)
  151: *>          elements of the symmetric block diagonal matrix D
  152: *>          with 1-by-1 or 2-by-2 diagonal blocks, where
  153: *>          If UPLO = 'U': E(i) = D(i-1,i),i=2:N, E(1) not referenced;
  154: *>          If UPLO = 'L': E(i) = D(i+1,i),i=1:N-1, E(N) not referenced.
  155: *>
  156: *>          On exit, is not changed
  157: *> \endverbatim
  158: *.
  159: *> \param[in] IPIV
  160: *> \verbatim
  161: *>          IPIV is INTEGER array, dimension (N)
  162: *>          On entry, details of the interchanges and the block
  163: *>          structure of D as determined:
  164: *>          1) by ZSYTRF_ROOK, if WAY ='C';
  165: *>          2) by ZSYTRF_RK (or ZSYTRF_BK), if WAY ='R'.
  166: *>          The IPIV format is the same for all these routines.
  167: *>
  168: *>          On exit, is not changed.
  169: *> \endverbatim
  170: *>
  171: *> \param[out] INFO
  172: *> \verbatim
  173: *>          INFO is INTEGER
  174: *>          = 0:  successful exit
  175: *>          < 0:  if INFO = -i, the i-th argument had an illegal value
  176: *> \endverbatim
  177: *
  178: *  Authors:
  179: *  ========
  180: *
  181: *> \author Univ. of Tennessee
  182: *> \author Univ. of California Berkeley
  183: *> \author Univ. of Colorado Denver
  184: *> \author NAG Ltd.
  185: *
  186: *> \ingroup complex16SYcomputational
  187: *
  188: *> \par Contributors:
  189: *  ==================
  190: *>
  191: *> \verbatim
  192: *>
  193: *>  November 2017,  Igor Kozachenko,
  194: *>                  Computer Science Division,
  195: *>                  University of California, Berkeley
  196: *>
  197: *> \endverbatim
  198: *  =====================================================================
  199:       SUBROUTINE ZSYCONVF_ROOK( UPLO, WAY, N, A, LDA, E, IPIV, INFO )
  200: *
  201: *  -- LAPACK computational routine --
  202: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  203: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  204: *
  205: *     .. Scalar Arguments ..
  206:       CHARACTER          UPLO, WAY
  207:       INTEGER            INFO, LDA, N
  208: *     ..
  209: *     .. Array Arguments ..
  210:       INTEGER            IPIV( * )
  211:       COMPLEX*16         A( LDA, * ), E( * )
  212: *     ..
  213: *
  214: *  =====================================================================
  215: *
  216: *     .. Parameters ..
  217:       COMPLEX*16         ZERO
  218:       PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
  219: *     ..
  220: *     .. External Functions ..
  221:       LOGICAL            LSAME
  222:       EXTERNAL           LSAME
  223: *
  224: *     .. External Subroutines ..
  225:       EXTERNAL           ZSWAP, XERBLA
  226: *     .. Local Scalars ..
  227:       LOGICAL            UPPER, CONVERT
  228:       INTEGER            I, IP, IP2
  229: *     ..
  230: *     .. Executable Statements ..
  231: *
  232:       INFO = 0
  233:       UPPER = LSAME( UPLO, 'U' )
  234:       CONVERT = LSAME( WAY, 'C' )
  235:       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
  236:          INFO = -1
  237:       ELSE IF( .NOT.CONVERT .AND. .NOT.LSAME( WAY, 'R' ) ) THEN
  238:          INFO = -2
  239:       ELSE IF( N.LT.0 ) THEN
  240:          INFO = -3
  241:       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
  242:          INFO = -5
  243: 
  244:       END IF
  245:       IF( INFO.NE.0 ) THEN
  246:          CALL XERBLA( 'ZSYCONVF_ROOK', -INFO )
  247:          RETURN
  248:       END IF
  249: *
  250: *     Quick return if possible
  251: *
  252:       IF( N.EQ.0 )
  253:      $   RETURN
  254: *
  255:       IF( UPPER ) THEN
  256: *
  257: *        Begin A is UPPER
  258: *
  259:          IF ( CONVERT ) THEN
  260: *
  261: *           Convert A (A is upper)
  262: *
  263: *
  264: *           Convert VALUE
  265: *
  266: *           Assign superdiagonal entries of D to array E and zero out
  267: *           corresponding entries in input storage A
  268: *
  269:             I = N
  270:             E( 1 ) = ZERO
  271:             DO WHILE ( I.GT.1 )
  272:                IF( IPIV( I ).LT.0 ) THEN
  273:                   E( I ) = A( I-1, I )
  274:                   E( I-1 ) = ZERO
  275:                   A( I-1, I ) = ZERO
  276:                   I = I - 1
  277:                ELSE
  278:                   E( I ) = ZERO
  279:                END IF
  280:                I = I - 1
  281:             END DO
  282: *
  283: *           Convert PERMUTATIONS
  284: *
  285: *           Apply permutations to submatrices of upper part of A
  286: *           in factorization order where i decreases from N to 1
  287: *
  288:             I = N
  289:             DO WHILE ( I.GE.1 )
  290:                IF( IPIV( I ).GT.0 ) THEN
  291: *
  292: *                 1-by-1 pivot interchange
  293: *
  294: *                 Swap rows i and IPIV(i) in A(1:i,N-i:N)
  295: *
  296:                   IP = IPIV( I )
  297:                   IF( I.LT.N ) THEN
  298:                      IF( IP.NE.I ) THEN
  299:                         CALL ZSWAP( N-I, A( I, I+1 ), LDA,
  300:      $                              A( IP, I+1 ), LDA )
  301:                      END IF
  302:                   END IF
  303: *
  304:                ELSE
  305: *
  306: *                 2-by-2 pivot interchange
  307: *
  308: *                 Swap rows i and IPIV(i) and i-1 and IPIV(i-1)
  309: *                 in A(1:i,N-i:N)
  310: *
  311:                   IP = -IPIV( I )
  312:                   IP2 = -IPIV( I-1 )
  313:                   IF( I.LT.N ) THEN
  314:                      IF( IP.NE.I ) THEN
  315:                         CALL ZSWAP( N-I, A( I, I+1 ), LDA,
  316:      $                              A( IP, I+1 ), LDA )
  317:                      END IF
  318:                      IF( IP2.NE.(I-1) ) THEN
  319:                         CALL ZSWAP( N-I, A( I-1, I+1 ), LDA,
  320:      $                              A( IP2, I+1 ), LDA )
  321:                      END IF
  322:                   END IF
  323:                   I = I - 1
  324: *
  325:                END IF
  326:                I = I - 1
  327:             END DO
  328: *
  329:          ELSE
  330: *
  331: *           Revert A (A is upper)
  332: *
  333: *
  334: *           Revert PERMUTATIONS
  335: *
  336: *           Apply permutations to submatrices of upper part of A
  337: *           in reverse factorization order where i increases from 1 to N
  338: *
  339:             I = 1
  340:             DO WHILE ( I.LE.N )
  341:                IF( IPIV( I ).GT.0 ) THEN
  342: *
  343: *                 1-by-1 pivot interchange
  344: *
  345: *                 Swap rows i and IPIV(i) in A(1:i,N-i:N)
  346: *
  347:                   IP = IPIV( I )
  348:                   IF( I.LT.N ) THEN
  349:                      IF( IP.NE.I ) THEN
  350:                         CALL ZSWAP( N-I, A( IP, I+1 ), LDA,
  351:      $                              A( I, I+1 ), LDA )
  352:                      END IF
  353:                   END IF
  354: *
  355:                ELSE
  356: *
  357: *                 2-by-2 pivot interchange
  358: *
  359: *                 Swap rows i-1 and IPIV(i-1) and i and IPIV(i)
  360: *                 in A(1:i,N-i:N)
  361: *
  362:                   I = I + 1
  363:                   IP = -IPIV( I )
  364:                   IP2 = -IPIV( I-1 )
  365:                   IF( I.LT.N ) THEN
  366:                      IF( IP2.NE.(I-1) ) THEN
  367:                         CALL ZSWAP( N-I, A( IP2, I+1 ), LDA,
  368:      $                              A( I-1, I+1 ), LDA )
  369:                      END IF
  370:                      IF( IP.NE.I ) THEN
  371:                         CALL ZSWAP( N-I, A( IP, I+1 ), LDA,
  372:      $                              A( I, I+1 ), LDA )
  373:                      END IF
  374:                   END IF
  375: *
  376:                END IF
  377:                I = I + 1
  378:             END DO
  379: *
  380: *           Revert VALUE
  381: *           Assign superdiagonal entries of D from array E to
  382: *           superdiagonal entries of A.
  383: *
  384:             I = N
  385:             DO WHILE ( I.GT.1 )
  386:                IF( IPIV( I ).LT.0 ) THEN
  387:                   A( I-1, I ) = E( I )
  388:                   I = I - 1
  389:                END IF
  390:                I = I - 1
  391:             END DO
  392: *
  393: *        End A is UPPER
  394: *
  395:          END IF
  396: *
  397:       ELSE
  398: *
  399: *        Begin A is LOWER
  400: *
  401:          IF ( CONVERT ) THEN
  402: *
  403: *           Convert A (A is lower)
  404: *
  405: *
  406: *           Convert VALUE
  407: *           Assign subdiagonal entries of D to array E and zero out
  408: *           corresponding entries in input storage A
  409: *
  410:             I = 1
  411:             E( N ) = ZERO
  412:             DO WHILE ( I.LE.N )
  413:                IF( I.LT.N .AND. IPIV(I).LT.0 ) THEN
  414:                   E( I ) = A( I+1, I )
  415:                   E( I+1 ) = ZERO
  416:                   A( I+1, I ) = ZERO
  417:                   I = I + 1
  418:                ELSE
  419:                   E( I ) = ZERO
  420:                END IF
  421:                I = I + 1
  422:             END DO
  423: *
  424: *           Convert PERMUTATIONS
  425: *
  426: *           Apply permutations to submatrices of lower part of A
  427: *           in factorization order where i increases from 1 to N
  428: *
  429:             I = 1
  430:             DO WHILE ( I.LE.N )
  431:                IF( IPIV( I ).GT.0 ) THEN
  432: *
  433: *                 1-by-1 pivot interchange
  434: *
  435: *                 Swap rows i and IPIV(i) in A(i:N,1:i-1)
  436: *
  437:                   IP = IPIV( I )
  438:                   IF ( I.GT.1 ) THEN
  439:                      IF( IP.NE.I ) THEN
  440:                         CALL ZSWAP( I-1, A( I, 1 ), LDA,
  441:      $                              A( IP, 1 ), LDA )
  442:                      END IF
  443:                   END IF
  444: *
  445:                ELSE
  446: *
  447: *                 2-by-2 pivot interchange
  448: *
  449: *                 Swap rows i and IPIV(i) and i+1 and IPIV(i+1)
  450: *                 in A(i:N,1:i-1)
  451: *
  452:                   IP = -IPIV( I )
  453:                   IP2 = -IPIV( I+1 )
  454:                   IF ( I.GT.1 ) THEN
  455:                      IF( IP.NE.I ) THEN
  456:                         CALL ZSWAP( I-1, A( I, 1 ), LDA,
  457:      $                              A( IP, 1 ), LDA )
  458:                      END IF
  459:                      IF( IP2.NE.(I+1) ) THEN
  460:                         CALL ZSWAP( I-1, A( I+1, 1 ), LDA,
  461:      $                              A( IP2, 1 ), LDA )
  462:                      END IF
  463:                   END IF
  464:                   I = I + 1
  465: *
  466:                END IF
  467:                I = I + 1
  468:             END DO
  469: *
  470:          ELSE
  471: *
  472: *           Revert A (A is lower)
  473: *
  474: *
  475: *           Revert PERMUTATIONS
  476: *
  477: *           Apply permutations to submatrices of lower part of A
  478: *           in reverse factorization order where i decreases from N to 1
  479: *
  480:             I = N
  481:             DO WHILE ( I.GE.1 )
  482:                IF( IPIV( I ).GT.0 ) THEN
  483: *
  484: *                 1-by-1 pivot interchange
  485: *
  486: *                 Swap rows i and IPIV(i) in A(i:N,1:i-1)
  487: *
  488:                   IP = IPIV( I )
  489:                   IF ( I.GT.1 ) THEN
  490:                      IF( IP.NE.I ) THEN
  491:                         CALL ZSWAP( I-1, A( IP, 1 ), LDA,
  492:      $                              A( I, 1 ), LDA )
  493:                      END IF
  494:                   END IF
  495: *
  496:                ELSE
  497: *
  498: *                 2-by-2 pivot interchange
  499: *
  500: *                 Swap rows i+1 and IPIV(i+1) and i and IPIV(i)
  501: *                 in A(i:N,1:i-1)
  502: *
  503:                   I = I - 1
  504:                   IP = -IPIV( I )
  505:                   IP2 = -IPIV( I+1 )
  506:                   IF ( I.GT.1 ) THEN
  507:                      IF( IP2.NE.(I+1) ) THEN
  508:                         CALL ZSWAP( I-1, A( IP2, 1 ), LDA,
  509:      $                              A( I+1, 1 ), LDA )
  510:                      END IF
  511:                      IF( IP.NE.I ) THEN
  512:                         CALL ZSWAP( I-1, A( IP, 1 ), LDA,
  513:      $                              A( I, 1 ), LDA )
  514:                      END IF
  515:                   END IF
  516: *
  517:                END IF
  518:                I = I - 1
  519:             END DO
  520: *
  521: *           Revert VALUE
  522: *           Assign subdiagonal entries of D from array E to
  523: *           subgiagonal entries of A.
  524: *
  525:             I = 1
  526:             DO WHILE ( I.LE.N-1 )
  527:                IF( IPIV( I ).LT.0 ) THEN
  528:                   A( I + 1, I ) = E( I )
  529:                   I = I + 1
  530:                END IF
  531:                I = I + 1
  532:             END DO
  533: *
  534:          END IF
  535: *
  536: *        End A is LOWER
  537: *
  538:       END IF
  539: 
  540:       RETURN
  541: *
  542: *     End of ZSYCONVF_ROOK
  543: *
  544:       END

CVSweb interface <joel.bertrand@systella.fr>