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 cunt03_(char *rc, integer *mu, integer *mv, integer *n,
00021 integer *k, complex *u, integer *ldu, complex *v, integer *ldv,
00022 complex *work, integer *lwork, real *rwork, real *result, integer *
00023 info)
00024 {
00025
00026 integer u_dim1, u_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4;
00027 real r__1, r__2;
00028 complex q__1, q__2;
00029
00030
00031 double c_abs(complex *);
00032 void c_div(complex *, complex *, complex *);
00033
00034
00035 integer i__, j;
00036 complex s, su, sv;
00037 integer irc, lmx;
00038 real ulp, res1, res2;
00039 extern logical lsame_(char *, char *);
00040 extern int cunt01_(char *, integer *, integer *, complex
00041 *, integer *, complex *, integer *, real *, real *);
00042 extern integer icamax_(integer *, complex *, integer *);
00043 extern doublereal slamch_(char *);
00044 extern int xerbla_(char *, integer *);
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 u_dim1 = *ldu;
00154 u_offset = 1 + u_dim1;
00155 u -= u_offset;
00156 v_dim1 = *ldv;
00157 v_offset = 1 + v_dim1;
00158 v -= v_offset;
00159 --work;
00160 --rwork;
00161
00162
00163 *info = 0;
00164 if (lsame_(rc, "R")) {
00165 irc = 0;
00166 } else if (lsame_(rc, "C")) {
00167 irc = 1;
00168 } else {
00169 irc = -1;
00170 }
00171 if (irc == -1) {
00172 *info = -1;
00173 } else if (*mu < 0) {
00174 *info = -2;
00175 } else if (*mv < 0) {
00176 *info = -3;
00177 } else if (*n < 0) {
00178 *info = -4;
00179 } else if (*k < 0 || *k > max(*mu,*mv)) {
00180 *info = -5;
00181 } else if (irc == 0 && *ldu < max(1,*mu) || irc == 1 && *ldu < max(1,*n))
00182 {
00183 *info = -7;
00184 } else if (irc == 0 && *ldv < max(1,*mv) || irc == 1 && *ldv < max(1,*n))
00185 {
00186 *info = -9;
00187 }
00188 if (*info != 0) {
00189 i__1 = -(*info);
00190 xerbla_("CUNT03", &i__1);
00191 return 0;
00192 }
00193
00194
00195
00196 *result = 0.f;
00197 if (*mu == 0 || *mv == 0 || *n == 0) {
00198 return 0;
00199 }
00200
00201
00202
00203 ulp = slamch_("Precision");
00204
00205 if (irc == 0) {
00206
00207
00208
00209 res1 = 0.f;
00210 i__1 = *k;
00211 for (i__ = 1; i__ <= i__1; ++i__) {
00212 lmx = icamax_(n, &u[i__ + u_dim1], ldu);
00213 i__2 = i__ + lmx * v_dim1;
00214 if (v[i__2].r == 0.f && v[i__2].i == 0.f) {
00215 sv.r = 1.f, sv.i = 0.f;
00216 } else {
00217 r__1 = c_abs(&v[i__ + lmx * v_dim1]);
00218 q__2.r = r__1, q__2.i = 0.f;
00219 c_div(&q__1, &q__2, &v[i__ + lmx * v_dim1]);
00220 sv.r = q__1.r, sv.i = q__1.i;
00221 }
00222 i__2 = i__ + lmx * u_dim1;
00223 if (u[i__2].r == 0.f && u[i__2].i == 0.f) {
00224 su.r = 1.f, su.i = 0.f;
00225 } else {
00226 r__1 = c_abs(&u[i__ + lmx * u_dim1]);
00227 q__2.r = r__1, q__2.i = 0.f;
00228 c_div(&q__1, &q__2, &u[i__ + lmx * u_dim1]);
00229 su.r = q__1.r, su.i = q__1.i;
00230 }
00231 c_div(&q__1, &sv, &su);
00232 s.r = q__1.r, s.i = q__1.i;
00233 i__2 = *n;
00234 for (j = 1; j <= i__2; ++j) {
00235
00236 i__3 = i__ + j * u_dim1;
00237 i__4 = i__ + j * v_dim1;
00238 q__2.r = s.r * v[i__4].r - s.i * v[i__4].i, q__2.i = s.r * v[
00239 i__4].i + s.i * v[i__4].r;
00240 q__1.r = u[i__3].r - q__2.r, q__1.i = u[i__3].i - q__2.i;
00241 r__1 = res1, r__2 = c_abs(&q__1);
00242 res1 = dmax(r__1,r__2);
00243
00244 }
00245
00246 }
00247 res1 /= (real) (*n) * ulp;
00248
00249
00250
00251 cunt01_("Rows", mv, n, &v[v_offset], ldv, &work[1], lwork, &rwork[1],
00252 &res2);
00253
00254 } else {
00255
00256
00257
00258 res1 = 0.f;
00259 i__1 = *k;
00260 for (i__ = 1; i__ <= i__1; ++i__) {
00261 lmx = icamax_(n, &u[i__ * u_dim1 + 1], &c__1);
00262 i__2 = lmx + i__ * v_dim1;
00263 if (v[i__2].r == 0.f && v[i__2].i == 0.f) {
00264 sv.r = 1.f, sv.i = 0.f;
00265 } else {
00266 r__1 = c_abs(&v[lmx + i__ * v_dim1]);
00267 q__2.r = r__1, q__2.i = 0.f;
00268 c_div(&q__1, &q__2, &v[lmx + i__ * v_dim1]);
00269 sv.r = q__1.r, sv.i = q__1.i;
00270 }
00271 i__2 = lmx + i__ * u_dim1;
00272 if (u[i__2].r == 0.f && u[i__2].i == 0.f) {
00273 su.r = 1.f, su.i = 0.f;
00274 } else {
00275 r__1 = c_abs(&u[lmx + i__ * u_dim1]);
00276 q__2.r = r__1, q__2.i = 0.f;
00277 c_div(&q__1, &q__2, &u[lmx + i__ * u_dim1]);
00278 su.r = q__1.r, su.i = q__1.i;
00279 }
00280 c_div(&q__1, &sv, &su);
00281 s.r = q__1.r, s.i = q__1.i;
00282 i__2 = *n;
00283 for (j = 1; j <= i__2; ++j) {
00284
00285 i__3 = j + i__ * u_dim1;
00286 i__4 = j + i__ * v_dim1;
00287 q__2.r = s.r * v[i__4].r - s.i * v[i__4].i, q__2.i = s.r * v[
00288 i__4].i + s.i * v[i__4].r;
00289 q__1.r = u[i__3].r - q__2.r, q__1.i = u[i__3].i - q__2.i;
00290 r__1 = res1, r__2 = c_abs(&q__1);
00291 res1 = dmax(r__1,r__2);
00292
00293 }
00294
00295 }
00296 res1 /= (real) (*n) * ulp;
00297
00298
00299
00300 cunt01_("Columns", n, mv, &v[v_offset], ldv, &work[1], lwork, &rwork[
00301 1], &res2);
00302 }
00303
00304
00305 r__1 = dmax(res1,res2), r__2 = 1.f / ulp;
00306 *result = dmin(r__1,r__2);
00307 return 0;
00308
00309
00310
00311 }