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 dorgqr_(integer *m, integer *n, integer *k, doublereal *
00024 a, integer *lda, doublereal *tau, doublereal *work, integer *lwork,
00025 integer *info)
00026 {
00027
00028 integer a_dim1, a_offset, i__1, i__2, i__3;
00029
00030
00031 integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo;
00032 extern int dorg2r_(integer *, integer *, integer *,
00033 doublereal *, integer *, doublereal *, doublereal *, integer *),
00034 dlarfb_(char *, char *, char *, char *, integer *, integer *,
00035 integer *, doublereal *, integer *, doublereal *, integer *,
00036 doublereal *, integer *, doublereal *, integer *), dlarft_(char *, char *, integer *, integer *,
00037 doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(char *, integer *);
00038 extern integer ilaenv_(integer *, char *, char *, integer *, integer *,
00039 integer *, integer *);
00040 integer ldwork, lwkopt;
00041 logical lquery;
00042
00043
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 a_dim1 = *lda;
00126 a_offset = 1 + a_dim1;
00127 a -= a_offset;
00128 --tau;
00129 --work;
00130
00131
00132 *info = 0;
00133 nb = ilaenv_(&c__1, "DORGQR", " ", m, n, k, &c_n1);
00134 lwkopt = max(1,*n) * nb;
00135 work[1] = (doublereal) lwkopt;
00136 lquery = *lwork == -1;
00137 if (*m < 0) {
00138 *info = -1;
00139 } else if (*n < 0 || *n > *m) {
00140 *info = -2;
00141 } else if (*k < 0 || *k > *n) {
00142 *info = -3;
00143 } else if (*lda < max(1,*m)) {
00144 *info = -5;
00145 } else if (*lwork < max(1,*n) && ! lquery) {
00146 *info = -8;
00147 }
00148 if (*info != 0) {
00149 i__1 = -(*info);
00150 xerbla_("DORGQR", &i__1);
00151 return 0;
00152 } else if (lquery) {
00153 return 0;
00154 }
00155
00156
00157
00158 if (*n <= 0) {
00159 work[1] = 1.;
00160 return 0;
00161 }
00162
00163 nbmin = 2;
00164 nx = 0;
00165 iws = *n;
00166 if (nb > 1 && nb < *k) {
00167
00168
00169
00170
00171 i__1 = 0, i__2 = ilaenv_(&c__3, "DORGQR", " ", m, n, k, &c_n1);
00172 nx = max(i__1,i__2);
00173 if (nx < *k) {
00174
00175
00176
00177 ldwork = *n;
00178 iws = ldwork * nb;
00179 if (*lwork < iws) {
00180
00181
00182
00183
00184 nb = *lwork / ldwork;
00185
00186 i__1 = 2, i__2 = ilaenv_(&c__2, "DORGQR", " ", m, n, k, &c_n1);
00187 nbmin = max(i__1,i__2);
00188 }
00189 }
00190 }
00191
00192 if (nb >= nbmin && nb < *k && nx < *k) {
00193
00194
00195
00196
00197 ki = (*k - nx - 1) / nb * nb;
00198
00199 i__1 = *k, i__2 = ki + nb;
00200 kk = min(i__1,i__2);
00201
00202
00203
00204 i__1 = *n;
00205 for (j = kk + 1; j <= i__1; ++j) {
00206 i__2 = kk;
00207 for (i__ = 1; i__ <= i__2; ++i__) {
00208 a[i__ + j * a_dim1] = 0.;
00209
00210 }
00211
00212 }
00213 } else {
00214 kk = 0;
00215 }
00216
00217
00218
00219 if (kk < *n) {
00220 i__1 = *m - kk;
00221 i__2 = *n - kk;
00222 i__3 = *k - kk;
00223 dorg2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, &
00224 tau[kk + 1], &work[1], &iinfo);
00225 }
00226
00227 if (kk > 0) {
00228
00229
00230
00231 i__1 = -nb;
00232 for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) {
00233
00234 i__2 = nb, i__3 = *k - i__ + 1;
00235 ib = min(i__2,i__3);
00236 if (i__ + ib <= *n) {
00237
00238
00239
00240
00241 i__2 = *m - i__ + 1;
00242 dlarft_("Forward", "Columnwise", &i__2, &ib, &a[i__ + i__ *
00243 a_dim1], lda, &tau[i__], &work[1], &ldwork);
00244
00245
00246
00247 i__2 = *m - i__ + 1;
00248 i__3 = *n - i__ - ib + 1;
00249 dlarfb_("Left", "No transpose", "Forward", "Columnwise", &
00250 i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[
00251 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, &
00252 work[ib + 1], &ldwork);
00253 }
00254
00255
00256
00257 i__2 = *m - i__ + 1;
00258 dorg2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &
00259 work[1], &iinfo);
00260
00261
00262
00263 i__2 = i__ + ib - 1;
00264 for (j = i__; j <= i__2; ++j) {
00265 i__3 = i__ - 1;
00266 for (l = 1; l <= i__3; ++l) {
00267 a[l + j * a_dim1] = 0.;
00268
00269 }
00270
00271 }
00272
00273 }
00274 }
00275
00276 work[1] = (doublereal) iws;
00277 return 0;
00278
00279
00280
00281 }