annotate libcruft/lapack/zunmrz.f @ 7948:af10baa63915 ss-3-1-50

3.1.50 snapshot
author John W. Eaton <jwe@octave.org>
date Fri, 18 Jul 2008 17:42:48 -0400
parents e92bc778c634
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6936
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
1 SUBROUTINE ZUNMRZ( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
2 $ WORK, LWORK, INFO )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
3 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
4 * -- LAPACK routine (version 3.1.1) --
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
5 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
6 * January 2007
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
7 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
8 * .. Scalar Arguments ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
9 CHARACTER SIDE, TRANS
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
10 INTEGER INFO, K, L, LDA, LDC, LWORK, M, N
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
11 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
12 * .. Array Arguments ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
13 COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
14 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
15 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
16 * Purpose
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
17 * =======
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
18 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
19 * ZUNMRZ overwrites the general complex M-by-N matrix C with
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
20 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
21 * SIDE = 'L' SIDE = 'R'
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
22 * TRANS = 'N': Q * C C * Q
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
23 * TRANS = 'C': Q**H * C C * Q**H
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
24 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
25 * where Q is a complex unitary matrix defined as the product of k
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
26 * elementary reflectors
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
27 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
28 * Q = H(1) H(2) . . . H(k)
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
29 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
30 * as returned by ZTZRZF. Q is of order M if SIDE = 'L' and of order N
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
31 * if SIDE = 'R'.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
32 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
33 * Arguments
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
34 * =========
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
35 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
36 * SIDE (input) CHARACTER*1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
37 * = 'L': apply Q or Q**H from the Left;
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
38 * = 'R': apply Q or Q**H from the Right.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
39 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
40 * TRANS (input) CHARACTER*1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
41 * = 'N': No transpose, apply Q;
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
42 * = 'C': Conjugate transpose, apply Q**H.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
43 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
44 * M (input) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
45 * The number of rows of the matrix C. M >= 0.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
46 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
47 * N (input) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
48 * The number of columns of the matrix C. N >= 0.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
49 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
50 * K (input) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
51 * The number of elementary reflectors whose product defines
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
52 * the matrix Q.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
53 * If SIDE = 'L', M >= K >= 0;
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
54 * if SIDE = 'R', N >= K >= 0.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
55 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
56 * L (input) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
57 * The number of columns of the matrix A containing
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
58 * the meaningful part of the Householder reflectors.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
59 * If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
60 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
61 * A (input) COMPLEX*16 array, dimension
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
62 * (LDA,M) if SIDE = 'L',
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
63 * (LDA,N) if SIDE = 'R'
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
64 * The i-th row must contain the vector which defines the
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
65 * elementary reflector H(i), for i = 1,2,...,k, as returned by
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
66 * ZTZRZF in the last k rows of its array argument A.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
67 * A is modified by the routine but restored on exit.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
68 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
69 * LDA (input) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
70 * The leading dimension of the array A. LDA >= max(1,K).
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
71 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
72 * TAU (input) COMPLEX*16 array, dimension (K)
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
73 * TAU(i) must contain the scalar factor of the elementary
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
74 * reflector H(i), as returned by ZTZRZF.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
75 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
76 * C (input/output) COMPLEX*16 array, dimension (LDC,N)
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
77 * On entry, the M-by-N matrix C.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
78 * On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
79 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
80 * LDC (input) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
81 * The leading dimension of the array C. LDC >= max(1,M).
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
82 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
83 * WORK (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
84 * On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
85 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
86 * LWORK (input) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
87 * The dimension of the array WORK.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
88 * If SIDE = 'L', LWORK >= max(1,N);
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
89 * if SIDE = 'R', LWORK >= max(1,M).
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
90 * For optimum performance LWORK >= N*NB if SIDE = 'L', and
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
91 * LWORK >= M*NB if SIDE = 'R', where NB is the optimal
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
92 * blocksize.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
93 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
94 * If LWORK = -1, then a workspace query is assumed; the routine
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
95 * only calculates the optimal size of the WORK array, returns
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
96 * this value as the first entry of the WORK array, and no error
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
97 * message related to LWORK is issued by XERBLA.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
98 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
99 * INFO (output) INTEGER
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
100 * = 0: successful exit
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
101 * < 0: if INFO = -i, the i-th argument had an illegal value
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
102 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
103 * Further Details
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
104 * ===============
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
105 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
106 * Based on contributions by
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
107 * A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
108 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
109 * =====================================================================
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
110 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
111 * .. Parameters ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
112 INTEGER NBMAX, LDT
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
113 PARAMETER ( NBMAX = 64, LDT = NBMAX+1 )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
114 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
115 * .. Local Scalars ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
116 LOGICAL LEFT, LQUERY, NOTRAN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
117 CHARACTER TRANST
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
118 INTEGER I, I1, I2, I3, IB, IC, IINFO, IWS, JA, JC,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
119 $ LDWORK, LWKOPT, MI, NB, NBMIN, NI, NQ, NW
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
120 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
121 * .. Local Arrays ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
122 COMPLEX*16 T( LDT, NBMAX )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
123 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
124 * .. External Functions ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
125 LOGICAL LSAME
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
126 INTEGER ILAENV
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
127 EXTERNAL LSAME, ILAENV
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
128 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
129 * .. External Subroutines ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
130 EXTERNAL XERBLA, ZLARZB, ZLARZT, ZUNMR3
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
131 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
132 * .. Intrinsic Functions ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
133 INTRINSIC MAX, MIN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
134 * ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
135 * .. Executable Statements ..
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
136 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
137 * Test the input arguments
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
138 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
139 INFO = 0
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
140 LEFT = LSAME( SIDE, 'L' )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
141 NOTRAN = LSAME( TRANS, 'N' )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
142 LQUERY = ( LWORK.EQ.-1 )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
143 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
144 * NQ is the order of Q and NW is the minimum dimension of WORK
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
145 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
146 IF( LEFT ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
147 NQ = M
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
148 NW = MAX( 1, N )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
149 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
150 NQ = N
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
151 NW = MAX( 1, M )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
152 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
153 IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
154 INFO = -1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
155 ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
156 INFO = -2
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
157 ELSE IF( M.LT.0 ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
158 INFO = -3
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
159 ELSE IF( N.LT.0 ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
160 INFO = -4
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
161 ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
162 INFO = -5
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
163 ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
164 $ ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
165 INFO = -6
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
166 ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
167 INFO = -8
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
168 ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
169 INFO = -11
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
170 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
171 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
172 IF( INFO.EQ.0 ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
173 IF( M.EQ.0 .OR. N.EQ.0 ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
174 LWKOPT = 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
175 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
176 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
177 * Determine the block size. NB may be at most NBMAX, where
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
178 * NBMAX is used to define the local array T.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
179 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
180 NB = MIN( NBMAX, ILAENV( 1, 'ZUNMRQ', SIDE // TRANS, M, N,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
181 $ K, -1 ) )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
182 LWKOPT = NW*NB
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
183 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
184 WORK( 1 ) = LWKOPT
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
185 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
186 IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
187 INFO = -13
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
188 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
189 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
190 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
191 IF( INFO.NE.0 ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
192 CALL XERBLA( 'ZUNMRZ', -INFO )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
193 RETURN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
194 ELSE IF( LQUERY ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
195 RETURN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
196 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
197 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
198 * Quick return if possible
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
199 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
200 IF( M.EQ.0 .OR. N.EQ.0 ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
201 RETURN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
202 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
203 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
204 * Determine the block size. NB may be at most NBMAX, where NBMAX
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
205 * is used to define the local array T.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
206 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
207 NB = MIN( NBMAX, ILAENV( 1, 'ZUNMRQ', SIDE // TRANS, M, N, K,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
208 $ -1 ) )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
209 NBMIN = 2
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
210 LDWORK = NW
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
211 IF( NB.GT.1 .AND. NB.LT.K ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
212 IWS = NW*NB
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
213 IF( LWORK.LT.IWS ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
214 NB = LWORK / LDWORK
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
215 NBMIN = MAX( 2, ILAENV( 2, 'ZUNMRQ', SIDE // TRANS, M, N, K,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
216 $ -1 ) )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
217 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
218 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
219 IWS = NW
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
220 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
221 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
222 IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
223 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
224 * Use unblocked code
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
225 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
226 CALL ZUNMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
227 $ WORK, IINFO )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
228 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
229 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
230 * Use blocked code
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
231 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
232 IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
233 $ ( .NOT.LEFT .AND. NOTRAN ) ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
234 I1 = 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
235 I2 = K
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
236 I3 = NB
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
237 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
238 I1 = ( ( K-1 ) / NB )*NB + 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
239 I2 = 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
240 I3 = -NB
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
241 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
242 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
243 IF( LEFT ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
244 NI = N
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
245 JC = 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
246 JA = M - L + 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
247 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
248 MI = M
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
249 IC = 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
250 JA = N - L + 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
251 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
252 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
253 IF( NOTRAN ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
254 TRANST = 'C'
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
255 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
256 TRANST = 'N'
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
257 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
258 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
259 DO 10 I = I1, I2, I3
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
260 IB = MIN( NB, K-I+1 )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
261 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
262 * Form the triangular factor of the block reflector
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
263 * H = H(i+ib-1) . . . H(i+1) H(i)
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
264 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
265 CALL ZLARZT( 'Backward', 'Rowwise', L, IB, A( I, JA ), LDA,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
266 $ TAU( I ), T, LDT )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
267 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
268 IF( LEFT ) THEN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
269 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
270 * H or H' is applied to C(i:m,1:n)
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
271 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
272 MI = M - I + 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
273 IC = I
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
274 ELSE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
275 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
276 * H or H' is applied to C(1:m,i:n)
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
277 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
278 NI = N - I + 1
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
279 JC = I
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
280 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
281 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
282 * Apply H or H'
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
283 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
284 CALL ZLARZB( SIDE, TRANST, 'Backward', 'Rowwise', MI, NI,
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
285 $ IB, L, A( I, JA ), LDA, T, LDT, C( IC, JC ),
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
286 $ LDC, WORK, LDWORK )
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
287 10 CONTINUE
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
288 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
289 END IF
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
290 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
291 WORK( 1 ) = LWKOPT
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
292 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
293 RETURN
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
294 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
295 * End of ZUNMRZ
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
296 *
e92bc778c634 [project @ 2007-09-30 21:39:05 by dbateman]
dbateman
parents:
diff changeset
297 END