169{
170
171 integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__4, i__5;
172 char ch__1[2];
173
174
175
176
179 ;
180 integer i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iws;
182 extern logical lsame_(
char *,
char *);
184 extern
185 int zunm2r_fla(
char *,
char *,
integer *,
integer *,
integer *,
doublecomplex *,
integer *,
doublecomplex *,
doublecomplex *,
integer *,
doublecomplex *,
integer *), xerbla_(
char *,
integer *);
187 extern
188 int zlarfb_(
char *,
char *,
char *,
char *,
integer *,
integer *,
integer *,
doublecomplex *,
integer *,
doublecomplex *,
integer *,
doublecomplex *,
integer *,
doublecomplex *,
integer *);
191 extern
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219 a_dim1 = *lda;
220 a_offset = 1 + a_dim1;
221 a -= a_offset;
222 --tau;
223 c_dim1 = *ldc;
224 c_offset = 1 + c_dim1;
225 c__ -= c_offset;
226 --work;
227
228 *info = 0;
229 left = lsame_(side, "L");
230 notran = lsame_(trans, "N");
231 lquery = *lwork == -1;
232
233 if (left)
234 {
235 nq = *m;
236 nw = *n;
237 }
238 else
239 {
240 nq = *n;
241 nw = *m;
242 }
243 if (! left && ! lsame_(side, "R"))
244 {
245 *info = -1;
246 }
247 else if (! notran && ! lsame_(trans, "C"))
248 {
249 *info = -2;
250 }
251 else if (*m < 0)
252 {
253 *info = -3;
254 }
255 else if (*n < 0)
256 {
257 *info = -4;
258 }
259 else if (*k < 0 || *k > nq)
260 {
261 *info = -5;
262 }
263 else if (*lda < max(1,nq))
264 {
265 *info = -7;
266 }
267 else if (*ldc < max(1,*m))
268 {
269 *info = -10;
270 }
271 else if (*lwork < max(1,nw) && ! lquery)
272 {
273 *info = -12;
274 }
275 if (*info == 0)
276 {
277
278
279
280 i__1 = 64;
281 i__2 = ilaenv_(&c__1, "ZUNMQR", ch__1, m, n, k, &c_n1);
282 nb = min(i__1,i__2);
283 lwkopt = max(1,nw) * nb;
286 }
287 if (*info != 0)
288 {
289 i__1 = -(*info);
290 xerbla_("ZUNMQR", &i__1);
291 return 0;
292 }
293 else if (lquery)
294 {
295 return 0;
296 }
297
298 if (*m == 0 || *n == 0 || *k == 0)
299 {
302 return 0;
303 }
304 nbmin = 2;
305 ldwork = nw;
306 if (nb > 1 && nb < *k)
307 {
308 iws = nw * nb;
309 if (*lwork < iws)
310 {
311 nb = *lwork / ldwork;
312
313 i__1 = 2;
314 i__2 = ilaenv_(&c__2, "ZUNMQR", ch__1, m, n, k, &c_n1);
315 nbmin = max(i__1,i__2);
316 }
317 }
318 else
319 {
320 iws = nw;
321 }
322 if (nb < nbmin || nb >= *k)
323 {
324
325 zunm2r_fla(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo);
326 }
327 else
328 {
329
330 if (left && ! notran || ! left && notran)
331 {
332 i1 = 1;
333 i2 = *k;
334 i3 = nb;
335 }
336 else
337 {
338 i1 = (*k - 1) / nb * nb + 1;
339 i2 = 1;
340 i3 = -nb;
341 }
342 if (left)
343 {
344 ni = *n;
345 jc = 1;
346 }
347 else
348 {
349 mi = *m;
350 ic = 1;
351 }
352 i__1 = i2;
353 i__2 = i3;
354 for (i__ = i1;
355 i__2 < 0 ? i__ >= i__1 : i__ <= i__1;
356 i__ += i__2)
357 {
358
359 i__4 = nb;
360 i__5 = *k - i__ + 1;
361 ib = min(i__4,i__5);
362
363
364 i__4 = nq - i__ + 1;
365 zlarft_("Forward", "Columnwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], t, &c__65) ;
366 if (left)
367 {
368
369 mi = *m - i__ + 1;
370 ic = i__;
371 }
372 else
373 {
374
375 ni = *n - i__ + 1;
376 jc = i__;
377 }
378
379 zlarfb_(side, trans, "Forward", "Columnwise", &mi, &ni, &ib, &a[ i__ + i__ * a_dim1], lda, t, &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork);
380
381 }
382 }
385 return 0;
386
387}
double doublereal
Definition FLA_f2c.h:31
int integer
Definition FLA_f2c.h:25
int logical
Definition FLA_f2c.h:36
doublereal i
Definition FLA_f2c.h:33
doublereal r
Definition FLA_f2c.h:33
int zunm2r_fla(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info)
Definition zunm2r.c:151