LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
zlaqz1.f
Go to the documentation of this file.
1*> \brief \b ZLAQZ1
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download ZLAQZ1 + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ZLAQZ1.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ZLAQZ1.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ZLAQZ1.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE ZLAQZ1( ILQ, ILZ, K, ISTARTM, ISTOPM, IHI, A, LDA, B,
20* $ LDB, NQ, QSTART, Q, LDQ, NZ, ZSTART, Z, LDZ )
21* IMPLICIT NONE
22*
23* Arguments
24* LOGICAL, INTENT( IN ) :: ILQ, ILZ
25* INTEGER, INTENT( IN ) :: K, LDA, LDB, LDQ, LDZ, ISTARTM, ISTOPM,
26* $ NQ, NZ, QSTART, ZSTART, IHI
27* COMPLEX*16 :: A( LDA, * ), B( LDB, * ), Q( LDQ, * ), Z( LDZ, * )
28* ..
29*
30*
31*> \par Purpose:
32* =============
33*>
34*> \verbatim
35*>
36*> ZLAQZ1 chases a 1x1 shift bulge in a matrix pencil down a single position
37*> \endverbatim
38*
39*
40* Arguments:
41* ==========
42*
43*>
44*> \param[in] ILQ
45*> \verbatim
46*> ILQ is LOGICAL
47*> Determines whether or not to update the matrix Q
48*> \endverbatim
49*>
50*> \param[in] ILZ
51*> \verbatim
52*> ILZ is LOGICAL
53*> Determines whether or not to update the matrix Z
54*> \endverbatim
55*>
56*> \param[in] K
57*> \verbatim
58*> K is INTEGER
59*> Index indicating the position of the bulge.
60*> On entry, the bulge is located in
61*> (A(k+1,k),B(k+1,k)).
62*> On exit, the bulge is located in
63*> (A(k+2,k+1),B(k+2,k+1)).
64*> \endverbatim
65*>
66*> \param[in] ISTARTM
67*> \verbatim
68*> ISTARTM is INTEGER
69*> \endverbatim
70*>
71*> \param[in] ISTOPM
72*> \verbatim
73*> ISTOPM is INTEGER
74*> Updates to (A,B) are restricted to
75*> (istartm:k+2,k:istopm). It is assumed
76*> without checking that istartm <= k+1 and
77*> k+2 <= istopm
78*> \endverbatim
79*>
80*> \param[in] IHI
81*> \verbatim
82*> IHI is INTEGER
83*> \endverbatim
84*>
85*> \param[inout] A
86*> \verbatim
87*> A is COMPLEX*16 array, dimension (LDA,N)
88*> \endverbatim
89*>
90*> \param[in] LDA
91*> \verbatim
92*> LDA is INTEGER
93*> The leading dimension of A as declared in
94*> the calling procedure.
95*> \endverbatim
96*
97*> \param[inout] B
98*> \verbatim
99*> B is COMPLEX*16 array, dimension (LDB,N)
100*> \endverbatim
101*>
102*> \param[in] LDB
103*> \verbatim
104*> LDB is INTEGER
105*> The leading dimension of B as declared in
106*> the calling procedure.
107*> \endverbatim
108*>
109*> \param[in] NQ
110*> \verbatim
111*> NQ is INTEGER
112*> The order of the matrix Q
113*> \endverbatim
114*>
115*> \param[in] QSTART
116*> \verbatim
117*> QSTART is INTEGER
118*> Start index of the matrix Q. Rotations are applied
119*> To columns k+2-qStart:k+3-qStart of Q.
120*> \endverbatim
121*
122*> \param[inout] Q
123*> \verbatim
124*> Q is COMPLEX*16 array, dimension (LDQ,NQ)
125*> \endverbatim
126*>
127*> \param[in] LDQ
128*> \verbatim
129*> LDQ is INTEGER
130*> The leading dimension of Q as declared in
131*> the calling procedure.
132*> \endverbatim
133*>
134*> \param[in] NZ
135*> \verbatim
136*> NZ is INTEGER
137*> The order of the matrix Z
138*> \endverbatim
139*>
140*> \param[in] ZSTART
141*> \verbatim
142*> ZSTART is INTEGER
143*> Start index of the matrix Z. Rotations are applied
144*> To columns k+1-qStart:k+2-qStart of Z.
145*> \endverbatim
146*
147*> \param[inout] Z
148*> \verbatim
149*> Z is COMPLEX*16 array, dimension (LDZ,NZ)
150*> \endverbatim
151*>
152*> \param[in] LDZ
153*> \verbatim
154*> LDZ is INTEGER
155*> The leading dimension of Q as declared in
156*> the calling procedure.
157*> \endverbatim
158*
159* Authors:
160* ========
161*
162*> \author Thijs Steel, KU Leuven
163*
164*> \date May 2020
165*
166*> \ingroup laqz1
167*>
168* =====================================================================
169 SUBROUTINE zlaqz1( ILQ, ILZ, K, ISTARTM, ISTOPM, IHI, A, LDA,
170 $ B,
171 $ LDB, NQ, QSTART, Q, LDQ, NZ, ZSTART, Z, LDZ )
172 IMPLICIT NONE
173*
174* Arguments
175 LOGICAL, INTENT( IN ) :: ILQ, ILZ
176 INTEGER, INTENT( IN ) :: K, LDA, LDB, LDQ, LDZ, ISTARTM, ISTOPM,
177 $ nq, nz, qstart, zstart, ihi
178 COMPLEX*16 :: A( LDA, * ), B( LDB, * ), Q( LDQ, * ), Z( LDZ, * )
179*
180* Parameters
181 COMPLEX*16 CZERO, CONE
182 PARAMETER ( CZERO = ( 0.0d+0, 0.0d+0 ), cone = ( 1.0d+0,
183 $ 0.0d+0 ) )
184 DOUBLE PRECISION :: ZERO, ONE, HALF
185 PARAMETER( ZERO = 0.0d0, one = 1.0d0, half = 0.5d0 )
186*
187* Local variables
188 DOUBLE PRECISION :: C
189 COMPLEX*16 :: S, TEMP
190*
191* External Functions
192 EXTERNAL :: zlartg, zrot
193*
194 IF( k+1 .EQ. ihi ) THEN
195*
196* Shift is located on the edge of the matrix, remove it
197*
198 CALL zlartg( b( ihi, ihi ), b( ihi, ihi-1 ), c, s, temp )
199 b( ihi, ihi ) = temp
200 b( ihi, ihi-1 ) = czero
201 CALL zrot( ihi-istartm, b( istartm, ihi ), 1, b( istartm,
202 $ ihi-1 ), 1, c, s )
203 CALL zrot( ihi-istartm+1, a( istartm, ihi ), 1, a( istartm,
204 $ ihi-1 ), 1, c, s )
205 IF ( ilz ) THEN
206 CALL zrot( nz, z( 1, ihi-zstart+1 ), 1, z( 1,
207 $ ihi-1-zstart+
208 $ 1 ), 1, c, s )
209 END IF
210*
211 ELSE
212*
213* Normal operation, move bulge down
214*
215*
216* Apply transformation from the right
217*
218 CALL zlartg( b( k+1, k+1 ), b( k+1, k ), c, s, temp )
219 b( k+1, k+1 ) = temp
220 b( k+1, k ) = czero
221 CALL zrot( k+2-istartm+1, a( istartm, k+1 ), 1, a( istartm,
222 $ k ), 1, c, s )
223 CALL zrot( k-istartm+1, b( istartm, k+1 ), 1, b( istartm,
224 $ k ),
225 $ 1, c, s )
226 IF ( ilz ) THEN
227 CALL zrot( nz, z( 1, k+1-zstart+1 ), 1, z( 1,
228 $ k-zstart+1 ),
229 $ 1, c, s )
230 END IF
231*
232* Apply transformation from the left
233*
234 CALL zlartg( a( k+1, k ), a( k+2, k ), c, s, temp )
235 a( k+1, k ) = temp
236 a( k+2, k ) = czero
237 CALL zrot( istopm-k, a( k+1, k+1 ), lda, a( k+2, k+1 ), lda,
238 $ c,
239 $ s )
240 CALL zrot( istopm-k, b( k+1, k+1 ), ldb, b( k+2, k+1 ), ldb,
241 $ c,
242 $ s )
243 IF ( ilq ) THEN
244 CALL zrot( nq, q( 1, k+1-qstart+1 ), 1, q( 1, k+2-qstart+
245 $ 1 ), 1, c, dconjg( s ) )
246 END IF
247*
248 END IF
249*
250* End of ZLAQZ1
251*
252 END SUBROUTINE
subroutine zlaqz1(ilq, ilz, k, istartm, istopm, ihi, a, lda, b, ldb, nq, qstart, q, ldq, nz, zstart, z, ldz)
ZLAQZ1
Definition zlaqz1.f:172
subroutine zlartg(f, g, c, s, r)
ZLARTG generates a plane rotation with real cosine and complex sine.
Definition zlartg.f90:116
subroutine zrot(n, cx, incx, cy, incy, c, s)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
Definition zrot.f:101