168{
169
170 integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__4, i__5;
171 char ch__1[2];
172
173
174
175
178 ;
179 integer i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iws;
181 extern logical lsame_(
char *,
char *);
183 extern
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 *);
188 char transt[1];
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
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
224 *info = 0;
225 left = lsame_(side, "L");
226 notran = lsame_(trans, "N");
227 lquery = *lwork == -1;
228
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
274
275
276 i__1 = 64;
277 i__2 = ilaenv_(&c__1, "DORMLQ", ch__1, m, n, k, &c_n1);
278 nb = min(i__1,i__2);
279 lwkopt = max(1,nw) * nb;
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
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
307 i__1 = 2;
308 i__2 = ilaenv_(&c__2, "DORMLQ", ch__1, m, n, k, &c_n1);
309 nbmin = max(i__1,i__2);
310 }
311 }
312 else
313 {
314 iws = nw;
315 }
316 if (nb < nbmin || nb >= *k)
317 {
318
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
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;
357 i__2 < 0 ? i__ >= i__1 : i__ <= i__1;
358 i__ += i__2)
359 {
360
361 i__4 = nb;
362 i__5 = *k - i__ + 1;
363 ib = min(i__4,i__5);
364
365
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
371 mi = *m - i__ + 1;
372 ic = i__;
373 }
374 else
375 {
376
377 ni = *n - i__ + 1;
378 jc = i__;
379 }
380
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
383 }
384 }
386 return 0;
387
388}
double doublereal
Definition FLA_f2c.h:31
int integer
Definition FLA_f2c.h:25
int logical
Definition FLA_f2c.h:36
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