Skip to content

Commit 852827d

Browse files
committed
CSY version of two-stage Aasen's
1 parent ef3ef35 commit 852827d

5 files changed

Lines changed: 1222 additions & 0 deletions

File tree

SRC/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ set(CLASRC
226226
csytri_rook.f csycon_rook.f csysv_rook.f
227227
csytf2_rk.f csytrf_rk.f csytrf_aa.f csytrs_3.f csytrs_aa.f
228228
csytri_3.f csytri_3x.f csycon_3.f csysv_rk.f csysv_aa.f
229+
csysv_aa_2stage.f csytrf_aa_2stage.f csytrs_aa_2stage.f
229230
ctbcon.f ctbrfs.f ctbtrs.f ctgevc.f ctgex2.f
230231
ctgexc.f ctgsen.f ctgsja.f ctgsna.f ctgsy2.f ctgsyl.f ctpcon.f
231232
ctprfs.f ctptri.f

SRC/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ CLASRC = \
251251
csytri_rook.o csycon_rook.o csysv_rook.o \
252252
csytf2_rk.o csytrf_rk.o csytrf_aa.o csytrs_3.o csytrs_aa.o \
253253
csytri_3.o csytri_3x.o csycon_3.o csysv_rk.o csysv_aa.o \
254+
csysv_aa_2stage.o csytrf_aa_2stage.o csytrs_aa_2stage.o \
254255
ctbcon.o ctbrfs.o ctbtrs.o ctgevc.o ctgex2.o \
255256
ctgexc.o ctgsen.o ctgsja.o ctgsna.o ctgsy2.o ctgsyl.o ctpcon.o \
256257
ctprfs.o ctptri.o \

SRC/csysv_aa_2stage.f

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
*> \brief <b> CSYSV_AA_2STAGE computes the solution to system of linear equations A * X = B for SY 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 CSYSV_AA_2STAGE + dependencies
10+
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/csysv_aasen_2stage.f">
11+
*> [TGZ]</a>
12+
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/csysv_aasen_2stage.f">
13+
*> [ZIP]</a>
14+
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/csysv_aasen_2stage.f">
15+
*> [TXT]</a>
16+
*> \endhtmlonly
17+
*
18+
* Definition:
19+
* ===========
20+
*
21+
* SUBROUTINE CSYSV_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+
*> CSYSV_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 symmetric 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 symmetric 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 symmetric 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 December 2016
179+
*
180+
*> \ingroup complexSYcomputational
181+
*
182+
* =====================================================================
183+
SUBROUTINE CSYSV_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.7.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+
* December 2016
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+
INTEGER ILAENV
212+
EXTERNAL LSAME, ILAENV
213+
* ..
214+
* .. External Subroutines ..
215+
EXTERNAL 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( 'CSYSV_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 CSYTRF_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 CSYTRS_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 CSYSV_AA_2STAGE
275+
*
276+
END

0 commit comments

Comments
 (0)