00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "f2c.h"
00014 #include "blaswrap.h"
00015
00016
00017
00018 static integer c__1 = 1;
00019 static integer c_n1 = -1;
00020 static integer c__3 = 3;
00021 static integer c__2 = 2;
00022
00023 int cunglq_(integer *m, integer *n, integer *k, complex *a,
00024 integer *lda, complex *tau, complex *work, integer *lwork, integer *
00025 info)
00026 {
00027
00028 integer a_dim1, a_offset, i__1, i__2, i__3, i__4;
00029
00030
00031 integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo;
00032 extern int cungl2_(integer *, integer *, integer *,
00033 complex *, integer *, complex *, complex *, integer *), clarfb_(
00034 char *, char *, char *, char *, integer *, integer *, integer *,
00035 complex *, integer *, complex *, integer *, complex *, integer *,
00036 complex *, integer *), clarft_(
00037 char *, char *, integer *, integer *, complex *, integer *,
00038 complex *, complex *, integer *), xerbla_(char *,
00039 integer *);
00040 extern integer ilaenv_(integer *, char *, char *, integer *, integer *,
00041 integer *, integer *);
00042 integer ldwork, lwkopt;
00043 logical lquery;
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 a_dim1 = *lda;
00127 a_offset = 1 + a_dim1;
00128 a -= a_offset;
00129 --tau;
00130 --work;
00131
00132
00133 *info = 0;
00134 nb = ilaenv_(&c__1, "CUNGLQ", " ", m, n, k, &c_n1);
00135 lwkopt = max(1,*m) * nb;
00136 work[1].r = (real) lwkopt, work[1].i = 0.f;
00137 lquery = *lwork == -1;
00138 if (*m < 0) {
00139 *info = -1;
00140 } else if (*n < *m) {
00141 *info = -2;
00142 } else if (*k < 0 || *k > *m) {
00143 *info = -3;
00144 } else if (*lda < max(1,*m)) {
00145 *info = -5;
00146 } else if (*lwork < max(1,*m) && ! lquery) {
00147 *info = -8;
00148 }
00149 if (*info != 0) {
00150 i__1 = -(*info);
00151 xerbla_("CUNGLQ", &i__1);
00152 return 0;
00153 } else if (lquery) {
00154 return 0;
00155 }
00156
00157
00158
00159 if (*m <= 0) {
00160 work[1].r = 1.f, work[1].i = 0.f;
00161 return 0;
00162 }
00163
00164 nbmin = 2;
00165 nx = 0;
00166 iws = *m;
00167 if (nb > 1 && nb < *k) {
00168
00169
00170
00171
00172 i__1 = 0, i__2 = ilaenv_(&c__3, "CUNGLQ", " ", m, n, k, &c_n1);
00173 nx = max(i__1,i__2);
00174 if (nx < *k) {
00175
00176
00177
00178 ldwork = *m;
00179 iws = ldwork * nb;
00180 if (*lwork < iws) {
00181
00182
00183
00184
00185 nb = *lwork / ldwork;
00186
00187 i__1 = 2, i__2 = ilaenv_(&c__2, "CUNGLQ", " ", m, n, k, &c_n1);
00188 nbmin = max(i__1,i__2);
00189 }
00190 }
00191 }
00192
00193 if (nb >= nbmin && nb < *k && nx < *k) {
00194
00195
00196
00197
00198 ki = (*k - nx - 1) / nb * nb;
00199
00200 i__1 = *k, i__2 = ki + nb;
00201 kk = min(i__1,i__2);
00202
00203
00204
00205 i__1 = kk;
00206 for (j = 1; j <= i__1; ++j) {
00207 i__2 = *m;
00208 for (i__ = kk + 1; i__ <= i__2; ++i__) {
00209 i__3 = i__ + j * a_dim1;
00210 a[i__3].r = 0.f, a[i__3].i = 0.f;
00211
00212 }
00213
00214 }
00215 } else {
00216 kk = 0;
00217 }
00218
00219
00220
00221 if (kk < *m) {
00222 i__1 = *m - kk;
00223 i__2 = *n - kk;
00224 i__3 = *k - kk;
00225 cungl2_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, &
00226 tau[kk + 1], &work[1], &iinfo);
00227 }
00228
00229 if (kk > 0) {
00230
00231
00232
00233 i__1 = -nb;
00234 for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) {
00235
00236 i__2 = nb, i__3 = *k - i__ + 1;
00237 ib = min(i__2,i__3);
00238 if (i__ + ib <= *m) {
00239
00240
00241
00242
00243 i__2 = *n - i__ + 1;
00244 clarft_("Forward", "Rowwise", &i__2, &ib, &a[i__ + i__ *
00245 a_dim1], lda, &tau[i__], &work[1], &ldwork);
00246
00247
00248
00249 i__2 = *m - i__ - ib + 1;
00250 i__3 = *n - i__ + 1;
00251 clarfb_("Right", "Conjugate transpose", "Forward", "Rowwise",
00252 &i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[
00253 1], &ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[
00254 ib + 1], &ldwork);
00255 }
00256
00257
00258
00259 i__2 = *n - i__ + 1;
00260 cungl2_(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &
00261 work[1], &iinfo);
00262
00263
00264
00265 i__2 = i__ - 1;
00266 for (j = 1; j <= i__2; ++j) {
00267 i__3 = i__ + ib - 1;
00268 for (l = i__; l <= i__3; ++l) {
00269 i__4 = l + j * a_dim1;
00270 a[i__4].r = 0.f, a[i__4].i = 0.f;
00271
00272 }
00273
00274 }
00275
00276 }
00277 }
00278
00279 work[1].r = (real) iws, work[1].i = 0.f;
00280 return 0;
00281
00282
00283
00284 }