ENH: Improving the travis dashboard name
[platform/upstream/lapack.git] / SRC / chegs2.f
1 *> \brief \b CHEGS2 reduces a Hermitian definite generalized eigenproblem to standard form, using the factorization results obtained from cpotrf (unblocked algorithm).
2 *
3 *  =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 *            http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download CHEGS2 + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/chegs2.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/chegs2.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/chegs2.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 *  Definition:
19 *  ===========
20 *
21 *       SUBROUTINE CHEGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
22 *
23 *       .. Scalar Arguments ..
24 *       CHARACTER          UPLO
25 *       INTEGER            INFO, ITYPE, LDA, LDB, N
26 *       ..
27 *       .. Array Arguments ..
28 *       COMPLEX            A( LDA, * ), B( LDB, * )
29 *       ..
30 *
31 *
32 *> \par Purpose:
33 *  =============
34 *>
35 *> \verbatim
36 *>
37 *> CHEGS2 reduces a complex Hermitian-definite generalized
38 *> eigenproblem to standard form.
39 *>
40 *> If ITYPE = 1, the problem is A*x = lambda*B*x,
41 *> and A is overwritten by inv(U**H)*A*inv(U) or inv(L)*A*inv(L**H)
42 *>
43 *> If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
44 *> B*A*x = lambda*x, and A is overwritten by U*A*U**H or L**H *A*L.
45 *>
46 *> B must have been previously factorized as U**H *U or L*L**H by ZPOTRF.
47 *> \endverbatim
48 *
49 *  Arguments:
50 *  ==========
51 *
52 *> \param[in] ITYPE
53 *> \verbatim
54 *>          ITYPE is INTEGER
55 *>          = 1: compute inv(U**H)*A*inv(U) or inv(L)*A*inv(L**H);
56 *>          = 2 or 3: compute U*A*U**H or L**H *A*L.
57 *> \endverbatim
58 *>
59 *> \param[in] UPLO
60 *> \verbatim
61 *>          UPLO is CHARACTER*1
62 *>          Specifies whether the upper or lower triangular part of the
63 *>          Hermitian matrix A is stored, and how B has been factorized.
64 *>          = 'U':  Upper triangular
65 *>          = 'L':  Lower triangular
66 *> \endverbatim
67 *>
68 *> \param[in] N
69 *> \verbatim
70 *>          N is INTEGER
71 *>          The order of the matrices A and B.  N >= 0.
72 *> \endverbatim
73 *>
74 *> \param[in,out] A
75 *> \verbatim
76 *>          A is COMPLEX array, dimension (LDA,N)
77 *>          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
78 *>          n by n upper triangular part of A contains the upper
79 *>          triangular part of the matrix A, and the strictly lower
80 *>          triangular part of A is not referenced.  If UPLO = 'L', the
81 *>          leading n by n lower triangular part of A contains the lower
82 *>          triangular part of the matrix A, and the strictly upper
83 *>          triangular part of A is not referenced.
84 *>
85 *>          On exit, if INFO = 0, the transformed matrix, stored in the
86 *>          same format as A.
87 *> \endverbatim
88 *>
89 *> \param[in] LDA
90 *> \verbatim
91 *>          LDA is INTEGER
92 *>          The leading dimension of the array A.  LDA >= max(1,N).
93 *> \endverbatim
94 *>
95 *> \param[in,out] B
96 *> \verbatim
97 *>          B is COMPLEX array, dimension (LDB,N)
98 *>          The triangular factor from the Cholesky factorization of B,
99 *>          as returned by CPOTRF.
100 *> \endverbatim
101 *>
102 *> \param[in] LDB
103 *> \verbatim
104 *>          LDB is INTEGER
105 *>          The leading dimension of the array B.  LDB >= max(1,N).
106 *> \endverbatim
107 *>
108 *> \param[out] INFO
109 *> \verbatim
110 *>          INFO is INTEGER
111 *>          = 0:  successful exit.
112 *>          < 0:  if INFO = -i, the i-th argument had an illegal value.
113 *> \endverbatim
114 *
115 *  Authors:
116 *  ========
117 *
118 *> \author Univ. of Tennessee
119 *> \author Univ. of California Berkeley
120 *> \author Univ. of Colorado Denver
121 *> \author NAG Ltd.
122 *
123 *> \date September 2012
124 *
125 *> \ingroup complexHEcomputational
126 *
127 *  =====================================================================
128       SUBROUTINE CHEGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
129 *
130 *  -- LAPACK computational routine (version 3.4.2) --
131 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
132 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
133 *     September 2012
134 *
135 *     .. Scalar Arguments ..
136       CHARACTER          UPLO
137       INTEGER            INFO, ITYPE, LDA, LDB, N
138 *     ..
139 *     .. Array Arguments ..
140       COMPLEX            A( LDA, * ), B( LDB, * )
141 *     ..
142 *
143 *  =====================================================================
144 *
145 *     .. Parameters ..
146       REAL               ONE, HALF
147       PARAMETER          ( ONE = 1.0E+0, HALF = 0.5E+0 )
148       COMPLEX            CONE
149       PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ) )
150 *     ..
151 *     .. Local Scalars ..
152       LOGICAL            UPPER
153       INTEGER            K
154       REAL               AKK, BKK
155       COMPLEX            CT
156 *     ..
157 *     .. External Subroutines ..
158       EXTERNAL           CAXPY, CHER2, CLACGV, CSSCAL, CTRMV, CTRSV,
159      $                   XERBLA
160 *     ..
161 *     .. Intrinsic Functions ..
162       INTRINSIC          MAX
163 *     ..
164 *     .. External Functions ..
165       LOGICAL            LSAME
166       EXTERNAL           LSAME
167 *     ..
168 *     .. Executable Statements ..
169 *
170 *     Test the input parameters.
171 *
172       INFO = 0
173       UPPER = LSAME( UPLO, 'U' )
174       IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
175          INFO = -1
176       ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
177          INFO = -2
178       ELSE IF( N.LT.0 ) THEN
179          INFO = -3
180       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
181          INFO = -5
182       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
183          INFO = -7
184       END IF
185       IF( INFO.NE.0 ) THEN
186          CALL XERBLA( 'CHEGS2', -INFO )
187          RETURN
188       END IF
189 *
190       IF( ITYPE.EQ.1 ) THEN
191          IF( UPPER ) THEN
192 *
193 *           Compute inv(U**H)*A*inv(U)
194 *
195             DO 10 K = 1, N
196 *
197 *              Update the upper triangle of A(k:n,k:n)
198 *
199                AKK = A( K, K )
200                BKK = B( K, K )
201                AKK = AKK / BKK**2
202                A( K, K ) = AKK
203                IF( K.LT.N ) THEN
204                   CALL CSSCAL( N-K, ONE / BKK, A( K, K+1 ), LDA )
205                   CT = -HALF*AKK
206                   CALL CLACGV( N-K, A( K, K+1 ), LDA )
207                   CALL CLACGV( N-K, B( K, K+1 ), LDB )
208                   CALL CAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
209      $                        LDA )
210                   CALL CHER2( UPLO, N-K, -CONE, A( K, K+1 ), LDA,
211      $                        B( K, K+1 ), LDB, A( K+1, K+1 ), LDA )
212                   CALL CAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
213      $                        LDA )
214                   CALL CLACGV( N-K, B( K, K+1 ), LDB )
215                   CALL CTRSV( UPLO, 'Conjugate transpose', 'Non-unit',
216      $                        N-K, B( K+1, K+1 ), LDB, A( K, K+1 ),
217      $                        LDA )
218                   CALL CLACGV( N-K, A( K, K+1 ), LDA )
219                END IF
220    10       CONTINUE
221          ELSE
222 *
223 *           Compute inv(L)*A*inv(L**H)
224 *
225             DO 20 K = 1, N
226 *
227 *              Update the lower triangle of A(k:n,k:n)
228 *
229                AKK = A( K, K )
230                BKK = B( K, K )
231                AKK = AKK / BKK**2
232                A( K, K ) = AKK
233                IF( K.LT.N ) THEN
234                   CALL CSSCAL( N-K, ONE / BKK, A( K+1, K ), 1 )
235                   CT = -HALF*AKK
236                   CALL CAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
237                   CALL CHER2( UPLO, N-K, -CONE, A( K+1, K ), 1,
238      $                        B( K+1, K ), 1, A( K+1, K+1 ), LDA )
239                   CALL CAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
240                   CALL CTRSV( UPLO, 'No transpose', 'Non-unit', N-K,
241      $                        B( K+1, K+1 ), LDB, A( K+1, K ), 1 )
242                END IF
243    20       CONTINUE
244          END IF
245       ELSE
246          IF( UPPER ) THEN
247 *
248 *           Compute U*A*U**H
249 *
250             DO 30 K = 1, N
251 *
252 *              Update the upper triangle of A(1:k,1:k)
253 *
254                AKK = A( K, K )
255                BKK = B( K, K )
256                CALL CTRMV( UPLO, 'No transpose', 'Non-unit', K-1, B,
257      $                     LDB, A( 1, K ), 1 )
258                CT = HALF*AKK
259                CALL CAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
260                CALL CHER2( UPLO, K-1, CONE, A( 1, K ), 1, B( 1, K ), 1,
261      $                     A, LDA )
262                CALL CAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
263                CALL CSSCAL( K-1, BKK, A( 1, K ), 1 )
264                A( K, K ) = AKK*BKK**2
265    30       CONTINUE
266          ELSE
267 *
268 *           Compute L**H *A*L
269 *
270             DO 40 K = 1, N
271 *
272 *              Update the lower triangle of A(1:k,1:k)
273 *
274                AKK = A( K, K )
275                BKK = B( K, K )
276                CALL CLACGV( K-1, A( K, 1 ), LDA )
277                CALL CTRMV( UPLO, 'Conjugate transpose', 'Non-unit', K-1,
278      $                     B, LDB, A( K, 1 ), LDA )
279                CT = HALF*AKK
280                CALL CLACGV( K-1, B( K, 1 ), LDB )
281                CALL CAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
282                CALL CHER2( UPLO, K-1, CONE, A( K, 1 ), LDA, B( K, 1 ),
283      $                     LDB, A, LDA )
284                CALL CAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
285                CALL CLACGV( K-1, B( K, 1 ), LDB )
286                CALL CSSCAL( K-1, BKK, A( K, 1 ), LDA )
287                CALL CLACGV( K-1, A( K, 1 ), LDA )
288                A( K, K ) = AKK*BKK**2
289    40       CONTINUE
290          END IF
291       END IF
292       RETURN
293 *
294 *     End of CHEGS2
295 *
296       END