OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
sorglq.f
Go to the documentation of this file.
1*> \brief \b SORGLQ
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download SORGLQ + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sorglq.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sorglq.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sorglq.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE SORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
22*
23* .. Scalar Arguments ..
24* INTEGER INFO, K, LDA, LWORK, M, N
25* ..
26* .. Array Arguments ..
27* REAL A( LDA, * ), TAU( * ), WORK( * )
28* ..
29*
30*
31*> \par Purpose:
32* =============
33*>
34*> \verbatim
35*>
36*> SORGLQ generates an M-by-N real matrix Q with orthonormal rows,
37*> which is defined as the first M rows of a product of K elementary
38*> reflectors of order N
39*>
40*> Q = H(k) . . . H(2) H(1)
41*>
42*> as returned by SGELQF.
43*> \endverbatim
44*
45* Arguments:
46* ==========
47*
48*> \param[in] M
49*> \verbatim
50*> M is INTEGER
51*> The number of rows of the matrix Q. M >= 0.
52*> \endverbatim
53*>
54*> \param[in] N
55*> \verbatim
56*> N is INTEGER
57*> The number of columns of the matrix Q. N >= M.
58*> \endverbatim
59*>
60*> \param[in] K
61*> \verbatim
62*> K is INTEGER
63*> The number of elementary reflectors whose product defines the
64*> matrix Q. M >= K >= 0.
65*> \endverbatim
66*>
67*> \param[in,out] A
68*> \verbatim
69*> A is REAL array, dimension (LDA,N)
70*> On entry, the i-th row must contain the vector which defines
71*> the elementary reflector H(i), for i = 1,2,...,k, as returned
72*> by SGELQF in the first k rows of its array argument A.
73*> On exit, the M-by-N matrix Q.
74*> \endverbatim
75*>
76*> \param[in] LDA
77*> \verbatim
78*> LDA is INTEGER
79*> The first dimension of the array A. LDA >= max(1,M).
80*> \endverbatim
81*>
82*> \param[in] TAU
83*> \verbatim
84*> TAU is REAL array, dimension (K)
85*> TAU(i) must contain the scalar factor of the elementary
86*> reflector H(i), as returned by SGELQF.
87*> \endverbatim
88*>
89*> \param[out] WORK
90*> \verbatim
91*> WORK is REAL array, dimension (MAX(1,LWORK))
92*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
93*> \endverbatim
94*>
95*> \param[in] LWORK
96*> \verbatim
97*> LWORK is INTEGER
98*> The dimension of the array WORK. LWORK >= max(1,M).
99*> For optimum performance LWORK >= M*NB, where NB is
100*> the optimal blocksize.
101*>
102*> If LWORK = -1, then a workspace query is assumed; the routine
103*> only calculates the optimal size of the WORK array, returns
104*> this value as the first entry of the WORK array, and no error
105*> message related to LWORK is issued by XERBLA.
106*> \endverbatim
107*>
108*> \param[out] INFO
109*> \verbatim
110*> INFO is INTEGER
111*> = 0: successful exit
112*> < 0: if INFO = -i, the i-th argument has an illegal value
113*> \endverbatim
114*
115* Authors:
116* ========
117*
118*> \author Univ. of Tennessee
119*> \author Univ. of California Berkeley
120*> \author Univ. of Colorado Denver
121*> \author NAG Ltd.
122*
123*> \ingroup realOTHERcomputational
124*
125* =====================================================================
126 SUBROUTINE sorglq( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
127*
128* -- LAPACK computational routine --
129* -- LAPACK is a software package provided by Univ. of Tennessee, --
130* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
131*
132* .. Scalar Arguments ..
133 INTEGER INFO, K, LDA, LWORK, M, N
134* ..
135* .. Array Arguments ..
136 REAL A( LDA, * ), TAU( * ), WORK( * )
137* ..
138*
139* =====================================================================
140*
141* .. Parameters ..
142 REAL ZERO
143 parameter( zero = 0.0e+0 )
144* ..
145* .. Local Scalars ..
146 LOGICAL LQUERY
147 INTEGER I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
148 $ LWKOPT, NB, NBMIN, NX
149* ..
150* .. External Subroutines ..
151 EXTERNAL slarfb, slarft, sorgl2, xerbla
152* ..
153* .. Intrinsic Functions ..
154 INTRINSIC max, min
155* ..
156* .. External Functions ..
157 INTEGER ILAENV
158 EXTERNAL ilaenv
159* ..
160* .. Executable Statements ..
161*
162* Test the input arguments
163*
164 info = 0
165 nb = ilaenv( 1, 'SORGLQ', ' ', m, n, k, -1 )
166 lwkopt = max( 1, m )*nb
167 work( 1 ) = lwkopt
168 lquery = ( lwork.EQ.-1 )
169 IF( m.LT.0 ) THEN
170 info = -1
171 ELSE IF( n.LT.m ) THEN
172 info = -2
173 ELSE IF( k.LT.0 .OR. k.GT.m ) THEN
174 info = -3
175 ELSE IF( lda.LT.max( 1, m ) ) THEN
176 info = -5
177 ELSE IF( lwork.LT.max( 1, m ) .AND. .NOT.lquery ) THEN
178 info = -8
179 END IF
180 IF( info.NE.0 ) THEN
181 CALL xerbla( 'SORGLQ', -info )
182 RETURN
183 ELSE IF( lquery ) THEN
184 RETURN
185 END IF
186*
187* Quick return if possible
188*
189 IF( m.LE.0 ) THEN
190 work( 1 ) = 1
191 RETURN
192 END IF
193*
194 nbmin = 2
195 nx = 0
196 iws = m
197 IF( nb.GT.1 .AND. nb.LT.k ) THEN
198*
199* Determine when to cross over from blocked to unblocked code.
200*
201 nx = max( 0, ilaenv( 3, 'SORGLQ', ' ', m, n, k, -1 ) )
202 IF( nx.LT.k ) THEN
203*
204* Determine if workspace is large enough for blocked code.
205*
206 ldwork = m
207 iws = ldwork*nb
208 IF( lwork.LT.iws ) THEN
209*
210* Not enough workspace to use optimal NB: reduce NB and
211* determine the minimum value of NB.
212*
213 nb = lwork / ldwork
214 nbmin = max( 2, ilaenv( 2, 'SORGLQ', ' ', M, N, K, -1 ) )
215 END IF
216 END IF
217 END IF
218*
219.GE..AND..LT..AND..LT. IF( NBNBMIN NBK NXK ) THEN
220*
221* Use blocked code after the last block.
222* The first kk rows are handled by the block method.
223*
224 KI = ( ( K-NX-1 ) / NB )*NB
225 KK = MIN( K, KI+NB )
226*
227* Set A(kk+1:m,1:kk) to zero.
228*
229 DO 20 J = 1, KK
230 DO 10 I = KK + 1, M
231 A( I, J ) = ZERO
232 10 CONTINUE
233 20 CONTINUE
234 ELSE
235 KK = 0
236 END IF
237*
238* Use unblocked code for the last or only block.
239*
240.LT. IF( KKM )
241 $ CALL SORGL2( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
242 $ TAU( KK+1 ), WORK, IINFO )
243*
244.GT. IF( KK0 ) THEN
245*
246* Use blocked code
247*
248 DO 50 I = KI + 1, 1, -NB
249 IB = MIN( NB, K-I+1 )
250.LE. IF( I+IBM ) THEN
251*
252* Form the triangular factor of the block reflector
253* H = H(i) H(i+1) . . . H(i+ib-1)
254*
255 CALL SLARFT( 'forward', 'rowwise', N-I+1, IB, A( I, I ),
256 $ LDA, TAU( I ), WORK, LDWORK )
257*
258* Apply H**T to A(i+ib:m,i:n) from the right
259*
260 CALL SLARFB( 'right', 'transpose', 'forward', 'rowwise',
261 $ M-I-IB+1, N-I+1, IB, A( I, I ), LDA, WORK,
262 $ LDWORK, A( I+IB, I ), LDA, WORK( IB+1 ),
263 $ LDWORK )
264 END IF
265*
266* Apply H**T to columns i:n of current block
267*
268 CALL SORGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
269 $ IINFO )
270*
271* Set columns 1:i-1 of current block to zero
272*
273 DO 40 J = 1, I - 1
274 DO 30 L = I, I + IB - 1
275 A( L, J ) = ZERO
276 30 CONTINUE
277 40 CONTINUE
278 50 CONTINUE
279 END IF
280*
281 WORK( 1 ) = IWS
282 RETURN
283*
284* End of SORGLQ
285*
286 END
subroutine xerbla(srname, info)
XERBLA
Definition xerbla.f:60
subroutine slarft(direct, storev, n, k, v, ldv, tau, t, ldt)
SLARFT forms the triangular factor T of a block reflector H = I - vtvH
Definition slarft.f:163
subroutine slarfb(side, trans, direct, storev, m, n, k, v, ldv, t, ldt, c, ldc, work, ldwork)
SLARFB applies a block reflector or its transpose to a general rectangular matrix.
Definition slarfb.f:197
subroutine sorglq(m, n, k, a, lda, tau, work, lwork, info)
SORGLQ
Definition sorglq.f:127
subroutine sorgl2(m, n, k, a, lda, tau, work, info)
SORGL2
Definition sorgl2.f:113
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21