![]() |
LAPACK
3.4.1
LAPACK: Linear Algebra PACKage
|
00001 *> \brief \b ZUNMHR 00002 * 00003 * =========== DOCUMENTATION =========== 00004 * 00005 * Online html documentation available at 00006 * http://www.netlib.org/lapack/explore-html/ 00007 * 00008 *> \htmlonly 00009 *> Download ZUNMHR + dependencies 00010 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zunmhr.f"> 00011 *> [TGZ]</a> 00012 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zunmhr.f"> 00013 *> [ZIP]</a> 00014 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zunmhr.f"> 00015 *> [TXT]</a> 00016 *> \endhtmlonly 00017 * 00018 * Definition: 00019 * =========== 00020 * 00021 * SUBROUTINE ZUNMHR( SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, 00022 * LDC, WORK, LWORK, INFO ) 00023 * 00024 * .. Scalar Arguments .. 00025 * CHARACTER SIDE, TRANS 00026 * INTEGER IHI, ILO, INFO, LDA, LDC, LWORK, M, N 00027 * .. 00028 * .. Array Arguments .. 00029 * COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) 00030 * .. 00031 * 00032 * 00033 *> \par Purpose: 00034 * ============= 00035 *> 00036 *> \verbatim 00037 *> 00038 *> ZUNMHR overwrites the general complex M-by-N matrix C with 00039 *> 00040 *> SIDE = 'L' SIDE = 'R' 00041 *> TRANS = 'N': Q * C C * Q 00042 *> TRANS = 'C': Q**H * C C * Q**H 00043 *> 00044 *> where Q is a complex unitary matrix of order nq, with nq = m if 00045 *> SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of 00046 *> IHI-ILO elementary reflectors, as returned by ZGEHRD: 00047 *> 00048 *> Q = H(ilo) H(ilo+1) . . . H(ihi-1). 00049 *> \endverbatim 00050 * 00051 * Arguments: 00052 * ========== 00053 * 00054 *> \param[in] SIDE 00055 *> \verbatim 00056 *> SIDE is CHARACTER*1 00057 *> = 'L': apply Q or Q**H from the Left; 00058 *> = 'R': apply Q or Q**H from the Right. 00059 *> \endverbatim 00060 *> 00061 *> \param[in] TRANS 00062 *> \verbatim 00063 *> TRANS is CHARACTER*1 00064 *> = 'N': apply Q (No transpose) 00065 *> = 'C': apply Q**H (Conjugate transpose) 00066 *> \endverbatim 00067 *> 00068 *> \param[in] M 00069 *> \verbatim 00070 *> M is INTEGER 00071 *> The number of rows of the matrix C. M >= 0. 00072 *> \endverbatim 00073 *> 00074 *> \param[in] N 00075 *> \verbatim 00076 *> N is INTEGER 00077 *> The number of columns of the matrix C. N >= 0. 00078 *> \endverbatim 00079 *> 00080 *> \param[in] ILO 00081 *> \verbatim 00082 *> ILO is INTEGER 00083 *> \endverbatim 00084 *> 00085 *> \param[in] IHI 00086 *> \verbatim 00087 *> IHI is INTEGER 00088 *> 00089 *> ILO and IHI must have the same values as in the previous call 00090 *> of ZGEHRD. Q is equal to the unit matrix except in the 00091 *> submatrix Q(ilo+1:ihi,ilo+1:ihi). 00092 *> If SIDE = 'L', then 1 <= ILO <= IHI <= M, if M > 0, and 00093 *> ILO = 1 and IHI = 0, if M = 0; 00094 *> if SIDE = 'R', then 1 <= ILO <= IHI <= N, if N > 0, and 00095 *> ILO = 1 and IHI = 0, if N = 0. 00096 *> \endverbatim 00097 *> 00098 *> \param[in] A 00099 *> \verbatim 00100 *> A is COMPLEX*16 array, dimension 00101 *> (LDA,M) if SIDE = 'L' 00102 *> (LDA,N) if SIDE = 'R' 00103 *> The vectors which define the elementary reflectors, as 00104 *> returned by ZGEHRD. 00105 *> \endverbatim 00106 *> 00107 *> \param[in] LDA 00108 *> \verbatim 00109 *> LDA is INTEGER 00110 *> The leading dimension of the array A. 00111 *> LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. 00112 *> \endverbatim 00113 *> 00114 *> \param[in] TAU 00115 *> \verbatim 00116 *> TAU is COMPLEX*16 array, dimension 00117 *> (M-1) if SIDE = 'L' 00118 *> (N-1) if SIDE = 'R' 00119 *> TAU(i) must contain the scalar factor of the elementary 00120 *> reflector H(i), as returned by ZGEHRD. 00121 *> \endverbatim 00122 *> 00123 *> \param[in,out] C 00124 *> \verbatim 00125 *> C is COMPLEX*16 array, dimension (LDC,N) 00126 *> On entry, the M-by-N matrix C. 00127 *> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. 00128 *> \endverbatim 00129 *> 00130 *> \param[in] LDC 00131 *> \verbatim 00132 *> LDC is INTEGER 00133 *> The leading dimension of the array C. LDC >= max(1,M). 00134 *> \endverbatim 00135 *> 00136 *> \param[out] WORK 00137 *> \verbatim 00138 *> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) 00139 *> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. 00140 *> \endverbatim 00141 *> 00142 *> \param[in] LWORK 00143 *> \verbatim 00144 *> LWORK is INTEGER 00145 *> The dimension of the array WORK. 00146 *> If SIDE = 'L', LWORK >= max(1,N); 00147 *> if SIDE = 'R', LWORK >= max(1,M). 00148 *> For optimum performance LWORK >= N*NB if SIDE = 'L', and 00149 *> LWORK >= M*NB if SIDE = 'R', where NB is the optimal 00150 *> blocksize. 00151 *> 00152 *> If LWORK = -1, then a workspace query is assumed; the routine 00153 *> only calculates the optimal size of the WORK array, returns 00154 *> this value as the first entry of the WORK array, and no error 00155 *> message related to LWORK is issued by XERBLA. 00156 *> \endverbatim 00157 *> 00158 *> \param[out] INFO 00159 *> \verbatim 00160 *> INFO is INTEGER 00161 *> = 0: successful exit 00162 *> < 0: if INFO = -i, the i-th argument had an illegal value 00163 *> \endverbatim 00164 * 00165 * Authors: 00166 * ======== 00167 * 00168 *> \author Univ. of Tennessee 00169 *> \author Univ. of California Berkeley 00170 *> \author Univ. of Colorado Denver 00171 *> \author NAG Ltd. 00172 * 00173 *> \date November 2011 00174 * 00175 *> \ingroup complex16OTHERcomputational 00176 * 00177 * ===================================================================== 00178 SUBROUTINE ZUNMHR( SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, 00179 $ LDC, WORK, LWORK, INFO ) 00180 * 00181 * -- LAPACK computational routine (version 3.4.0) -- 00182 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00183 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00184 * November 2011 00185 * 00186 * .. Scalar Arguments .. 00187 CHARACTER SIDE, TRANS 00188 INTEGER IHI, ILO, INFO, LDA, LDC, LWORK, M, N 00189 * .. 00190 * .. Array Arguments .. 00191 COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) 00192 * .. 00193 * 00194 * ===================================================================== 00195 * 00196 * .. Local Scalars .. 00197 LOGICAL LEFT, LQUERY 00198 INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NH, NI, NQ, NW 00199 * .. 00200 * .. External Functions .. 00201 LOGICAL LSAME 00202 INTEGER ILAENV 00203 EXTERNAL LSAME, ILAENV 00204 * .. 00205 * .. External Subroutines .. 00206 EXTERNAL XERBLA, ZUNMQR 00207 * .. 00208 * .. Intrinsic Functions .. 00209 INTRINSIC MAX, MIN 00210 * .. 00211 * .. Executable Statements .. 00212 * 00213 * Test the input arguments 00214 * 00215 INFO = 0 00216 NH = IHI - ILO 00217 LEFT = LSAME( SIDE, 'L' ) 00218 LQUERY = ( LWORK.EQ.-1 ) 00219 * 00220 * NQ is the order of Q and NW is the minimum dimension of WORK 00221 * 00222 IF( LEFT ) THEN 00223 NQ = M 00224 NW = N 00225 ELSE 00226 NQ = N 00227 NW = M 00228 END IF 00229 IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN 00230 INFO = -1 00231 ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) 00232 $ THEN 00233 INFO = -2 00234 ELSE IF( M.LT.0 ) THEN 00235 INFO = -3 00236 ELSE IF( N.LT.0 ) THEN 00237 INFO = -4 00238 ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, NQ ) ) THEN 00239 INFO = -5 00240 ELSE IF( IHI.LT.MIN( ILO, NQ ) .OR. IHI.GT.NQ ) THEN 00241 INFO = -6 00242 ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN 00243 INFO = -8 00244 ELSE IF( LDC.LT.MAX( 1, M ) ) THEN 00245 INFO = -11 00246 ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN 00247 INFO = -13 00248 END IF 00249 * 00250 IF( INFO.EQ.0 ) THEN 00251 IF( LEFT ) THEN 00252 NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, NH, N, NH, -1 ) 00253 ELSE 00254 NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, NH, NH, -1 ) 00255 END IF 00256 LWKOPT = MAX( 1, NW )*NB 00257 WORK( 1 ) = LWKOPT 00258 END IF 00259 * 00260 IF( INFO.NE.0 ) THEN 00261 CALL XERBLA( 'ZUNMHR', -INFO ) 00262 RETURN 00263 ELSE IF( LQUERY ) THEN 00264 RETURN 00265 END IF 00266 * 00267 * Quick return if possible 00268 * 00269 IF( M.EQ.0 .OR. N.EQ.0 .OR. NH.EQ.0 ) THEN 00270 WORK( 1 ) = 1 00271 RETURN 00272 END IF 00273 * 00274 IF( LEFT ) THEN 00275 MI = NH 00276 NI = N 00277 I1 = ILO + 1 00278 I2 = 1 00279 ELSE 00280 MI = M 00281 NI = NH 00282 I1 = 1 00283 I2 = ILO + 1 00284 END IF 00285 * 00286 CALL ZUNMQR( SIDE, TRANS, MI, NI, NH, A( ILO+1, ILO ), LDA, 00287 $ TAU( ILO ), C( I1, I2 ), LDC, WORK, LWORK, IINFO ) 00288 * 00289 WORK( 1 ) = LWKOPT 00290 RETURN 00291 * 00292 * End of ZUNMHR 00293 * 00294 END