LAPACK 3.11.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
ssytrd_2stage.f
Go to the documentation of this file.
1*> \brief \b SSYTRD_2STAGE
2*
3* @generated from zhetrd_2stage.f, fortran z -> s, Sun Nov 6 19:34:06 2016
4*
5* =========== DOCUMENTATION ===========
6*
7* Online html documentation available at
8* http://www.netlib.org/lapack/explore-html/
9*
10*> \htmlonly
11*> Download SSYTRD_2STAGE + dependencies
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ssytrd_2stage.f">
13*> [TGZ]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ssytrd_2stage.f">
15*> [ZIP]</a>
16*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ssytrd_2stage.f">
17*> [TXT]</a>
18*> \endhtmlonly
19*
20* Definition:
21* ===========
22*
23* SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
24* HOUS2, LHOUS2, WORK, LWORK, INFO )
25*
26* IMPLICIT NONE
27*
28* .. Scalar Arguments ..
29* CHARACTER VECT, UPLO
30* INTEGER N, LDA, LWORK, LHOUS2, INFO
31* ..
32* .. Array Arguments ..
33* REAL D( * ), E( * )
34* REAL A( LDA, * ), TAU( * ),
35* HOUS2( * ), WORK( * )
36* ..
37*
38*
39*> \par Purpose:
40* =============
41*>
42*> \verbatim
43*>
44*> SSYTRD_2STAGE reduces a real symmetric matrix A to real symmetric
45*> tridiagonal form T by a orthogonal similarity transformation:
46*> Q1**T Q2**T* A * Q2 * Q1 = T.
47*> \endverbatim
48*
49* Arguments:
50* ==========
51*
52*> \param[in] VECT
53*> \verbatim
54*> VECT is CHARACTER*1
55*> = 'N': No need for the Housholder representation,
56*> in particular for the second stage (Band to
57*> tridiagonal) and thus LHOUS2 is of size max(1, 4*N);
58*> = 'V': the Householder representation is needed to
59*> either generate Q1 Q2 or to apply Q1 Q2,
60*> then LHOUS2 is to be queried and computed.
61*> (NOT AVAILABLE IN THIS RELEASE).
62*> \endverbatim
63*>
64*> \param[in] UPLO
65*> \verbatim
66*> UPLO is CHARACTER*1
67*> = 'U': Upper triangle of A is stored;
68*> = 'L': Lower triangle of A is stored.
69*> \endverbatim
70*>
71*> \param[in] N
72*> \verbatim
73*> N is INTEGER
74*> The order of the matrix A. N >= 0.
75*> \endverbatim
76*>
77*> \param[in,out] A
78*> \verbatim
79*> A is REAL array, dimension (LDA,N)
80*> On entry, the symmetric matrix A. If UPLO = 'U', the leading
81*> N-by-N upper triangular part of A contains the upper
82*> triangular part of the matrix A, and the strictly lower
83*> triangular part of A is not referenced. If UPLO = 'L', the
84*> leading N-by-N lower triangular part of A contains the lower
85*> triangular part of the matrix A, and the strictly upper
86*> triangular part of A is not referenced.
87*> On exit, if UPLO = 'U', the band superdiagonal
88*> of A are overwritten by the corresponding elements of the
89*> internal band-diagonal matrix AB, and the elements above
90*> the KD superdiagonal, with the array TAU, represent the orthogonal
91*> matrix Q1 as a product of elementary reflectors; if UPLO
92*> = 'L', the diagonal and band subdiagonal of A are over-
93*> written by the corresponding elements of the internal band-diagonal
94*> matrix AB, and the elements below the KD subdiagonal, with
95*> the array TAU, represent the orthogonal matrix Q1 as a product
96*> of elementary reflectors. See Further Details.
97*> \endverbatim
98*>
99*> \param[in] LDA
100*> \verbatim
101*> LDA is INTEGER
102*> The leading dimension of the array A. LDA >= max(1,N).
103*> \endverbatim
104*>
105*> \param[out] D
106*> \verbatim
107*> D is REAL array, dimension (N)
108*> The diagonal elements of the tridiagonal matrix T.
109*> \endverbatim
110*>
111*> \param[out] E
112*> \verbatim
113*> E is REAL array, dimension (N-1)
114*> The off-diagonal elements of the tridiagonal matrix T.
115*> \endverbatim
116*>
117*> \param[out] TAU
118*> \verbatim
119*> TAU is REAL array, dimension (N-KD)
120*> The scalar factors of the elementary reflectors of
121*> the first stage (see Further Details).
122*> \endverbatim
123*>
124*> \param[out] HOUS2
125*> \verbatim
126*> HOUS2 is REAL array, dimension (LHOUS2)
127*> Stores the Householder representation of the stage2
128*> band to tridiagonal.
129*> \endverbatim
130*>
131*> \param[in] LHOUS2
132*> \verbatim
133*> LHOUS2 is INTEGER
134*> The dimension of the array HOUS2.
135*> If LWORK = -1, or LHOUS2 = -1,
136*> then a query is assumed; the routine
137*> only calculates the optimal size of the HOUS2 array, returns
138*> this value as the first entry of the HOUS2 array, and no error
139*> message related to LHOUS2 is issued by XERBLA.
140*> If VECT='N', LHOUS2 = max(1, 4*n);
141*> if VECT='V', option not yet available.
142*> \endverbatim
143*>
144*> \param[out] WORK
145*> \verbatim
146*> WORK is REAL array, dimension (LWORK)
147*> \endverbatim
148*>
149*> \param[in] LWORK
150*> \verbatim
151*> LWORK is INTEGER
152*> The dimension of the array WORK. LWORK = MAX(1, dimension)
153*> If LWORK = -1, or LHOUS2=-1,
154*> then a workspace query is assumed; the routine
155*> only calculates the optimal size of the WORK array, returns
156*> this value as the first entry of the WORK array, and no error
157*> message related to LWORK is issued by XERBLA.
158*> LWORK = MAX(1, dimension) where
159*> dimension = max(stage1,stage2) + (KD+1)*N
160*> = N*KD + N*max(KD+1,FACTOPTNB)
161*> + max(2*KD*KD, KD*NTHREADS)
162*> + (KD+1)*N
163*> where KD is the blocking size of the reduction,
164*> FACTOPTNB is the blocking used by the QR or LQ
165*> algorithm, usually FACTOPTNB=128 is a good choice
166*> NTHREADS is the number of threads used when
167*> openMP compilation is enabled, otherwise =1.
168*> \endverbatim
169*>
170*> \param[out] INFO
171*> \verbatim
172*> INFO is INTEGER
173*> = 0: successful exit
174*> < 0: if INFO = -i, the i-th argument had an illegal value
175*> \endverbatim
176*
177* Authors:
178* ========
179*
180*> \author Univ. of Tennessee
181*> \author Univ. of California Berkeley
182*> \author Univ. of Colorado Denver
183*> \author NAG Ltd.
184*
185*> \ingroup realSYcomputational
186*
187*> \par Further Details:
188* =====================
189*>
190*> \verbatim
191*>
192*> Implemented by Azzam Haidar.
193*>
194*> All details are available on technical report, SC11, SC13 papers.
195*>
196*> Azzam Haidar, Hatem Ltaief, and Jack Dongarra.
197*> Parallel reduction to condensed forms for symmetric eigenvalue problems
198*> using aggregated fine-grained and memory-aware kernels. In Proceedings
199*> of 2011 International Conference for High Performance Computing,
200*> Networking, Storage and Analysis (SC '11), New York, NY, USA,
201*> Article 8 , 11 pages.
202*> http://doi.acm.org/10.1145/2063384.2063394
203*>
204*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
205*> An improved parallel singular value algorithm and its implementation
206*> for multicore hardware, In Proceedings of 2013 International Conference
207*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
208*> Denver, Colorado, USA, 2013.
209*> Article 90, 12 pages.
210*> http://doi.acm.org/10.1145/2503210.2503292
211*>
212*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
213*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
214*> calculations based on fine-grained memory aware tasks.
215*> International Journal of High Performance Computing Applications.
216*> Volume 28 Issue 2, Pages 196-209, May 2014.
217*> http://hpc.sagepub.com/content/28/2/196
218*>
219*> \endverbatim
220*>
221* =====================================================================
222 SUBROUTINE ssytrd_2stage( VECT, UPLO, N, A, LDA, D, E, TAU,
223 $ HOUS2, LHOUS2, WORK, LWORK, INFO )
224*
225 IMPLICIT NONE
226*
227* -- LAPACK computational routine --
228* -- LAPACK is a software package provided by Univ. of Tennessee, --
229* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
230*
231* .. Scalar Arguments ..
232 CHARACTER VECT, UPLO
233 INTEGER N, LDA, LWORK, LHOUS2, INFO
234* ..
235* .. Array Arguments ..
236 REAL D( * ), E( * )
237 REAL A( LDA, * ), TAU( * ),
238 $ hous2( * ), work( * )
239* ..
240*
241* =====================================================================
242* ..
243* .. Local Scalars ..
244 LOGICAL LQUERY, UPPER, WANTQ
245 INTEGER KD, IB, LWMIN, LHMIN, LWRK, LDAB, WPOS, ABPOS
246* ..
247* .. External Subroutines ..
249* ..
250* .. External Functions ..
251 LOGICAL LSAME
252 INTEGER ILAENV2STAGE
253 EXTERNAL lsame, ilaenv2stage
254* ..
255* .. Executable Statements ..
256*
257* Test the input parameters
258*
259 info = 0
260 wantq = lsame( vect, 'V' )
261 upper = lsame( uplo, 'U' )
262 lquery = ( lwork.EQ.-1 ) .OR. ( lhous2.EQ.-1 )
263*
264* Determine the block size, the workspace size and the hous size.
265*
266 kd = ilaenv2stage( 1, 'SSYTRD_2STAGE', vect, n, -1, -1, -1 )
267 ib = ilaenv2stage( 2, 'SSYTRD_2STAGE', vect, n, kd, -1, -1 )
268 lhmin = ilaenv2stage( 3, 'SSYTRD_2STAGE', vect, n, kd, ib, -1 )
269 lwmin = ilaenv2stage( 4, 'SSYTRD_2STAGE', vect, n, kd, ib, -1 )
270* WRITE(*,*),'SSYTRD_2STAGE N KD UPLO LHMIN LWMIN ',N, KD, UPLO,
271* $ LHMIN, LWMIN
272*
273 IF( .NOT.lsame( vect, 'N' ) ) THEN
274 info = -1
275 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
276 info = -2
277 ELSE IF( n.LT.0 ) THEN
278 info = -3
279 ELSE IF( lda.LT.max( 1, n ) ) THEN
280 info = -5
281 ELSE IF( lhous2.LT.lhmin .AND. .NOT.lquery ) THEN
282 info = -10
283 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
284 info = -12
285 END IF
286*
287 IF( info.EQ.0 ) THEN
288 hous2( 1 ) = lhmin
289 work( 1 ) = lwmin
290 END IF
291*
292 IF( info.NE.0 ) THEN
293 CALL xerbla( 'SSYTRD_2STAGE', -info )
294 RETURN
295 ELSE IF( lquery ) THEN
296 RETURN
297 END IF
298*
299* Quick return if possible
300*
301 IF( n.EQ.0 ) THEN
302 work( 1 ) = 1
303 RETURN
304 END IF
305*
306* Determine pointer position
307*
308 ldab = kd+1
309 lwrk = lwork-ldab*n
310 abpos = 1
311 wpos = abpos + ldab*n
312 CALL ssytrd_sy2sb( uplo, n, kd, a, lda, work( abpos ), ldab,
313 $ tau, work( wpos ), lwrk, info )
314 IF( info.NE.0 ) THEN
315 CALL xerbla( 'SSYTRD_SY2SB', -info )
316 RETURN
317 END IF
318 CALL ssytrd_sb2st( 'Y', vect, uplo, n, kd,
319 $ work( abpos ), ldab, d, e,
320 $ hous2, lhous2, work( wpos ), lwrk, info )
321 IF( info.NE.0 ) THEN
322 CALL xerbla( 'SSYTRD_SB2ST', -info )
323 RETURN
324 END IF
325*
326*
327 hous2( 1 ) = lhmin
328 work( 1 ) = lwmin
329 RETURN
330*
331* End of SSYTRD_2STAGE
332*
333 END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine ssytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
SSYTRD_2STAGE
subroutine ssytrd_sy2sb(UPLO, N, KD, A, LDA, AB, LDAB, TAU, WORK, LWORK, INFO)
SSYTRD_SY2SB
Definition: ssytrd_sy2sb.f:243
subroutine ssytrd_sb2st(STAGE1, VECT, UPLO, N, KD, AB, LDAB, D, E, HOUS, LHOUS, WORK, LWORK, INFO)
SSYTRD_SB2ST reduces a real symmetric band matrix A to real symmetric tridiagonal form T
Definition: ssytrd_sb2st.F:230