1*> \brief \b SORGHR 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download SORGHR + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sorghr.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sorghr.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sorghr.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE SORGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO ) 22* 23* .. Scalar Arguments .. 24* INTEGER IHI, ILO, INFO, LDA, LWORK, N 25* .. 26* .. Array Arguments .. 27* REAL A( LDA, * ), TAU( * ), WORK( * ) 28* .. 29* 30* 31*> \par Purpose: 32* ============= 33*> 34*> \verbatim 35*> 36*> SORGHR generates a real orthogonal matrix Q which is defined as the 37*> product of IHI-ILO elementary reflectors of order N, as returned by 38*> SGEHRD: 39*> 40*> Q = H(ilo) H(ilo+1) . . . H(ihi-1). 41*> \endverbatim 42* 43* Arguments: 44* ========== 45* 46*> \param[in] N 47*> \verbatim 48*> N is INTEGER 49*> The order of the matrix Q. N >= 0. 50*> \endverbatim 51*> 52*> \param[in] ILO 53*> \verbatim 54*> ILO is INTEGER 55*> \endverbatim 56*> 57*> \param[in] IHI 58*> \verbatim 59*> IHI is INTEGER 60*> 61*> ILO and IHI must have the same values as in the previous call 62*> of SGEHRD. Q is equal to the unit matrix except in the 63*> submatrix Q(ilo+1:ihi,ilo+1:ihi). 64*> 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. 65*> \endverbatim 66*> 67*> \param[in,out] A 68*> \verbatim 69*> A is REAL array, dimension (LDA,N) 70*> On entry, the vectors which define the elementary reflectors, 71*> as returned by SGEHRD. 72*> On exit, the N-by-N orthogonal matrix Q. 73*> \endverbatim 74*> 75*> \param[in] LDA 76*> \verbatim 77*> LDA is INTEGER 78*> The leading dimension of the array A. LDA >= max(1,N). 79*> \endverbatim 80*> 81*> \param[in] TAU 82*> \verbatim 83*> TAU is REAL array, dimension (N-1) 84*> TAU(i) must contain the scalar factor of the elementary 85*> reflector H(i), as returned by SGEHRD. 86*> \endverbatim 87*> 88*> \param[out] WORK 89*> \verbatim 90*> WORK is REAL array, dimension (MAX(1,LWORK)) 91*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. 92*> \endverbatim 93*> 94*> \param[in] LWORK 95*> \verbatim 96*> LWORK is INTEGER 97*> The dimension of the array WORK. LWORK >= IHI-ILO. 98*> For optimum performance LWORK >= (IHI-ILO)*NB, where NB is 99*> the optimal blocksize. 100*> 101*> If LWORK = -1, then a workspace query is assumed; the routine 102*> only calculates the optimal size of the WORK array, returns 103*> this value as the first entry of the WORK array, and no error 104*> message related to LWORK is issued by XERBLA. 105*> \endverbatim 106*> 107*> \param[out] INFO 108*> \verbatim 109*> INFO is INTEGER 110*> = 0: successful exit 111*> < 0: if INFO = -i, the i-th argument had an illegal value 112*> \endverbatim 113* 114* Authors: 115* ======== 116* 117*> \author Univ. of Tennessee 118*> \author Univ. of California Berkeley 119*> \author Univ. of Colorado Denver 120*> \author NAG Ltd. 121* 122*> \date November 2011 123* 124*> \ingroup realOTHERcomputational 125* 126* ===================================================================== 127 SUBROUTINE SORGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO ) 128* 129* -- LAPACK computational routine (version 3.4.0) -- 130* -- LAPACK is a software package provided by Univ. of Tennessee, -- 131* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 132* November 2011 133* 134* .. Scalar Arguments .. 135 INTEGER IHI, ILO, INFO, LDA, LWORK, N 136* .. 137* .. Array Arguments .. 138 REAL A( LDA, * ), TAU( * ), WORK( * ) 139* .. 140* 141* ===================================================================== 142* 143* .. Parameters .. 144 REAL ZERO, ONE 145 PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 ) 146* .. 147* .. Local Scalars .. 148 LOGICAL LQUERY 149 INTEGER I, IINFO, J, LWKOPT, NB, NH 150* .. 151* .. External Subroutines .. 152 EXTERNAL SORGQR, XERBLA 153* .. 154* .. External Functions .. 155 INTEGER ILAENV 156 EXTERNAL ILAENV 157* .. 158* .. Intrinsic Functions .. 159 INTRINSIC MAX, MIN 160* .. 161* .. Executable Statements .. 162* 163* Test the input arguments 164* 165 INFO = 0 166 NH = IHI - ILO 167 LQUERY = ( LWORK.EQ.-1 ) 168 IF( N.LT.0 ) THEN 169 INFO = -1 170 ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN 171 INFO = -2 172 ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN 173 INFO = -3 174 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 175 INFO = -5 176 ELSE IF( LWORK.LT.MAX( 1, NH ) .AND. .NOT.LQUERY ) THEN 177 INFO = -8 178 END IF 179* 180 IF( INFO.EQ.0 ) THEN 181 NB = ILAENV( 1, 'SORGQR', ' ', NH, NH, NH, -1 ) 182 LWKOPT = MAX( 1, NH )*NB 183 WORK( 1 ) = LWKOPT 184 END IF 185* 186 IF( INFO.NE.0 ) THEN 187 CALL XERBLA( 'SORGHR', -INFO ) 188 RETURN 189 ELSE IF( LQUERY ) THEN 190 RETURN 191 END IF 192* 193* Quick return if possible 194* 195 IF( N.EQ.0 ) THEN 196 WORK( 1 ) = 1 197 RETURN 198 END IF 199* 200* Shift the vectors which define the elementary reflectors one 201* column to the right, and set the first ilo and the last n-ihi 202* rows and columns to those of the unit matrix 203* 204 DO 40 J = IHI, ILO + 1, -1 205 DO 10 I = 1, J - 1 206 A( I, J ) = ZERO 207 10 CONTINUE 208 DO 20 I = J + 1, IHI 209 A( I, J ) = A( I, J-1 ) 210 20 CONTINUE 211 DO 30 I = IHI + 1, N 212 A( I, J ) = ZERO 213 30 CONTINUE 214 40 CONTINUE 215 DO 60 J = 1, ILO 216 DO 50 I = 1, N 217 A( I, J ) = ZERO 218 50 CONTINUE 219 A( J, J ) = ONE 220 60 CONTINUE 221 DO 80 J = IHI + 1, N 222 DO 70 I = 1, N 223 A( I, J ) = ZERO 224 70 CONTINUE 225 A( J, J ) = ONE 226 80 CONTINUE 227* 228 IF( NH.GT.0 ) THEN 229* 230* Generate Q(ilo+1:ihi,ilo+1:ihi) 231* 232 CALL SORGQR( NH, NH, NH, A( ILO+1, ILO+1 ), LDA, TAU( ILO ), 233 $ WORK, LWORK, IINFO ) 234 END IF 235 WORK( 1 ) = LWKOPT 236 RETURN 237* 238* End of SORGHR 239* 240 END 241