Annotation of rpl/lapack/lapack/dsyconv.f, revision 1.3

1.1       bertrand    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>