LAPACK  3.8.0
LAPACK: Linear Algebra PACKage
chesv_aa_2stage.f
Go to the documentation of this file.
1 *> \brief <b> CHESV_AA_2STAGE computes the solution to system of linear equations A * X = B for HE matrices</b>
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download CHESV_AA_2STAGE + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/chesv_aa_2stage.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/chesv_aa_2stage.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/chesv_aa_2stage.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE CHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
22 * IPIV, IPIV2, B, LDB, WORK, LWORK,
23 * INFO )
24 *
25 * .. Scalar Arguments ..
26 * CHARACTER UPLO
27 * INTEGER N, NRHS, LDA, LTB, LDB, LWORK, INFO
28 * ..
29 * .. Array Arguments ..
30 * INTEGER IPIV( * ), IPIV2( * )
31 * COMPLEX A( LDA, * ), TB( * ), B( LDB, *), WORK( * )
32 * ..
33 *
34 *> \par Purpose:
35 * =============
36 *>
37 *> \verbatim
38 *>
39 *> CHESV_AA_2STAGE computes the solution to a complex system of
40 *> linear equations
41 *> A * X = B,
42 *> where A is an N-by-N Hermitian matrix and X and B are N-by-NRHS
43 *> matrices.
44 *>
45 *> Aasen's 2-stage algorithm is used to factor A as
46 *> A = U * T * U**H, if UPLO = 'U', or
47 *> A = L * T * L**H, if UPLO = 'L',
48 *> where U (or L) is a product of permutation and unit upper (lower)
49 *> triangular matrices, and T is Hermitian and band. The matrix T is
50 *> then LU-factored with partial pivoting. The factored form of A
51 *> is then used to solve the system of equations A * X = B.
52 *>
53 *> This is the blocked version of the algorithm, calling Level 3 BLAS.
54 *> \endverbatim
55 *
56 * Arguments:
57 * ==========
58 *
59 *> \param[in] UPLO
60 *> \verbatim
61 *> UPLO is CHARACTER*1
62 *> = 'U': Upper triangle of A is stored;
63 *> = 'L': Lower triangle of A is stored.
64 *> \endverbatim
65 *>
66 *> \param[in] N
67 *> \verbatim
68 *> N is INTEGER
69 *> The order of the matrix A. N >= 0.
70 *> \endverbatim
71 *>
72 *> \param[in] NRHS
73 *> \verbatim
74 *> NRHS is INTEGER
75 *> The number of right hand sides, i.e., the number of columns
76 *> of the matrix B. NRHS >= 0.
77 *> \endverbatim
78 *>
79 *> \param[in,out] A
80 *> \verbatim
81 *> A is COMPLEX array, dimension (LDA,N)
82 *> On entry, the hermitian matrix A. If UPLO = 'U', the leading
83 *> N-by-N upper triangular part of A contains the upper
84 *> triangular part of the matrix A, and the strictly lower
85 *> triangular part of A is not referenced. If UPLO = 'L', the
86 *> leading N-by-N lower triangular part of A contains the lower
87 *> triangular part of the matrix A, and the strictly upper
88 *> triangular part of A is not referenced.
89 *>
90 *> On exit, L is stored below (or above) the subdiaonal blocks,
91 *> when UPLO is 'L' (or 'U').
92 *> \endverbatim
93 *>
94 *> \param[in] LDA
95 *> \verbatim
96 *> LDA is INTEGER
97 *> The leading dimension of the array A. LDA >= max(1,N).
98 *> \endverbatim
99 *>
100 *> \param[out] TB
101 *> \verbatim
102 *> TB is COMPLEX array, dimension (LTB)
103 *> On exit, details of the LU factorization of the band matrix.
104 *> \endverbatim
105 *>
106 *> \param[in] LTB
107 *> \verbatim
108 *> The size of the array TB. LTB >= 4*N, internally
109 *> used to select NB such that LTB >= (3*NB+1)*N.
110 *>
111 *> If LTB = -1, then a workspace query is assumed; the
112 *> routine only calculates the optimal size of LTB,
113 *> returns this value as the first entry of TB, and
114 *> no error message related to LTB is issued by XERBLA.
115 *> \endverbatim
116 *>
117 *> \param[out] IPIV
118 *> \verbatim
119 *> IPIV is INTEGER array, dimension (N)
120 *> On exit, it contains the details of the interchanges, i.e.,
121 *> the row and column k of A were interchanged with the
122 *> row and column IPIV(k).
123 *> \endverbatim
124 *>
125 *> \param[out] IPIV2
126 *> \verbatim
127 *> IPIV is INTEGER array, dimension (N)
128 *> On exit, it contains the details of the interchanges, i.e.,
129 *> the row and column k of T were interchanged with the
130 *> row and column IPIV(k).
131 *> \endverbatim
132 *>
133 *> \param[in,out] B
134 *> \verbatim
135 *> B is COMPLEX array, dimension (LDB,NRHS)
136 *> On entry, the right hand side matrix B.
137 *> On exit, the solution matrix X.
138 *> \endverbatim
139 *>
140 *> \param[in] LDB
141 *> \verbatim
142 *> LDB is INTEGER
143 *> The leading dimension of the array B. LDB >= max(1,N).
144 *> \endverbatim
145 *>
146 *> \param[out] WORK
147 *> \verbatim
148 *> WORK is COMPLEX workspace of size LWORK
149 *> \endverbatim
150 *>
151 *> \param[in] LWORK
152 *> \verbatim
153 *> The size of WORK. LWORK >= N, internally used to select NB
154 *> such that LWORK >= N*NB.
155 *>
156 *> If LWORK = -1, then a workspace query is assumed; the
157 *> routine only calculates the optimal size of the WORK array,
158 *> returns this value as the first entry of the WORK array, and
159 *> no error message related to LWORK is issued by XERBLA.
160 *> \endverbatim
161 *>
162 *> \param[out] INFO
163 *> \verbatim
164 *> INFO is INTEGER
165 *> = 0: successful exit
166 *> < 0: if INFO = -i, the i-th argument had an illegal value.
167 *> > 0: if INFO = i, band LU factorization failed on i-th column
168 *> \endverbatim
169 *
170 * Authors:
171 * ========
172 *
173 *> \author Univ. of Tennessee
174 *> \author Univ. of California Berkeley
175 *> \author Univ. of Colorado Denver
176 *> \author NAG Ltd.
177 *
178 *> \date November 2017
179 *
180 *> \ingroup complexSYcomputational
181 *
182 * =====================================================================
183  SUBROUTINE chesv_aa_2stage( UPLO, N, NRHS, A, LDA, TB, LTB,
184  $ IPIV, IPIV2, B, LDB, WORK, LWORK,
185  $ INFO )
186 *
187 * -- LAPACK computational routine (version 3.8.0) --
188 * -- LAPACK is a software package provided by Univ. of Tennessee, --
189 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
190 * November 2017
191 *
192  IMPLICIT NONE
193 *
194 * .. Scalar Arguments ..
195  CHARACTER UPLO
196  INTEGER N, NRHS, LDA, LDB, LTB, LWORK, INFO
197 * ..
198 * .. Array Arguments ..
199  INTEGER IPIV( * ), IPIV2( * )
200  COMPLEX A( lda, * ), B( ldb, * ), TB( * ), WORK( * )
201 * ..
202 *
203 * =====================================================================
204 *
205 * .. Local Scalars ..
206  LOGICAL UPPER, TQUERY, WQUERY
207  INTEGER LWKOPT
208 * ..
209 * .. External Functions ..
210  LOGICAL LSAME
211  EXTERNAL lsame
212 * ..
213 * .. External Subroutines ..
215  $ xerbla
216 * ..
217 * .. Intrinsic Functions ..
218  INTRINSIC max
219 * ..
220 * .. Executable Statements ..
221 *
222 * Test the input parameters.
223 *
224  info = 0
225  upper = lsame( uplo, 'U' )
226  wquery = ( lwork.EQ.-1 )
227  tquery = ( ltb.EQ.-1 )
228  IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
229  info = -1
230  ELSE IF( n.LT.0 ) THEN
231  info = -2
232  ELSE IF( nrhs.LT.0 ) THEN
233  info = -3
234  ELSE IF( lda.LT.max( 1, n ) ) THEN
235  info = -5
236  ELSE IF( ldb.LT.max( 1, n ) ) THEN
237  info = -11
238  END IF
239 *
240  IF( info.EQ.0 ) THEN
241  CALL chetrf_aa_2stage( uplo, n, a, lda, tb, -1, ipiv,
242  $ ipiv2, work, -1, info )
243  lwkopt = int( work(1) )
244  IF( ltb.LT.int( tb(1) ) .AND. .NOT.tquery ) THEN
245  info = -7
246  ELSE IF( lwork.LT.lwkopt .AND. .NOT.wquery ) THEN
247  info = -13
248  END IF
249  END IF
250 *
251  IF( info.NE.0 ) THEN
252  CALL xerbla( 'CHESV_AA_2STAGE', -info )
253  RETURN
254  ELSE IF( wquery .OR. tquery ) THEN
255  RETURN
256  END IF
257 *
258 *
259 * Compute the factorization A = U*T*U**H or A = L*T*L**H.
260 *
261  CALL chetrf_aa_2stage( uplo, n, a, lda, tb, ltb, ipiv, ipiv2,
262  $ work, lwork, info )
263  IF( info.EQ.0 ) THEN
264 *
265 * Solve the system A*X = B, overwriting B with X.
266 *
267  CALL chetrs_aa_2stage( uplo, n, nrhs, a, lda, tb, ltb, ipiv,
268  $ ipiv2, b, ldb, info )
269 *
270  END IF
271 *
272  work( 1 ) = lwkopt
273 *
274 * End of CHESV_AA_2STAGE
275 *
276  END
subroutine chesv_aa_2stage(UPLO, N, NRHS, A, LDA, TB, LTB, IPIV, IPIV2, B, LDB, WORK, LWORK, INFO)
CHESV_AA_2STAGE computes the solution to system of linear equations A * X = B for HE matrices ...
subroutine chetrf_aa_2stage(UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2, WORK, LWORK, INFO)
CHETRF_AA_2STAGE
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine chetrs_aa_2stage(UPLO, N, NRHS, A, LDA, TB, LTB, IPIV, IPIV2, B, LDB, INFO)
CHETRS_AA_2STAGE