1*> \brief \b CHESWAPR applies an elementary permutation on the rows and columns of a Hermitian matrix.
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download CHESWAPR + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cheswapr.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cheswapr.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cheswapr.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18*  Definition:
19*  ===========
20*
21*       SUBROUTINE CHESWAPR( UPLO, N, A, LDA, I1, I2)
22*
23*       .. Scalar Arguments ..
24*       CHARACTER        UPLO
25*       INTEGER          I1, I2, LDA, N
26*       ..
27*       .. Array Arguments ..
28*       COMPLEX          A( LDA, N )
29*
30*
31*> \par Purpose:
32*  =============
33*>
34*> \verbatim
35*>
36*> CHESWAPR applies an elementary permutation on the rows and the columns of
37*> a hermitian matrix.
38*> \endverbatim
39*
40*  Arguments:
41*  ==========
42*
43*> \param[in] UPLO
44*> \verbatim
45*>          UPLO is CHARACTER*1
46*>          Specifies whether the details of the factorization are stored
47*>          as an upper or lower triangular matrix.
48*>          = 'U':  Upper triangular, form is A = U*D*U**T;
49*>          = 'L':  Lower triangular, form is A = L*D*L**T.
50*> \endverbatim
51*>
52*> \param[in] N
53*> \verbatim
54*>          N is INTEGER
55*>          The order of the matrix A.  N >= 0.
56*> \endverbatim
57*>
58*> \param[in,out] A
59*> \verbatim
60*>          A is COMPLEX array, dimension (LDA,N)
61*>          On entry, the NB diagonal matrix D and the multipliers
62*>          used to obtain the factor U or L as computed by CSYTRF.
63*>
64*>          On exit, if INFO = 0, the (symmetric) inverse of the original
65*>          matrix.  If UPLO = 'U', the upper triangular part of the
66*>          inverse is formed and the part of A below the diagonal is not
67*>          referenced; if UPLO = 'L' the lower triangular part of the
68*>          inverse is formed and the part of A above the diagonal is
69*>          not referenced.
70*> \endverbatim
71*>
72*> \param[in] LDA
73*> \verbatim
74*>          LDA is INTEGER
75*>          The leading dimension of the array A.  LDA >= max(1,N).
76*> \endverbatim
77*>
78*> \param[in] I1
79*> \verbatim
80*>          I1 is INTEGER
81*>          Index of the first row to swap
82*> \endverbatim
83*>
84*> \param[in] I2
85*> \verbatim
86*>          I2 is INTEGER
87*>          Index of the second row to swap
88*> \endverbatim
89*
90*  Authors:
91*  ========
92*
93*> \author Univ. of Tennessee
94*> \author Univ. of California Berkeley
95*> \author Univ. of Colorado Denver
96*> \author NAG Ltd.
97*
98*> \ingroup complexHEauxiliary
99*
100*  =====================================================================
101      SUBROUTINE CHESWAPR( UPLO, N, A, LDA, I1, I2)
102*
103*  -- LAPACK auxiliary routine --
104*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
105*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
106*
107*     .. Scalar Arguments ..
108      CHARACTER        UPLO
109      INTEGER          I1, I2, LDA, N
110*     ..
111*     .. Array Arguments ..
112      COMPLEX          A( LDA, N )
113*
114*  =====================================================================
115*
116*     ..
117*     .. Local Scalars ..
118      LOGICAL            UPPER
119      INTEGER            I
120      COMPLEX            TMP
121*
122*     .. External Functions ..
123      LOGICAL            LSAME
124      EXTERNAL           LSAME
125*     ..
126*     .. External Subroutines ..
127      EXTERNAL           CSWAP
128*     ..
129*     .. Executable Statements ..
130*
131      UPPER = LSAME( UPLO, 'U' )
132      IF (UPPER) THEN
133*
134*         UPPER
135*         first swap
136*          - swap column I1 and I2 from I1 to I1-1
137         CALL CSWAP( I1-1, A(1,I1), 1, A(1,I2), 1 )
138*
139*          second swap :
140*          - swap A(I1,I1) and A(I2,I2)
141*          - swap row I1 from I1+1 to I2-1 with col I2 from I1+1 to I2-1
142*          - swap A(I2,I1) and A(I1,I2)
143
144         TMP=A(I1,I1)
145         A(I1,I1)=A(I2,I2)
146         A(I2,I2)=TMP
147*
148         DO I=1,I2-I1-1
149            TMP=A(I1,I1+I)
150            A(I1,I1+I)=CONJG(A(I1+I,I2))
151            A(I1+I,I2)=CONJG(TMP)
152         END DO
153*
154          A(I1,I2)=CONJG(A(I1,I2))
155
156*
157*          third swap
158*          - swap row I1 and I2 from I2+1 to N
159         DO I=I2+1,N
160            TMP=A(I1,I)
161            A(I1,I)=A(I2,I)
162            A(I2,I)=TMP
163         END DO
164*
165        ELSE
166*
167*         LOWER
168*         first swap
169*          - swap row I1 and I2 from 1 to I1-1
170         CALL CSWAP ( I1-1, A(I1,1), LDA, A(I2,1), LDA )
171*
172*         second swap :
173*          - swap A(I1,I1) and A(I2,I2)
174*          - swap col I1 from I1+1 to I2-1 with row I2 from I1+1 to I2-1
175*          - swap A(I2,I1) and A(I1,I2)
176
177          TMP=A(I1,I1)
178          A(I1,I1)=A(I2,I2)
179          A(I2,I2)=TMP
180*
181          DO I=1,I2-I1-1
182             TMP=A(I1+I,I1)
183             A(I1+I,I1)=CONJG(A(I2,I1+I))
184             A(I2,I1+I)=CONJG(TMP)
185          END DO
186*
187          A(I2,I1)=CONJG(A(I2,I1))
188*
189*         third swap
190*          - swap col I1 and I2 from I2+1 to N
191          DO I=I2+1,N
192             TMP=A(I,I1)
193             A(I,I1)=A(I,I2)
194             A(I,I2)=TMP
195          END DO
196*
197      ENDIF
198
199      END SUBROUTINE CHESWAPR
200
201