File:  [local] / rpl / lapack / lapack / dsyconvf.f
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Sat Jun 17 11:02:50 2017 UTC (6 years, 11 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Ajout des nouveaux fichiers pour lapack 3.7.0.

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

CVSweb interface <joel.bertrand@systella.fr>