LAPACK  3.8.0
LAPACK: Linear Algebra PACKage

◆ sgghrd()

subroutine sgghrd ( character  COMPQ,
character  COMPZ,
integer  N,
integer  ILO,
integer  IHI,
real, dimension( lda, * )  A,
integer  LDA,
real, dimension( ldb, * )  B,
integer  LDB,
real, dimension( ldq, * )  Q,
integer  LDQ,
real, dimension( ldz, * )  Z,
integer  LDZ,
integer  INFO 
)

SGGHRD

Download SGGHRD + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 SGGHRD reduces a pair of real matrices (A,B) to generalized upper
 Hessenberg form using orthogonal transformations, where A is a
 general matrix and B is upper triangular.  The form of the
 generalized eigenvalue problem is
    A*x = lambda*B*x,
 and B is typically made upper triangular by computing its QR
 factorization and moving the orthogonal matrix Q to the left side
 of the equation.

 This subroutine simultaneously reduces A to a Hessenberg matrix H:
    Q**T*A*Z = H
 and transforms B to another upper triangular matrix T:
    Q**T*B*Z = T
 in order to reduce the problem to its standard form
    H*y = lambda*T*y
 where y = Z**T*x.

 The orthogonal matrices Q and Z are determined as products of Givens
 rotations.  They may either be formed explicitly, or they may be
 postmultiplied into input matrices Q1 and Z1, so that

      Q1 * A * Z1**T = (Q1*Q) * H * (Z1*Z)**T

      Q1 * B * Z1**T = (Q1*Q) * T * (Z1*Z)**T

 If Q1 is the orthogonal matrix from the QR factorization of B in the
 original equation A*x = lambda*B*x, then SGGHRD reduces the original
 problem to generalized Hessenberg form.
Parameters
[in]COMPQ
          COMPQ is CHARACTER*1
          = 'N': do not compute Q;
          = 'I': Q is initialized to the unit matrix, and the
                 orthogonal matrix Q is returned;
          = 'V': Q must contain an orthogonal matrix Q1 on entry,
                 and the product Q1*Q is returned.
[in]COMPZ
          COMPZ is CHARACTER*1
          = 'N': do not compute Z;
          = 'I': Z is initialized to the unit matrix, and the
                 orthogonal matrix Z is returned;
          = 'V': Z must contain an orthogonal matrix Z1 on entry,
                 and the product Z1*Z is returned.
[in]N
          N is INTEGER
          The order of the matrices A and B.  N >= 0.
[in]ILO
          ILO is INTEGER
[in]IHI
          IHI is INTEGER

          ILO and IHI mark the rows and columns of A which are to be
          reduced.  It is assumed that A is already upper triangular
          in rows and columns 1:ILO-1 and IHI+1:N.  ILO and IHI are
          normally set by a previous call to SGGBAL; otherwise they
          should be set to 1 and N respectively.
          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
[in,out]A
          A is REAL array, dimension (LDA, N)
          On entry, the N-by-N general matrix to be reduced.
          On exit, the upper triangle and the first subdiagonal of A
          are overwritten with the upper Hessenberg matrix H, and the
          rest is set to zero.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.  LDA >= max(1,N).
[in,out]B
          B is REAL array, dimension (LDB, N)
          On entry, the N-by-N upper triangular matrix B.
          On exit, the upper triangular matrix T = Q**T B Z.  The
          elements below the diagonal are set to zero.
[in]LDB
          LDB is INTEGER
          The leading dimension of the array B.  LDB >= max(1,N).
[in,out]Q
          Q is REAL array, dimension (LDQ, N)
          On entry, if COMPQ = 'V', the orthogonal matrix Q1,
          typically from the QR factorization of B.
          On exit, if COMPQ='I', the orthogonal matrix Q, and if
          COMPQ = 'V', the product Q1*Q.
          Not referenced if COMPQ='N'.
[in]LDQ
          LDQ is INTEGER
          The leading dimension of the array Q.
          LDQ >= N if COMPQ='V' or 'I'; LDQ >= 1 otherwise.
[in,out]Z
          Z is REAL array, dimension (LDZ, N)
          On entry, if COMPZ = 'V', the orthogonal matrix Z1.
          On exit, if COMPZ='I', the orthogonal matrix Z, and if
          COMPZ = 'V', the product Z1*Z.
          Not referenced if COMPZ='N'.
[in]LDZ
          LDZ is INTEGER
          The leading dimension of the array Z.
          LDZ >= N if COMPZ='V' or 'I'; LDZ >= 1 otherwise.
[out]INFO
          INFO is INTEGER
          = 0:  successful exit.
          < 0:  if INFO = -i, the i-th argument had an illegal value.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
December 2016
Further Details:
  This routine reduces A to Hessenberg and B to triangular form by
  an unblocked reduction, as described in _Matrix_Computations_,
  by Golub and Van Loan (Johns Hopkins Press.)

Definition at line 209 of file sgghrd.f.

