123{
124
125 integer a_dim1, a_offset, i__1, i__2, i__3;
126
127 integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo;
128 extern
129 int dorgl2_fla(
integer *,
integer *,
integer *,
doublereal *,
integer *,
doublereal *,
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 *);
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 a_dim1 = *lda;
156 a_offset = 1 + a_dim1;
157 a -= a_offset;
158 --tau;
159 --work;
160
161 *info = 0;
162 nb = ilaenv_(&c__1, "DORGLQ", " ", m, n, k, &c_n1);
163 lwkopt = max(1,*m) * nb;
165 lquery = *lwork == -1;
166 if (*m < 0)
167 {
168 *info = -1;
169 }
170 else if (*n < *m)
171 {
172 *info = -2;
173 }
174 else if (*k < 0 || *k > *m)
175 {
176 *info = -3;
177 }
178 else if (*lda < max(1,*m))
179 {
180 *info = -5;
181 }
182 else if (*lwork < max(1,*m) && ! lquery)
183 {
184 *info = -8;
185 }
186 if (*info != 0)
187 {
188 i__1 = -(*info);
189 xerbla_("DORGLQ", &i__1);
190 return 0;
191 }
192 else if (lquery)
193 {
194 return 0;
195 }
196
197 if (*m <= 0)
198 {
199 work[1] = 1.;
200 return 0;
201 }
202 nbmin = 2;
203 nx = 0;
204 iws = *m;
205 if (nb > 1 && nb < *k)
206 {
207
208
209 i__1 = 0;
210 i__2 = ilaenv_(&c__3, "DORGLQ", " ", m, n, k, &c_n1);
211 nx = max(i__1,i__2);
212 if (nx < *k)
213 {
214
215 ldwork = *m;
216 iws = ldwork * nb;
217 if (*lwork < iws)
218 {
219
220
221 nb = *lwork / ldwork;
222
223 i__1 = 2;
224 i__2 = ilaenv_(&c__2, "DORGLQ", " ", m, n, k, &c_n1);
225 nbmin = max(i__1,i__2);
226 }
227 }
228 }
229 if (nb >= nbmin && nb < *k && nx < *k)
230 {
231
232
233 ki = (*k - nx - 1) / nb * nb;
234
235 i__1 = *k;
236 i__2 = ki + nb;
237 kk = min(i__1,i__2);
238
239 i__1 = kk;
240 for (j = 1;
241 j <= i__1;
242 ++j)
243 {
244 i__2 = *m;
245 for (i__ = kk + 1;
246 i__ <= i__2;
247 ++i__)
248 {
249 a[i__ + j * a_dim1] = 0.;
250
251 }
252
253 }
254 }
255 else
256 {
257 kk = 0;
258 }
259
260 if (kk < *m)
261 {
262 i__1 = *m - kk;
263 i__2 = *n - kk;
264 i__3 = *k - kk;
265 dorgl2_fla(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & tau[kk + 1], &work[1], &iinfo);
266 }
267 if (kk > 0)
268 {
269
270 i__1 = -nb;
271 for (i__ = ki + 1;
272 i__1 < 0 ? i__ >= 1 : i__ <= 1;
273 i__ += i__1)
274 {
275
276 i__2 = nb;
277 i__3 = *k - i__ + 1;
278 ib = min(i__2,i__3);
279 if (i__ + ib <= *m)
280 {
281
282
283 i__2 = *n - i__ + 1;
284 dlarft_("Forward", "Rowwise", &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &ldwork);
285
286 i__2 = *m - i__ - ib + 1;
287 i__3 = *n - i__ + 1;
288 dlarfb_("Right", "Transpose", "Forward", "Rowwise", &i__2, & i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + 1], &ldwork);
289 }
290
291 i__2 = *n - i__ + 1;
292 dorgl2_fla(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & work[1], &iinfo);
293
294 i__2 = i__ - 1;
295 for (j = 1;
296 j <= i__2;
297 ++j)
298 {
299 i__3 = i__ + ib - 1;
300 for (l = i__;
301 l <= i__3;
302 ++l)
303 {
304 a[l + j * a_dim1] = 0.;
305
306 }
307
308 }
309
310 }
311 }
313 return 0;
314
315}
double doublereal
Definition FLA_f2c.h:31
int integer
Definition FLA_f2c.h:25
int logical
Definition FLA_f2c.h:36
int dorgl2_fla(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *info)
Definition dorgl2.c:102