annotate libcruft/lapack/dormrz.f @ 7034:68db500cb558

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