libflame revision_anchor
Functions
dormlq.c File Reference

(r)

Functions

int dormlq_fla (char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info)
 

Function Documentation

◆ dormlq_fla()

int dormlq_fla ( char side,
char trans,
integer m,
integer n,
integer k,
doublereal a,
integer lda,
doublereal tau,
doublereal c__,
integer ldc,
doublereal work,
integer lwork,
integer info 
)
168{
169 /* System generated locals */
171 char ch__1[2];
172 /* Builtin functions */
173 /* Subroutine */
174
175 /* Local variables */
176 integer i__;
177 doublereal t[4160] /* was [65][64] */
178 ;
179 integer i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iws;
181 extern logical lsame_(char *, char *);
183 extern /* Subroutine */
184 int dorml2_fla(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(char *, integer *);
185 extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *);
188 char transt[1];
191 /* -- LAPACK computational routine (version 3.4.0) -- */
192 /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
193 /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
194 /* November 2011 */
195 /* .. Scalar Arguments .. */
196 /* .. */
197 /* .. Array Arguments .. */
198 /* .. */
199 /* ===================================================================== */
200 /* .. Parameters .. */
201 /* .. */
202 /* .. Local Scalars .. */
203 /* .. */
204 /* .. Local Arrays .. */
205 /* .. */
206 /* .. External Functions .. */
207 /* .. */
208 /* .. External Subroutines .. */
209 /* .. */
210 /* .. Intrinsic Functions .. */
211 /* .. */
212 /* .. Executable Statements .. */
213 /* Test the input arguments */
214 /* Parameter adjustments */
215 a_dim1 = *lda;
216 a_offset = 1 + a_dim1;
217 a -= a_offset;
218 --tau;
219 c_dim1 = *ldc;
220 c_offset = 1 + c_dim1;
221 c__ -= c_offset;
222 --work;
223 /* Function Body */
224 *info = 0;
225 left = lsame_(side, "L");
226 notran = lsame_(trans, "N");
227 lquery = *lwork == -1;
228 /* NQ is the order of Q and NW is the minimum dimension of WORK */
229 if (left)
230 {
231 nq = *m;
232 nw = *n;
233 }
234 else
235 {
236 nq = *n;
237 nw = *m;
238 }
239 if (! left && ! lsame_(side, "R"))
240 {
241 *info = -1;
242 }
243 else if (! notran && ! lsame_(trans, "T"))
244 {
245 *info = -2;
246 }
247 else if (*m < 0)
248 {
249 *info = -3;
250 }
251 else if (*n < 0)
252 {
253 *info = -4;
254 }
255 else if (*k < 0 || *k > nq)
256 {
257 *info = -5;
258 }
259 else if (*lda < max(1,*k))
260 {
261 *info = -7;
262 }
263 else if (*ldc < max(1,*m))
264 {
265 *info = -10;
266 }
267 else if (*lwork < max(1,nw) && ! lquery)
268 {
269 *info = -12;
270 }
271 if (*info == 0)
272 {
273 /* Determine the block size. NB may be at most NBMAX, where NBMAX */
274 /* is used to define the local array T. */
275 /* Computing MIN */
276 i__1 = 64;
277 i__2 = ilaenv_(&c__1, "DORMLQ", ch__1, m, n, k, &c_n1); // , expr subst
278 nb = min(i__1,i__2);
279 lwkopt = max(1,nw) * nb;
280 work[1] = (doublereal) lwkopt;
281 }
282 if (*info != 0)
283 {
284 i__1 = -(*info);
285 xerbla_("DORMLQ", &i__1);
286 return 0;
287 }
288 else if (lquery)
289 {
290 return 0;
291 }
292 /* Quick return if possible */
293 if (*m == 0 || *n == 0 || *k == 0)
294 {
295 work[1] = 1.;
296 return 0;
297 }
298 nbmin = 2;
299 ldwork = nw;
300 if (nb > 1 && nb < *k)
301 {
302 iws = nw * nb;
303 if (*lwork < iws)
304 {
305 nb = *lwork / ldwork;
306 /* Computing MAX */
307 i__1 = 2;
308 i__2 = ilaenv_(&c__2, "DORMLQ", ch__1, m, n, k, &c_n1); // , expr subst
309 nbmin = max(i__1,i__2);
310 }
311 }
312 else
313 {
314 iws = nw;
315 }
316 if (nb < nbmin || nb >= *k)
317 {
318 /* Use unblocked code */
319 dorml2_fla(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo);
320 }
321 else
322 {
323 /* Use blocked code */
324 if (left && notran || ! left && ! notran)
325 {
326 i1 = 1;
327 i2 = *k;
328 i3 = nb;
329 }
330 else
331 {
332 i1 = (*k - 1) / nb * nb + 1;
333 i2 = 1;
334 i3 = -nb;
335 }
336 if (left)
337 {
338 ni = *n;
339 jc = 1;
340 }
341 else
342 {
343 mi = *m;
344 ic = 1;
345 }
346 if (notran)
347 {
348 *(unsigned char *)transt = 'T';
349 }
350 else
351 {
352 *(unsigned char *)transt = 'N';
353 }
354 i__1 = i2;
355 i__2 = i3;
356 for (i__ = i1;
358 i__ += i__2)
359 {
360 /* Computing MIN */
361 i__4 = nb;
362 i__5 = *k - i__ + 1; // , expr subst
363 ib = min(i__4,i__5);
364 /* Form the triangular factor of the block reflector */
365 /* H = H(i) H(i+1) . . . H(i+ib-1) */
366 i__4 = nq - i__ + 1;
367 dlarft_("Forward", "Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], t, &c__65);
368 if (left)
369 {
370 /* H or H**T is applied to C(i:m,1:n) */
371 mi = *m - i__ + 1;
372 ic = i__;
373 }
374 else
375 {
376 /* H or H**T is applied to C(1:m,i:n) */
377 ni = *n - i__ + 1;
378 jc = i__;
379 }
380 /* Apply H or H**T */
381 dlarfb_(side, transt, "Forward", "Rowwise", &mi, &ni, &ib, &a[i__ + i__ * a_dim1], lda, t, &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork);
382 /* L10: */
383 }
384 }
385 work[1] = (doublereal) lwkopt;
386 return 0;
387 /* End of DORMLQ */
388}
double doublereal
Definition FLA_f2c.h:31
int integer
Definition FLA_f2c.h:25
int logical
Definition FLA_f2c.h:36
int i
Definition bl1_axmyv2.c:145
int dorml2_fla(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *info)
Definition dorml2.c:148

References dorml2_fla(), and i.