LAPACK  3.10.0
LAPACK: Linear Algebra PACKage

◆ zunbdb5()

subroutine zunbdb5 ( integer  M1,
integer  M2,
integer  N,
complex*16, dimension(*)  X1,
integer  INCX1,
complex*16, dimension(*)  X2,
integer  INCX2,
complex*16, dimension(ldq1,*)  Q1,
integer  LDQ1,
complex*16, dimension(ldq2,*)  Q2,
integer  LDQ2,
complex*16, dimension(*)  WORK,
integer  LWORK,
integer  INFO 
)

ZUNBDB5

Download ZUNBDB5 + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 ZUNBDB5 orthogonalizes the column vector
      X = [ X1 ]
          [ X2 ]
 with respect to the columns of
      Q = [ Q1 ] .
          [ Q2 ]
 The columns of Q must be orthonormal.

 If the projection is zero according to Kahan's "twice is enough"
 criterion, then some other vector from the orthogonal complement
 is returned. This vector is chosen in an arbitrary but deterministic
 way.
Parameters
[in]M1
          M1 is INTEGER
           The dimension of X1 and the number of rows in Q1. 0 <= M1.
[in]M2
          M2 is INTEGER
           The dimension of X2 and the number of rows in Q2. 0 <= M2.
[in]N
          N is INTEGER
           The number of columns in Q1 and Q2. 0 <= N.
[in,out]X1
          X1 is COMPLEX*16 array, dimension (M1)
           On entry, the top part of the vector to be orthogonalized.
           On exit, the top part of the projected vector.
[in]INCX1
          INCX1 is INTEGER
           Increment for entries of X1.
[in,out]X2
          X2 is COMPLEX*16 array, dimension (M2)
           On entry, the bottom part of the vector to be
           orthogonalized. On exit, the bottom part of the projected
           vector.
[in]INCX2
          INCX2 is INTEGER
           Increment for entries of X2.
[in]Q1
          Q1 is COMPLEX*16 array, dimension (LDQ1, N)
           The top part of the orthonormal basis matrix.
[in]LDQ1
          LDQ1 is INTEGER
           The leading dimension of Q1. LDQ1 >= M1.
[in]Q2
          Q2 is COMPLEX*16 array, dimension (LDQ2, N)
           The bottom part of the orthonormal basis matrix.
[in]LDQ2
          LDQ2 is INTEGER
           The leading dimension of Q2. LDQ2 >= M2.
[out]WORK
          WORK is COMPLEX*16 array, dimension (LWORK)
[in]LWORK
          LWORK is INTEGER
           The dimension of the array WORK. LWORK >= N.
[out]INFO
          INFO is INTEGER
           = 0:  successful exit.
           < 0:  if INFO = -i, the i-th argument had an illegal value.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 154 of file zunbdb5.f.

156 *
157 * -- LAPACK computational routine --
158 * -- LAPACK is a software package provided by Univ. of Tennessee, --
159 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
160 *
161 * .. Scalar Arguments ..
162  INTEGER INCX1, INCX2, INFO, LDQ1, LDQ2, LWORK, M1, M2,
163  $ N
164 * ..
165 * .. Array Arguments ..
166  COMPLEX*16 Q1(LDQ1,*), Q2(LDQ2,*), WORK(*), X1(*), X2(*)
167 * ..
168 *
169 * =====================================================================
170 *
171 * .. Parameters ..
172  COMPLEX*16 ONE, ZERO
173  parameter( one = (1.0d0,0.0d0), zero = (0.0d0,0.0d0) )
174 * ..
175 * .. Local Scalars ..
176  INTEGER CHILDINFO, I, J
177 * ..
178 * .. External Subroutines ..
179  EXTERNAL zunbdb6, xerbla
180 * ..
181 * .. External Functions ..
182  DOUBLE PRECISION DZNRM2
183  EXTERNAL dznrm2
184 * ..
185 * .. Intrinsic Function ..
186  INTRINSIC max
187 * ..
188 * .. Executable Statements ..
189 *
190 * Test input arguments
191 *
192  info = 0
193  IF( m1 .LT. 0 ) THEN
194  info = -1
195  ELSE IF( m2 .LT. 0 ) THEN
196  info = -2
197  ELSE IF( n .LT. 0 ) THEN
198  info = -3
199  ELSE IF( incx1 .LT. 1 ) THEN
200  info = -5
201  ELSE IF( incx2 .LT. 1 ) THEN
202  info = -7
203  ELSE IF( ldq1 .LT. max( 1, m1 ) ) THEN
204  info = -9
205  ELSE IF( ldq2 .LT. max( 1, m2 ) ) THEN
206  info = -11
207  ELSE IF( lwork .LT. n ) THEN
208  info = -13
209  END IF
210 *
211  IF( info .NE. 0 ) THEN
212  CALL xerbla( 'ZUNBDB5', -info )
213  RETURN
214  END IF
215 *
216 * Project X onto the orthogonal complement of Q
217 *
218  CALL zunbdb6( m1, m2, n, x1, incx1, x2, incx2, q1, ldq1, q2, ldq2,
219  $ work, lwork, childinfo )
220 *
221 * If the projection is nonzero, then return
222 *
223  IF( dznrm2(m1,x1,incx1) .NE. zero
224  $ .OR. dznrm2(m2,x2,incx2) .NE. zero ) THEN
225  RETURN
226  END IF
227 *
228 * Project each standard basis vector e_1,...,e_M1 in turn, stopping
229 * when a nonzero projection is found
230 *
231  DO i = 1, m1
232  DO j = 1, m1
233  x1(j) = zero
234  END DO
235  x1(i) = one
236  DO j = 1, m2
237  x2(j) = zero
238  END DO
239  CALL zunbdb6( m1, m2, n, x1, incx1, x2, incx2, q1, ldq1, q2,
240  $ ldq2, work, lwork, childinfo )
241  IF( dznrm2(m1,x1,incx1) .NE. zero
242  $ .OR. dznrm2(m2,x2,incx2) .NE. zero ) THEN
243  RETURN
244  END IF
245  END DO
246 *
247 * Project each standard basis vector e_(M1+1),...,e_(M1+M2) in turn,
248 * stopping when a nonzero projection is found
249 *
250  DO i = 1, m2
251  DO j = 1, m1
252  x1(j) = zero
253  END DO
254  DO j = 1, m2
255  x2(j) = zero
256  END DO
257  x2(i) = one
258  CALL zunbdb6( m1, m2, n, x1, incx1, x2, incx2, q1, ldq1, q2,
259  $ ldq2, work, lwork, childinfo )
260  IF( dznrm2(m1,x1,incx1) .NE. zero
261  $ .OR. dznrm2(m2,x2,incx2) .NE. zero ) THEN
262  RETURN
263  END IF
264  END DO
265 *
266  RETURN
267 *
268 * End of ZUNBDB5
269 *
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine zunbdb6(M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2, WORK, LWORK, INFO)
ZUNBDB6
Definition: zunbdb6.f:154
real(wp) function dznrm2(n, x, incx)
DZNRM2
Definition: dznrm2.f90:90
Here is the call graph for this function:
Here is the caller graph for this function: