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
00020 int zupmtr_(char *side, char *uplo, char *trans, integer *m,
00021 integer *n, doublecomplex *ap, doublecomplex *tau, doublecomplex *c__,
00022 integer *ldc, doublecomplex *work, integer *info)
00023 {
00024
00025 integer c_dim1, c_offset, i__1, i__2, i__3;
00026 doublecomplex z__1;
00027
00028
00029 void d_cnjg(doublecomplex *, doublecomplex *);
00030
00031
00032 integer i__, i1, i2, i3, ic, jc, ii, mi, ni, nq;
00033 doublecomplex aii;
00034 logical left;
00035 doublecomplex taui;
00036 extern logical lsame_(char *, char *);
00037 extern int zlarf_(char *, integer *, integer *,
00038 doublecomplex *, integer *, doublecomplex *, doublecomplex *,
00039 integer *, doublecomplex *);
00040 logical upper;
00041 extern int xerbla_(char *, integer *);
00042 logical notran, forwrd;
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 --ap;
00140 --tau;
00141 c_dim1 = *ldc;
00142 c_offset = 1 + c_dim1;
00143 c__ -= c_offset;
00144 --work;
00145
00146
00147 *info = 0;
00148 left = lsame_(side, "L");
00149 notran = lsame_(trans, "N");
00150 upper = lsame_(uplo, "U");
00151
00152
00153
00154 if (left) {
00155 nq = *m;
00156 } else {
00157 nq = *n;
00158 }
00159 if (! left && ! lsame_(side, "R")) {
00160 *info = -1;
00161 } else if (! upper && ! lsame_(uplo, "L")) {
00162 *info = -2;
00163 } else if (! notran && ! lsame_(trans, "C")) {
00164 *info = -3;
00165 } else if (*m < 0) {
00166 *info = -4;
00167 } else if (*n < 0) {
00168 *info = -5;
00169 } else if (*ldc < max(1,*m)) {
00170 *info = -9;
00171 }
00172 if (*info != 0) {
00173 i__1 = -(*info);
00174 xerbla_("ZUPMTR", &i__1);
00175 return 0;
00176 }
00177
00178
00179
00180 if (*m == 0 || *n == 0) {
00181 return 0;
00182 }
00183
00184 if (upper) {
00185
00186
00187
00188 forwrd = left && notran || ! left && ! notran;
00189
00190 if (forwrd) {
00191 i1 = 1;
00192 i2 = nq - 1;
00193 i3 = 1;
00194 ii = 2;
00195 } else {
00196 i1 = nq - 1;
00197 i2 = 1;
00198 i3 = -1;
00199 ii = nq * (nq + 1) / 2 - 1;
00200 }
00201
00202 if (left) {
00203 ni = *n;
00204 } else {
00205 mi = *m;
00206 }
00207
00208 i__1 = i2;
00209 i__2 = i3;
00210 for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
00211 if (left) {
00212
00213
00214
00215 mi = i__;
00216 } else {
00217
00218
00219
00220 ni = i__;
00221 }
00222
00223
00224
00225 if (notran) {
00226 i__3 = i__;
00227 taui.r = tau[i__3].r, taui.i = tau[i__3].i;
00228 } else {
00229 d_cnjg(&z__1, &tau[i__]);
00230 taui.r = z__1.r, taui.i = z__1.i;
00231 }
00232 i__3 = ii;
00233 aii.r = ap[i__3].r, aii.i = ap[i__3].i;
00234 i__3 = ii;
00235 ap[i__3].r = 1., ap[i__3].i = 0.;
00236 zlarf_(side, &mi, &ni, &ap[ii - i__ + 1], &c__1, &taui, &c__[
00237 c_offset], ldc, &work[1]);
00238 i__3 = ii;
00239 ap[i__3].r = aii.r, ap[i__3].i = aii.i;
00240
00241 if (forwrd) {
00242 ii = ii + i__ + 2;
00243 } else {
00244 ii = ii - i__ - 1;
00245 }
00246
00247 }
00248 } else {
00249
00250
00251
00252 forwrd = left && ! notran || ! left && notran;
00253
00254 if (forwrd) {
00255 i1 = 1;
00256 i2 = nq - 1;
00257 i3 = 1;
00258 ii = 2;
00259 } else {
00260 i1 = nq - 1;
00261 i2 = 1;
00262 i3 = -1;
00263 ii = nq * (nq + 1) / 2 - 1;
00264 }
00265
00266 if (left) {
00267 ni = *n;
00268 jc = 1;
00269 } else {
00270 mi = *m;
00271 ic = 1;
00272 }
00273
00274 i__2 = i2;
00275 i__1 = i3;
00276 for (i__ = i1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) {
00277 i__3 = ii;
00278 aii.r = ap[i__3].r, aii.i = ap[i__3].i;
00279 i__3 = ii;
00280 ap[i__3].r = 1., ap[i__3].i = 0.;
00281 if (left) {
00282
00283
00284
00285 mi = *m - i__;
00286 ic = i__ + 1;
00287 } else {
00288
00289
00290
00291 ni = *n - i__;
00292 jc = i__ + 1;
00293 }
00294
00295
00296
00297 if (notran) {
00298 i__3 = i__;
00299 taui.r = tau[i__3].r, taui.i = tau[i__3].i;
00300 } else {
00301 d_cnjg(&z__1, &tau[i__]);
00302 taui.r = z__1.r, taui.i = z__1.i;
00303 }
00304 zlarf_(side, &mi, &ni, &ap[ii], &c__1, &taui, &c__[ic + jc *
00305 c_dim1], ldc, &work[1]);
00306 i__3 = ii;
00307 ap[i__3].r = aii.r, ap[i__3].i = aii.i;
00308
00309 if (forwrd) {
00310 ii = ii + nq - i__ + 1;
00311 } else {
00312 ii = ii - nq + i__ - 2;
00313 }
00314
00315 }
00316 }
00317 return 0;
00318
00319
00320
00321 }