1*> \brief \b ZGGBAK 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download ZGGBAK + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zggbak.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zggbak.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zggbak.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, 22* LDV, INFO ) 23* 24* .. Scalar Arguments .. 25* CHARACTER JOB, SIDE 26* INTEGER IHI, ILO, INFO, LDV, M, N 27* .. 28* .. Array Arguments .. 29* DOUBLE PRECISION LSCALE( * ), RSCALE( * ) 30* COMPLEX*16 V( LDV, * ) 31* .. 32* 33* 34*> \par Purpose: 35* ============= 36*> 37*> \verbatim 38*> 39*> ZGGBAK forms the right or left eigenvectors of a complex generalized 40*> eigenvalue problem A*x = lambda*B*x, by backward transformation on 41*> the computed eigenvectors of the balanced pair of matrices output by 42*> ZGGBAL. 43*> \endverbatim 44* 45* Arguments: 46* ========== 47* 48*> \param[in] JOB 49*> \verbatim 50*> JOB is CHARACTER*1 51*> Specifies the type of backward transformation required: 52*> = 'N': do nothing, return immediately; 53*> = 'P': do backward transformation for permutation only; 54*> = 'S': do backward transformation for scaling only; 55*> = 'B': do backward transformations for both permutation and 56*> scaling. 57*> JOB must be the same as the argument JOB supplied to ZGGBAL. 58*> \endverbatim 59*> 60*> \param[in] SIDE 61*> \verbatim 62*> SIDE is CHARACTER*1 63*> = 'R': V contains right eigenvectors; 64*> = 'L': V contains left eigenvectors. 65*> \endverbatim 66*> 67*> \param[in] N 68*> \verbatim 69*> N is INTEGER 70*> The number of rows of the matrix V. N >= 0. 71*> \endverbatim 72*> 73*> \param[in] ILO 74*> \verbatim 75*> ILO is INTEGER 76*> \endverbatim 77*> 78*> \param[in] IHI 79*> \verbatim 80*> IHI is INTEGER 81*> The integers ILO and IHI determined by ZGGBAL. 82*> 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. 83*> \endverbatim 84*> 85*> \param[in] LSCALE 86*> \verbatim 87*> LSCALE is DOUBLE PRECISION array, dimension (N) 88*> Details of the permutations and/or scaling factors applied 89*> to the left side of A and B, as returned by ZGGBAL. 90*> \endverbatim 91*> 92*> \param[in] RSCALE 93*> \verbatim 94*> RSCALE is DOUBLE PRECISION array, dimension (N) 95*> Details of the permutations and/or scaling factors applied 96*> to the right side of A and B, as returned by ZGGBAL. 97*> \endverbatim 98*> 99*> \param[in] M 100*> \verbatim 101*> M is INTEGER 102*> The number of columns of the matrix V. M >= 0. 103*> \endverbatim 104*> 105*> \param[in,out] V 106*> \verbatim 107*> V is COMPLEX*16 array, dimension (LDV,M) 108*> On entry, the matrix of right or left eigenvectors to be 109*> transformed, as returned by ZTGEVC. 110*> On exit, V is overwritten by the transformed eigenvectors. 111*> \endverbatim 112*> 113*> \param[in] LDV 114*> \verbatim 115*> LDV is INTEGER 116*> The leading dimension of the matrix V. LDV >= max(1,N). 117*> \endverbatim 118*> 119*> \param[out] INFO 120*> \verbatim 121*> INFO is INTEGER 122*> = 0: successful exit. 123*> < 0: if INFO = -i, the i-th argument had an illegal value. 124*> \endverbatim 125* 126* Authors: 127* ======== 128* 129*> \author Univ. of Tennessee 130*> \author Univ. of California Berkeley 131*> \author Univ. of Colorado Denver 132*> \author NAG Ltd. 133* 134*> \ingroup complex16GBcomputational 135* 136*> \par Further Details: 137* ===================== 138*> 139*> \verbatim 140*> 141*> See R.C. Ward, Balancing the generalized eigenvalue problem, 142*> SIAM J. Sci. Stat. Comp. 2 (1981), 141-152. 143*> \endverbatim 144*> 145* ===================================================================== 146 SUBROUTINE ZGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, 147 $ LDV, INFO ) 148* 149* -- LAPACK computational routine -- 150* -- LAPACK is a software package provided by Univ. of Tennessee, -- 151* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 152* 153* .. Scalar Arguments .. 154 CHARACTER JOB, SIDE 155 INTEGER IHI, ILO, INFO, LDV, M, N 156* .. 157* .. Array Arguments .. 158 DOUBLE PRECISION LSCALE( * ), RSCALE( * ) 159 COMPLEX*16 V( LDV, * ) 160* .. 161* 162* ===================================================================== 163* 164* .. Local Scalars .. 165 LOGICAL LEFTV, RIGHTV 166 INTEGER I, K 167* .. 168* .. External Functions .. 169 LOGICAL LSAME 170 EXTERNAL LSAME 171* .. 172* .. External Subroutines .. 173 EXTERNAL XERBLA, ZDSCAL, ZSWAP 174* .. 175* .. Intrinsic Functions .. 176 INTRINSIC MAX, INT 177* .. 178* .. Executable Statements .. 179* 180* Test the input parameters 181* 182 RIGHTV = LSAME( SIDE, 'R' ) 183 LEFTV = LSAME( SIDE, 'L' ) 184* 185 INFO = 0 186 IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND. 187 $ .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN 188 INFO = -1 189 ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN 190 INFO = -2 191 ELSE IF( N.LT.0 ) THEN 192 INFO = -3 193 ELSE IF( ILO.LT.1 ) THEN 194 INFO = -4 195 ELSE IF( N.EQ.0 .AND. IHI.EQ.0 .AND. ILO.NE.1 ) THEN 196 INFO = -4 197 ELSE IF( N.GT.0 .AND. ( IHI.LT.ILO .OR. IHI.GT.MAX( 1, N ) ) ) 198 $ THEN 199 INFO = -5 200 ELSE IF( N.EQ.0 .AND. ILO.EQ.1 .AND. IHI.NE.0 ) THEN 201 INFO = -5 202 ELSE IF( M.LT.0 ) THEN 203 INFO = -8 204 ELSE IF( LDV.LT.MAX( 1, N ) ) THEN 205 INFO = -10 206 END IF 207 IF( INFO.NE.0 ) THEN 208 CALL XERBLA( 'ZGGBAK', -INFO ) 209 RETURN 210 END IF 211* 212* Quick return if possible 213* 214 IF( N.EQ.0 ) 215 $ RETURN 216 IF( M.EQ.0 ) 217 $ RETURN 218 IF( LSAME( JOB, 'N' ) ) 219 $ RETURN 220* 221 IF( ILO.EQ.IHI ) 222 $ GO TO 30 223* 224* Backward balance 225* 226 IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN 227* 228* Backward transformation on right eigenvectors 229* 230 IF( RIGHTV ) THEN 231 DO 10 I = ILO, IHI 232 CALL ZDSCAL( M, RSCALE( I ), V( I, 1 ), LDV ) 233 10 CONTINUE 234 END IF 235* 236* Backward transformation on left eigenvectors 237* 238 IF( LEFTV ) THEN 239 DO 20 I = ILO, IHI 240 CALL ZDSCAL( M, LSCALE( I ), V( I, 1 ), LDV ) 241 20 CONTINUE 242 END IF 243 END IF 244* 245* Backward permutation 246* 247 30 CONTINUE 248 IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN 249* 250* Backward permutation on right eigenvectors 251* 252 IF( RIGHTV ) THEN 253 IF( ILO.EQ.1 ) 254 $ GO TO 50 255 DO 40 I = ILO - 1, 1, -1 256 K = INT(RSCALE( I )) 257 IF( K.EQ.I ) 258 $ GO TO 40 259 CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV ) 260 40 CONTINUE 261* 262 50 CONTINUE 263 IF( IHI.EQ.N ) 264 $ GO TO 70 265 DO 60 I = IHI + 1, N 266 K = INT(RSCALE( I )) 267 IF( K.EQ.I ) 268 $ GO TO 60 269 CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV ) 270 60 CONTINUE 271 END IF 272* 273* Backward permutation on left eigenvectors 274* 275 70 CONTINUE 276 IF( LEFTV ) THEN 277 IF( ILO.EQ.1 ) 278 $ GO TO 90 279 DO 80 I = ILO - 1, 1, -1 280 K = INT(LSCALE( I )) 281 IF( K.EQ.I ) 282 $ GO TO 80 283 CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV ) 284 80 CONTINUE 285* 286 90 CONTINUE 287 IF( IHI.EQ.N ) 288 $ GO TO 110 289 DO 100 I = IHI + 1, N 290 K = INT(LSCALE( I )) 291 IF( K.EQ.I ) 292 $ GO TO 100 293 CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV ) 294 100 CONTINUE 295 END IF 296 END IF 297* 298 110 CONTINUE 299* 300 RETURN 301* 302* End of ZGGBAK 303* 304 END 305