209 *
210 * -- LAPACK computational routine (version 3.7.0) --
211 * -- LAPACK is a software package provided by Univ. of Tennessee, --
212 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
213 * December 2016
214 *
215 * .. Scalar Arguments ..
216  CHARACTER compq, compz
217  INTEGER ihi, ilo, info, lda, ldb, ldq, ldz, n
218 * ..
219 * .. Array Arguments ..
220  REAL a( lda, * ), b( ldb, * ), q( ldq, * ),
221  $ z( ldz, * )
222 * ..
223 *
224 * =====================================================================
225 *
226 * .. Parameters ..
227  REAL one, zero
228  parameter( one = 1.0e+0, zero = 0.0e+0 )
229 * ..
230 * .. Local Scalars ..
231  LOGICAL ilq, ilz
232  INTEGER icompq, icompz, jcol, jrow
233  REAL c, s, temp
234 * ..
235 * .. External Functions ..
236  LOGICAL lsame
237  EXTERNAL lsame
238 * ..
239 * .. External Subroutines ..
240  EXTERNAL slartg, slaset, srot, xerbla
241 * ..
242 * .. Intrinsic Functions ..
243  INTRINSIC max
244 * ..
245 * .. Executable Statements ..
246 *
247 * Decode COMPQ
248 *
249  IF( lsame( compq, 'N' ) ) THEN
250  ilq = .false.
251  icompq = 1
252  ELSE IF( lsame( compq, 'V' ) ) THEN
253  ilq = .true.
254  icompq = 2
255  ELSE IF( lsame( compq, 'I' ) ) THEN
256  ilq = .true.
257  icompq = 3
258  ELSE
259  icompq = 0
260  END IF
261 *
262 * Decode COMPZ
263 *
264  IF( lsame( compz, 'N' ) ) THEN
265  ilz = .false.
266  icompz = 1
267  ELSE IF( lsame( compz, 'V' ) ) THEN
268  ilz = .true.
269  icompz = 2
270  ELSE IF( lsame( compz, 'I' ) ) THEN
271  ilz = .true.
272  icompz = 3
273  ELSE
274  icompz = 0
275  END IF
276 *
277 * Test the input parameters.
278 *
279  info = 0
280  IF( icompq.LE.0 ) THEN
281  info = -1
282  ELSE IF( icompz.LE.0 ) THEN
283  info = -2
284  ELSE IF( n.LT.0 ) THEN
285  info = -3
286  ELSE IF( ilo.LT.1 ) THEN
287  info = -4
288  ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 ) THEN
289  info = -5
290  ELSE IF( lda.LT.max( 1, n ) ) THEN
291  info = -7
292  ELSE IF( ldb.LT.max( 1, n ) ) THEN
293  info = -9
294  ELSE IF( ( ilq .AND. ldq.LT.n ) .OR. ldq.LT.1 ) THEN
295  info = -11
296  ELSE IF( ( ilz .AND. ldz.LT.n ) .OR. ldz.LT.1 ) THEN
297  info = -13
298  END IF
299  IF( info.NE.0 ) THEN
300  CALL xerbla( 'SGGHRD', -info )
301  RETURN
302  END IF
303 *
304 * Initialize Q and Z if desired.
305 *
306  IF( icompq.EQ.3 )
307  $ CALL slaset( 'Full', n, n, zero, one, q, ldq )
308  IF( icompz.EQ.3 )
309  $ CALL slaset( 'Full', n, n, zero, one, z, ldz )
310 *
311 * Quick return if possible
312 *
313  IF( n.LE.1 )
314  $ RETURN
315 *
316 * Zero out lower triangle of B
317 *
318  DO 20 jcol = 1, n - 1
319  DO 10 jrow = jcol + 1, n
320  b( jrow, jcol ) = zero
321  10 CONTINUE
322  20 CONTINUE
323 *
324 * Reduce A and B
325 *
326  DO 40 jcol = ilo, ihi - 2
327 *
328  DO 30 jrow = ihi, jcol + 2, -1
329 *
330 * Step 1: rotate rows JROW-1, JROW to kill A(JROW,JCOL)
331 *
332  temp = a( jrow-1, jcol )
333  CALL slartg( temp, a( jrow, jcol ), c, s,
334  $ a( jrow-1, jcol ) )
335  a( jrow, jcol ) = zero
336  CALL srot( n-jcol, a( jrow-1, jcol+1 ), lda,
337  $ a( jrow, jcol+1 ), lda, c, s )
338  CALL srot( n+2-jrow, b( jrow-1, jrow-1 ), ldb,
339  $ b( jrow, jrow-1 ), ldb, c, s )
340  IF( ilq )
341  $ CALL srot( n, q( 1, jrow-1 ), 1, q( 1, jrow ), 1, c, s )
342 *
343 * Step 2: rotate columns JROW, JROW-1 to kill B(JROW,JROW-1)
344 *
345  temp = b( jrow, jrow )
346  CALL slartg( temp, b( jrow, jrow-1 ), c, s,
347  $ b( jrow, jrow ) )
348  b( jrow, jrow-1 ) = zero
349  CALL srot( ihi, a( 1, jrow ), 1, a( 1, jrow-1 ), 1, c, s )
350  CALL srot( jrow-1, b( 1, jrow ), 1, b( 1, jrow-1 ), 1, c,
351  $ s )
352  IF( ilz )
353  $ CALL srot( n, z( 1, jrow ), 1, z( 1, jrow-1 ), 1, c, s )
354  30 CONTINUE
355  40 CONTINUE
356 *
357  RETURN
358 *
359 * End of SGGHRD
360 *
subroutine slartg(F, G, CS, SN, R)
SLARTG generates a plane rotation with real cosine and real sine.
Definition: slartg.f:99
subroutine srot(N, SX, INCX, SY, INCY, C, S)
SROT
Definition: srot.f:94
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
Definition: slaset.f:112
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
Here is the call graph for this function:
Here is the caller graph for this function: