summaryrefslogtreecommitdiff
path: root/SRC/zheswapr.f
diff options
context:
space:
mode:
Diffstat (limited to 'SRC/zheswapr.f')
-rw-r--r--SRC/zheswapr.f136
1 files changed, 136 insertions, 0 deletions
diff --git a/SRC/zheswapr.f b/SRC/zheswapr.f
new file mode 100644
index 00000000..0cead401
--- /dev/null
+++ b/SRC/zheswapr.f
@@ -0,0 +1,136 @@
+ SUBROUTINE ZHESWAPR( UPLO, N, A, I1, I2)
+*
+* -- LAPACK auxiliary routine (version 3.3.0) --
+* -- LAPACK is a software package provided by Univ. of Tennessee, --
+* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
+* November 2010
+*
+* .. Scalar Arguments ..
+ CHARACTER UPLO
+ INTEGER I1, I2, N
+* ..
+* .. Array Arguments ..
+ COMPLEX*16 A(N,N)
+*
+* Purpose
+* =======
+*
+* ZHESWAPR applies an elementary permutation on the rows and the columns of
+* a hermitian 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) COMPLEX*16 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 CSYTRF.
+*
+* 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.
+*
+* 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
+ COMPLEX*16 TMP
+*
+* .. External Functions ..
+ LOGICAL LSAME
+ EXTERNAL LSAME
+* ..
+* .. External Subroutines ..
+ EXTERNAL ZSWAP
+* ..
+* .. Executable Statements ..
+*
+ UPPER = LSAME( UPLO, 'U' )
+ IF (UPPER) THEN
+*
+* UPPER
+* first swap
+* - swap column I1 and I2 from I1 to I1-1
+ CALL ZSWAP( 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
+* - swap A(I2,I1) and A(I1,I2)
+
+ 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)=DCONJG(A(I1+I,I2))
+ A(I1+I,I2)=DCONJG(TMP)
+ END DO
+*
+ A(I1,I2)=DCONJG(A(I1,I2))
+
+*
+* 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 1 to I1-1
+ CALL ZSWAP ( I1-1, A(I1,1), N, A(I2,1), N )
+*
+* 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
+* - swap A(I2,I1) and A(I1,I2)
+
+ 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)=DCONJG(A(I2,I1+I))
+ A(I2,I1+I)=DCONJG(TMP)
+ END DO
+*
+ A(I2,I1)=DCONJG(A(I2,I1))
+*
+* 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 ZHESWAPR
+