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