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 ctzrzf_(integer *m, integer *n, complex *a, integer *lda,
00024 complex *tau, complex *work, integer *lwork, integer *info)
00025 {
00026
00027 integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5;
00028
00029
00030 integer i__, m1, ib, nb, ki, kk, mu, nx, iws, nbmin;
00031 extern int clarzb_(char *, char *, char *, char *,
00032 integer *, integer *, integer *, integer *, complex *, integer *,
00033 complex *, integer *, complex *, integer *, complex *, integer *), xerbla_(char *, integer *);
00034 extern integer ilaenv_(integer *, char *, char *, integer *, integer *,
00035 integer *, integer *);
00036 extern int clarzt_(char *, char *, integer *, integer *,
00037 complex *, integer *, complex *, complex *, integer *), clatrz_(integer *, integer *, integer *, complex *,
00038 integer *, complex *, complex *);
00039 integer ldwork, lwkopt;
00040 logical lquery;
00041
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
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 a_dim1 = *lda;
00155 a_offset = 1 + a_dim1;
00156 a -= a_offset;
00157 --tau;
00158 --work;
00159
00160
00161 *info = 0;
00162 lquery = *lwork == -1;
00163 if (*m < 0) {
00164 *info = -1;
00165 } else if (*n < *m) {
00166 *info = -2;
00167 } else if (*lda < max(1,*m)) {
00168 *info = -4;
00169 } else if (*lwork < max(1,*m) && ! lquery) {
00170 *info = -7;
00171 }
00172
00173 if (*info == 0) {
00174 if (*m == 0 || *m == *n) {
00175 lwkopt = 1;
00176 } else {
00177
00178
00179
00180 nb = ilaenv_(&c__1, "CGERQF", " ", m, n, &c_n1, &c_n1);
00181 lwkopt = *m * nb;
00182 }
00183 work[1].r = (real) lwkopt, work[1].i = 0.f;
00184
00185 if (*lwork < max(1,*m) && ! lquery) {
00186 *info = -7;
00187 }
00188 }
00189
00190 if (*info != 0) {
00191 i__1 = -(*info);
00192 xerbla_("CTZRZF", &i__1);
00193 return 0;
00194 } else if (lquery) {
00195 return 0;
00196 }
00197
00198
00199
00200 if (*m == 0) {
00201 return 0;
00202 } else if (*m == *n) {
00203 i__1 = *n;
00204 for (i__ = 1; i__ <= i__1; ++i__) {
00205 i__2 = i__;
00206 tau[i__2].r = 0.f, tau[i__2].i = 0.f;
00207
00208 }
00209 return 0;
00210 }
00211
00212 nbmin = 2;
00213 nx = 1;
00214 iws = *m;
00215 if (nb > 1 && nb < *m) {
00216
00217
00218
00219
00220 i__1 = 0, i__2 = ilaenv_(&c__3, "CGERQF", " ", m, n, &c_n1, &c_n1);
00221 nx = max(i__1,i__2);
00222 if (nx < *m) {
00223
00224
00225
00226 ldwork = *m;
00227 iws = ldwork * nb;
00228 if (*lwork < iws) {
00229
00230
00231
00232
00233 nb = *lwork / ldwork;
00234
00235 i__1 = 2, i__2 = ilaenv_(&c__2, "CGERQF", " ", m, n, &c_n1, &
00236 c_n1);
00237 nbmin = max(i__1,i__2);
00238 }
00239 }
00240 }
00241
00242 if (nb >= nbmin && nb < *m && nx < *m) {
00243
00244
00245
00246
00247
00248 i__1 = *m + 1;
00249 m1 = min(i__1,*n);
00250 ki = (*m - nx - 1) / nb * nb;
00251
00252 i__1 = *m, i__2 = ki + nb;
00253 kk = min(i__1,i__2);
00254
00255 i__1 = *m - kk + 1;
00256 i__2 = -nb;
00257 for (i__ = *m - kk + ki + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1;
00258 i__ += i__2) {
00259
00260 i__3 = *m - i__ + 1;
00261 ib = min(i__3,nb);
00262
00263
00264
00265
00266 i__3 = *n - i__ + 1;
00267 i__4 = *n - *m;
00268 clatrz_(&ib, &i__3, &i__4, &a[i__ + i__ * a_dim1], lda, &tau[i__],
00269 &work[1]);
00270 if (i__ > 1) {
00271
00272
00273
00274
00275 i__3 = *n - *m;
00276 clarzt_("Backward", "Rowwise", &i__3, &ib, &a[i__ + m1 *
00277 a_dim1], lda, &tau[i__], &work[1], &ldwork);
00278
00279
00280
00281 i__3 = i__ - 1;
00282 i__4 = *n - i__ + 1;
00283 i__5 = *n - *m;
00284 clarzb_("Right", "No transpose", "Backward", "Rowwise", &i__3,
00285 &i__4, &ib, &i__5, &a[i__ + m1 * a_dim1], lda, &work[
00286 1], &ldwork, &a[i__ * a_dim1 + 1], lda, &work[ib + 1],
00287 &ldwork)
00288 ;
00289 }
00290
00291 }
00292 mu = i__ + nb - 1;
00293 } else {
00294 mu = *m;
00295 }
00296
00297
00298
00299 if (mu > 0) {
00300 i__2 = *n - *m;
00301 clatrz_(&mu, n, &i__2, &a[a_offset], lda, &tau[1], &work[1]);
00302 }
00303
00304 work[1].r = (real) lwkopt, work[1].i = 0.f;
00305
00306 return 0;
00307
00308
00309
00310 }