File:  [local] / rpl / lapack / lapack / dsyconv.f
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Fri Jul 22 07:40:26 2011 UTC (12 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_3, rpl-4_1_2, rpl-4_1_1, HEAD
Cohérence.

    1:       SUBROUTINE DSYCONV( UPLO, WAY, N, A, LDA, IPIV, WORK, INFO )
    2: *
    3: *  -- LAPACK PROTOTYPE routine (version 3.3.0) --
    4: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
    5: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
    6: *     November 2010
    7: *
    8: *  -- Written by Julie Langou of the Univ. of TN    --
    9: *
   10: *     .. Scalar Arguments ..
   11:       CHARACTER          UPLO, WAY
   12:       INTEGER            INFO, LDA, N
   13: *     ..
   14: *     .. Array Arguments ..
   15:       INTEGER            IPIV( * )
   16:       DOUBLE PRECISION   A( LDA, * ), WORK( * )
   17: *     ..
   18: *
   19: *  Purpose
   20: *  =======
   21: *
   22: *  DSYCONV convert A given by TRF into L and D and vice-versa.
   23: *  Get Non-diag elements of D (returned in workspace) and 
   24: *  apply or reverse permutation done in TRF.
   25: *
   26: *  Arguments
   27: *  =========
   28: *
   29: *  UPLO    (input) CHARACTER*1
   30: *          Specifies whether the details of the factorization are stored
   31: *          as an upper or lower triangular matrix.
   32: *          = 'U':  Upper triangular, form is A = U*D*U**T;
   33: *          = 'L':  Lower triangular, form is A = L*D*L**T.
   34:    35: *  WAY     (input) CHARACTER*1
   36: *          = 'C': Convert 
   37: *          = 'R': Revert
   38: *
   39: *  N       (input) INTEGER
   40: *          The order of the matrix A.  N >= 0.
   41: *
   42: *  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
   43: *          The block diagonal matrix D and the multipliers used to
   44: *          obtain the factor U or L as computed by DSYTRF.
   45: *
   46: *  LDA     (input) INTEGER
   47: *          The leading dimension of the array A.  LDA >= max(1,N).
   48: *
   49: *  IPIV    (input) INTEGER array, dimension (N)
   50: *          Details of the interchanges and the block structure of D
   51: *          as determined by DSYTRF.
   52: *
   53: * WORK     (workspace) DOUBLE PRECISION array, dimension (N)
   54: *
   55: * LWORK    (input) INTEGER
   56: *          The length of WORK.  LWORK >=1. 
   57: *          LWORK = N
   58: *
   59: *          If LWORK = -1, then a workspace query is assumed; the routine
   60: *          only calculates the optimal size of the WORK array, returns
   61: *          this value as the first entry of the WORK array, and no error
   62: *          message related to LWORK is issued by XERBLA.
   63: *
   64: *  INFO    (output) INTEGER
   65: *          = 0:  successful exit
   66: *          < 0:  if INFO = -i, the i-th argument had an illegal value
   67: *
   68: *  =====================================================================
   69: *
   70: *     .. Parameters ..
   71:       DOUBLE PRECISION   ZERO
   72:       PARAMETER          ( ZERO = 0.0D+0 )
   73: *     ..
   74: *     .. External Functions ..
   75:       LOGICAL            LSAME
   76:       EXTERNAL           LSAME
   77: *
   78: *     .. External Subroutines ..
   79:       EXTERNAL           XERBLA
   80: *     .. Local Scalars ..
   81:       LOGICAL            UPPER, CONVERT
   82:       INTEGER            I, IP, J
   83:       DOUBLE PRECISION   TEMP
   84: *     ..
   85: *     .. Executable Statements ..
   86: *
   87:       INFO = 0
   88:       UPPER = LSAME( UPLO, 'U' )
   89:       CONVERT = LSAME( WAY, 'C' )
   90:       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
   91:          INFO = -1
   92:       ELSE IF( .NOT.CONVERT .AND. .NOT.LSAME( WAY, 'R' ) ) THEN
   93:          INFO = -2
   94:       ELSE IF( N.LT.0 ) THEN
   95:          INFO = -3
   96:       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
   97:          INFO = -5
   98: 
   99:       END IF
  100:       IF( INFO.NE.0 ) THEN
  101:          CALL XERBLA( 'DSYCONV', -INFO )
  102:          RETURN
  103:       END IF
  104: *
  105: *     Quick return if possible
  106: *
  107:       IF( N.EQ.0 )
  108:      $   RETURN
  109: *
  110:       IF( UPPER ) THEN
  111: *
  112: *      A is UPPER
  113: *
  114: *      Convert A (A is upper)
  115: *
  116: *        Convert VALUE
  117: *
  118:          IF ( CONVERT ) THEN
  119:             I=N
  120:             WORK(1)=ZERO
  121:             DO WHILE ( I .GT. 1 )
  122:                IF( IPIV(I) .LT. 0 ) THEN
  123:                   WORK(I)=A(I-1,I)
  124:                   A(I-1,I)=ZERO
  125:                   I=I-1
  126:                ELSE
  127:                   WORK(I)=ZERO
  128:                ENDIF
  129:                I=I-1
  130:             END DO
  131: *
  132: *        Convert PERMUTATIONS
  133: *  
  134:          I=N
  135:          DO WHILE ( I .GE. 1 )
  136:             IF( IPIV(I) .GT. 0) THEN
  137:                IP=IPIV(I)
  138:                IF( I .LT. N) THEN
  139:                   DO 12 J= I+1,N
  140:                     TEMP=A(IP,J)
  141:                     A(IP,J)=A(I,J)
  142:                     A(I,J)=TEMP
  143:  12            CONTINUE
  144:                ENDIF
  145:             ELSE
  146:               IP=-IPIV(I)
  147:                IF( I .LT. N) THEN
  148:              DO 13 J= I+1,N
  149:                  TEMP=A(IP,J)
  150:                  A(IP,J)=A(I-1,J)
  151:                  A(I-1,J)=TEMP
  152:  13            CONTINUE
  153:                 ENDIF
  154:                 I=I-1
  155:            ENDIF
  156:            I=I-1
  157:         END DO
  158: 
  159:          ELSE
  160: *
  161: *      Revert A (A is upper)
  162: *
  163: *
  164: *        Revert PERMUTATIONS
  165: *  
  166:             I=1
  167:             DO WHILE ( I .LE. N )
  168:                IF( IPIV(I) .GT. 0 ) THEN
  169:                   IP=IPIV(I)
  170:                   IF( I .LT. N) THEN
  171:                   DO J= I+1,N
  172:                     TEMP=A(IP,J)
  173:                     A(IP,J)=A(I,J)
  174:                     A(I,J)=TEMP
  175:                   END DO
  176:                   ENDIF
  177:                ELSE
  178:                  IP=-IPIV(I)
  179:                  I=I+1
  180:                  IF( I .LT. N) THEN
  181:                     DO J= I+1,N
  182:                        TEMP=A(IP,J)
  183:                        A(IP,J)=A(I-1,J)
  184:                        A(I-1,J)=TEMP
  185:                     END DO
  186:                  ENDIF
  187:                ENDIF
  188:                I=I+1
  189:             END DO
  190: *
  191: *        Revert VALUE
  192: *
  193:             I=N
  194:             DO WHILE ( I .GT. 1 )
  195:                IF( IPIV(I) .LT. 0 ) THEN
  196:                   A(I-1,I)=WORK(I)
  197:                   I=I-1
  198:                ENDIF
  199:                I=I-1
  200:             END DO
  201:          END IF
  202:       ELSE
  203: *
  204: *      A is LOWER
  205: *
  206:          IF ( CONVERT ) THEN
  207: *
  208: *      Convert A (A is lower)
  209: *
  210: *
  211: *        Convert VALUE
  212: *
  213:             I=1
  214:             WORK(N)=ZERO
  215:             DO WHILE ( I .LE. N )
  216:                IF( I.LT.N .AND. IPIV(I) .LT. 0 ) THEN
  217:                   WORK(I)=A(I+1,I)
  218:                   A(I+1,I)=ZERO
  219:                   I=I+1
  220:                ELSE
  221:                   WORK(I)=ZERO
  222:                ENDIF
  223:                I=I+1
  224:             END DO
  225: *
  226: *        Convert PERMUTATIONS
  227: *
  228:          I=1
  229:          DO WHILE ( I .LE. N )
  230:             IF( IPIV(I) .GT. 0 ) THEN
  231:                IP=IPIV(I)
  232:                IF (I .GT. 1) THEN
  233:                DO 22 J= 1,I-1
  234:                  TEMP=A(IP,J)
  235:                  A(IP,J)=A(I,J)
  236:                  A(I,J)=TEMP
  237:  22            CONTINUE
  238:                ENDIF
  239:             ELSE
  240:               IP=-IPIV(I)
  241:               IF (I .GT. 1) THEN
  242:               DO 23 J= 1,I-1
  243:                  TEMP=A(IP,J)
  244:                  A(IP,J)=A(I+1,J)
  245:                  A(I+1,J)=TEMP
  246:  23           CONTINUE
  247:               ENDIF
  248:               I=I+1
  249:            ENDIF
  250:            I=I+1
  251:         END DO
  252:          ELSE
  253: *
  254: *      Revert A (A is lower)
  255: *
  256: *
  257: *        Revert PERMUTATIONS
  258: *
  259:             I=N
  260:             DO WHILE ( I .GE. 1 )
  261:                IF( IPIV(I) .GT. 0 ) THEN
  262:                   IP=IPIV(I)
  263:                   IF (I .GT. 1) THEN
  264:                      DO J= 1,I-1
  265:                         TEMP=A(I,J)
  266:                         A(I,J)=A(IP,J)
  267:                         A(IP,J)=TEMP
  268:                      END DO
  269:                   ENDIF
  270:                ELSE
  271:                   IP=-IPIV(I)
  272:                   I=I-1
  273:                   IF (I .GT. 1) THEN
  274:                      DO J= 1,I-1
  275:                         TEMP=A(I+1,J)
  276:                         A(I+1,J)=A(IP,J)
  277:                         A(IP,J)=TEMP
  278:                      END DO
  279:                   ENDIF
  280:                ENDIF
  281:                I=I-1
  282:             END DO
  283: *
  284: *        Revert VALUE
  285: *
  286:             I=1
  287:             DO WHILE ( I .LE. N-1 )
  288:                IF( IPIV(I) .LT. ZERO ) THEN
  289:                   A(I+1,I)=WORK(I)
  290:                   I=I+1
  291:                ENDIF
  292:                I=I+1
  293:             END DO
  294:          END IF
  295:       END IF
  296: 
  297:       RETURN
  298: *
  299: *     End of DSYCONV
  300: *
  301:       END

CVSweb interface <joel.bertrand@systella.fr>