LAPACK  3.10.1
LAPACK: Linear Algebra PACKage
zggbak.f
Go to the documentation of this file.
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
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
Definition: zswap.f:81
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
Definition: zdscal.f:78
subroutine zggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
ZGGBAK
Definition: zggbak.f:148