 LAPACK  3.8.0 LAPACK: Linear Algebra PACKage

◆ dsbev_2stage()

 subroutine dsbev_2stage ( character JOBZ, character UPLO, integer N, integer KD, double precision, dimension( ldab, * ) AB, integer LDAB, double precision, dimension( * ) W, double precision, dimension( ldz, * ) Z, integer LDZ, double precision, dimension( * ) WORK, integer LWORK, integer INFO )

DSBEV_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrices

Purpose:
``` DSBEV_2STAGE computes all the eigenvalues and, optionally, eigenvectors of
a real symmetric band matrix A using the 2stage technique for
the reduction to tridiagonal.```
Parameters
 [in] JOBZ ``` JOBZ is CHARACTER*1 = 'N': Compute eigenvalues only; = 'V': Compute eigenvalues and eigenvectors. Not available in this release.``` [in] UPLO ``` UPLO is CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored.``` [in] N ``` N is INTEGER The order of the matrix A. N >= 0.``` [in] KD ``` KD is INTEGER The number of superdiagonals of the matrix A if UPLO = 'U', or the number of subdiagonals if UPLO = 'L'. KD >= 0.``` [in,out] AB ``` AB is DOUBLE PRECISION array, dimension (LDAB, N) On entry, the upper or lower triangle of the symmetric band matrix A, stored in the first KD+1 rows of the array. The j-th column of A is stored in the j-th column of the array AB as follows: if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). On exit, AB is overwritten by values generated during the reduction to tridiagonal form. If UPLO = 'U', the first superdiagonal and the diagonal of the tridiagonal matrix T are returned in rows KD and KD+1 of AB, and if UPLO = 'L', the diagonal and first subdiagonal of T are returned in the first two rows of AB.``` [in] LDAB ``` LDAB is INTEGER The leading dimension of the array AB. LDAB >= KD + 1.``` [out] W ``` W is DOUBLE PRECISION array, dimension (N) If INFO = 0, the eigenvalues in ascending order.``` [out] Z ``` Z is DOUBLE PRECISION array, dimension (LDZ, N) If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal eigenvectors of the matrix A, with the i-th column of Z holding the eigenvector associated with W(i). If JOBZ = 'N', then Z is not referenced.``` [in] LDZ ``` LDZ is INTEGER The leading dimension of the array Z. LDZ >= 1, and if JOBZ = 'V', LDZ >= max(1,N).``` [out] WORK ``` WORK is DOUBLE PRECISION array, dimension LWORK On exit, if INFO = 0, WORK(1) returns the optimal LWORK.``` [in] LWORK ``` LWORK is INTEGER The length of the array WORK. LWORK >= 1, when N <= 1; otherwise If JOBZ = 'N' and N > 1, LWORK must be queried. LWORK = MAX(1, dimension) where dimension = (2KD+1)*N + KD*NTHREADS + N where KD is the size of the band. NTHREADS is the number of threads used when openMP compilation is enabled, otherwise =1. If JOBZ = 'V' and N > 1, LWORK must be queried. Not yet available. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA.``` [out] INFO ``` INFO is INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, the algorithm failed to converge; i off-diagonal elements of an intermediate tridiagonal form did not converge to zero.```
Date
November 2017
Further Details:
```  All details about the 2stage techniques are available in:

Azzam Haidar, Hatem Ltaief, and Jack Dongarra.
Parallel reduction to condensed forms for symmetric eigenvalue problems
using aggregated fine-grained and memory-aware kernels. In Proceedings
of 2011 International Conference for High Performance Computing,
Networking, Storage and Analysis (SC '11), New York, NY, USA,
Article 8 , 11 pages.
http://doi.acm.org/10.1145/2063384.2063394

A. Haidar, J. Kurzak, P. Luszczek, 2013.
An improved parallel singular value algorithm and its implementation
for multicore hardware, In Proceedings of 2013 International Conference
for High Performance Computing, Networking, Storage and Analysis (SC '13).
Article 90, 12 pages.
http://doi.acm.org/10.1145/2503210.2503292

A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
A novel hybrid CPU-GPU generalized eigensolver for electronic structure
calculations based on fine-grained memory aware tasks.
International Journal of High Performance Computing Applications.
Volume 28 Issue 2, Pages 196-209, May 2014.
http://hpc.sagepub.com/content/28/2/196 ```

Definition at line 206 of file dsbev_2stage.f.

