1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
SUBROUTINE DSYSWAPR( UPLO, N, A, LDA, I1, I2)
* * -- LAPACK auxiliary routine (version 3.3.1) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- * -- April 2011 -- * * .. Scalar Arguments .. CHARACTER UPLO INTEGER I1, I2, LDA, N * .. * .. Array Arguments .. DOUBLE PRECISION A( LDA, N ) * * Purpose * ======= * * DSYSWAPR applies an elementary permutation on the rows and the columns of * a symmetric matrix. * * Arguments * ========= * * UPLO (input) CHARACTER*1 * Specifies whether the details of the factorization are stored * as an upper or lower triangular matrix. * = 'U': Upper triangular, form is A = U*D*U**T; * = 'L': Lower triangular, form is A = L*D*L**T. * * N (input) INTEGER * The order of the matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the NB diagonal matrix D and the multipliers * used to obtain the factor U or L as computed by DSYTRF. * * On exit, if INFO = 0, the (symmetric) inverse of the original * matrix. If UPLO = 'U', the upper triangular part of the * inverse is formed and the part of A below the diagonal is not * referenced; if UPLO = 'L' the lower triangular part of the * inverse is formed and the part of A above the diagonal is * not referenced. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * I1 (input) INTEGER * Index of the first row to swap * * I2 (input) INTEGER * Index of the second row to swap * * ===================================================================== * * .. * .. Local Scalars .. LOGICAL UPPER INTEGER I DOUBLE PRECISION TMP * * .. External Functions .. LOGICAL LSAME EXTERNAL LSAME * .. * .. External Subroutines .. EXTERNAL DSWAP * .. * .. Executable Statements .. * UPPER = LSAME( UPLO, 'U' ) IF (UPPER) THEN * * UPPER * first swap * - swap column I1 and I2 from I1 to I1-1 CALL DSWAP( I1-1, A(1,I1), 1, A(1,I2), 1 ) * * second swap : * - swap A(I1,I1) and A(I2,I2) * - swap row I1 from I1+1 to I2-1 with col I2 from I1+1 to I2-1 TMP=A(I1,I1) A(I1,I1)=A(I2,I2) A(I2,I2)=TMP * DO I=1,I2-I1-1 TMP=A(I1,I1+I) A(I1,I1+I)=A(I1+I,I2) A(I1+I,I2)=TMP END DO * * third swap * - swap row I1 and I2 from I2+1 to N DO I=I2+1,N TMP=A(I1,I) A(I1,I)=A(I2,I) A(I2,I)=TMP END DO * ELSE * * LOWER * first swap * - swap row I1 and I2 from I1 to I1-1 CALL DSWAP( I1-1, A(I1,1), LDA, A(I2,1), LDA ) * * second swap : * - swap A(I1,I1) and A(I2,I2) * - swap col I1 from I1+1 to I2-1 with row I2 from I1+1 to I2-1 TMP=A(I1,I1) A(I1,I1)=A(I2,I2) A(I2,I2)=TMP * DO I=1,I2-I1-1 TMP=A(I1+I,I1) A(I1+I,I1)=A(I2,I1+I) A(I2,I1+I)=TMP END DO * * third swap * - swap col I1 and I2 from I2+1 to N DO I=I2+1,N TMP=A(I,I1) A(I,I1)=A(I,I2) A(I,I2)=TMP END DO * ENDIF END SUBROUTINE DSYSWAPR |