206 *
207  IMPLICIT NONE
208 *
209 * -- LAPACK driver routine (version 3.8.0) --
210 * -- LAPACK is a software package provided by Univ. of Tennessee, --
211 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
212 * November 2017
213 *
214 * .. Scalar Arguments ..
215  CHARACTER jobz, uplo
216  INTEGER info, kd, ldab, ldz, n, lwork
217 * ..
218 * .. Array Arguments ..
219  DOUBLE PRECISION ab( ldab, * ), w( * ), work( * ), z( ldz, * )
220 * ..
221 *
222 * =====================================================================
223 *
224 * .. Parameters ..
225  DOUBLE PRECISION zero, one
226  parameter( zero = 0.0d0, one = 1.0d0 )
227 * ..
228 * .. Local Scalars ..
229  LOGICAL lower, wantz, lquery
230  INTEGER iinfo, imax, inde, indwrk, iscale,
231  \$ llwork, lwmin, lhtrd, lwtrd, ib, indhous
232  DOUBLE PRECISION anrm, bignum, eps, rmax, rmin, safmin, sigma,
233  \$ smlnum
234 * ..
235 * .. External Functions ..
236  LOGICAL lsame
237  INTEGER ilaenv2stage
238  DOUBLE PRECISION dlamch, dlansb
239  EXTERNAL lsame, dlamch, dlansb, ilaenv2stage
240 * ..
241 * .. External Subroutines ..
242  EXTERNAL dlascl, dscal, dsteqr, dsterf, xerbla,
243  \$ dsytrd_sb2st
244 * ..
245 * .. Intrinsic Functions ..
246  INTRINSIC sqrt
247 * ..
248 * .. Executable Statements ..
249 *
250 * Test the input parameters.
251 *
252  wantz = lsame( jobz, 'V' )
253  lower = lsame( uplo, 'L' )
254  lquery = ( lwork.EQ.-1 )
255 *
256  info = 0
257  IF( .NOT.( lsame( jobz, 'N' ) ) ) THEN
258  info = -1
259  ELSE IF( .NOT.( lower .OR. lsame( uplo, 'U' ) ) ) THEN
260  info = -2
261  ELSE IF( n.LT.0 ) THEN
262  info = -3
263  ELSE IF( kd.LT.0 ) THEN
264  info = -4
265  ELSE IF( ldab.LT.kd+1 ) THEN
266  info = -6
267  ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
268  info = -9
269  END IF
270 *
271  IF( info.EQ.0 ) THEN
272  IF( n.LE.1 ) THEN
273  lwmin = 1
274  work( 1 ) = lwmin
275  ELSE
276  ib = ilaenv2stage( 2, 'DSYTRD_SB2ST', jobz,
277  \$ n, kd, -1, -1 )
278  lhtrd = ilaenv2stage( 3, 'DSYTRD_SB2ST', jobz,
279  \$ n, kd, ib, -1 )
280  lwtrd = ilaenv2stage( 4, 'DSYTRD_SB2ST', jobz,
281  \$ n, kd, ib, -1 )
282  lwmin = n + lhtrd + lwtrd
283  work( 1 ) = lwmin
284  ENDIF
285 *
286  IF( lwork.LT.lwmin .AND. .NOT.lquery )
287  \$ info = -11
288  END IF
289 *
290  IF( info.NE.0 ) THEN
291  CALL xerbla( 'DSBEV_2STAGE ', -info )
292  RETURN
293  ELSE IF( lquery ) THEN
294  RETURN
295  END IF
296 *
297 * Quick return if possible
298 *
299  IF( n.EQ.0 )
300  \$ RETURN
301 *
302  IF( n.EQ.1 ) THEN
303  IF( lower ) THEN
304  w( 1 ) = ab( 1, 1 )
305  ELSE
306  w( 1 ) = ab( kd+1, 1 )
307  END IF
308  IF( wantz )
309  \$ z( 1, 1 ) = one
310  RETURN
311  END IF
312 *
313 * Get machine constants.
314 *
315  safmin = dlamch( 'Safe minimum' )
316  eps = dlamch( 'Precision' )
317  smlnum = safmin / eps
318  bignum = one / smlnum
319  rmin = sqrt( smlnum )
320  rmax = sqrt( bignum )
321 *
322 * Scale matrix to allowable range, if necessary.
323 *
324  anrm = dlansb( 'M', uplo, n, kd, ab, ldab, work )
325  iscale = 0
326  IF( anrm.GT.zero .AND. anrm.LT.rmin ) THEN
327  iscale = 1
328  sigma = rmin / anrm
329  ELSE IF( anrm.GT.rmax ) THEN
330  iscale = 1
331  sigma = rmax / anrm
332  END IF
333  IF( iscale.EQ.1 ) THEN
334  IF( lower ) THEN
335  CALL dlascl( 'B', kd, kd, one, sigma, n, n, ab, ldab, info )
336  ELSE
337  CALL dlascl( 'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
338  END IF
339  END IF
340 *
341 * Call DSYTRD_SB2ST to reduce symmetric band matrix to tridiagonal form.
342 *
343  inde = 1
344  indhous = inde + n
345  indwrk = indhous + lhtrd
346  llwork = lwork - indwrk + 1
347 *
348  CALL dsytrd_sb2st( "N", jobz, uplo, n, kd, ab, ldab, w,
349  \$ work( inde ), work( indhous ), lhtrd,
350  \$ work( indwrk ), llwork, iinfo )
351 *
352 * For eigenvalues only, call DSTERF. For eigenvectors, call SSTEQR.
353 *
354  IF( .NOT.wantz ) THEN
355  CALL dsterf( n, w, work( inde ), info )
356  ELSE
357  CALL dsteqr( jobz, n, w, work( inde ), z, ldz, work( indwrk ),
358  \$ info )
359  END IF
360 *
361 * If matrix was scaled, then rescale eigenvalues appropriately.
362 *
363  IF( iscale.EQ.1 ) THEN
364  IF( info.EQ.0 ) THEN
365  imax = n
366  ELSE
367  imax = info - 1
368  END IF
369  CALL dscal( imax, one / sigma, w, 1 )
370  END IF
371 *
372 * Set WORK(1) to optimal workspace size.
373 *
374  work( 1 ) = lwmin
375 *
376  RETURN
377 *
378 * End of DSBEV_2STAGE
379 *
subroutine dsterf(N, D, E, INFO)
DSTERF
Definition: dsterf.f:88
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
subroutine dscal(N, DA, DX, INCX)
DSCAL
Definition: dscal.f:81
double precision function dlansb(NORM, UPLO, N, K, AB, LDAB, WORK)
DLANSB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a symmetric band matrix.
Definition: dlansb.f:131
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
integer function ilaenv2stage(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV2STAGE
Definition: ilaenv2stage.f:151
double precision function dlamch(CMACH)
DLAMCH
Definition: dlamch.f:65
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
Definition: dlascl.f:145
subroutine dsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DSTEQR
Definition: dsteqr.f:133
Here is the call graph for this function:
Here is the caller graph for this function: