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 cpot05_(char *uplo, integer *n, integer *nrhs, complex *
00021 a, integer *lda, complex *b, integer *ldb, complex *x, integer *ldx,
00022 complex *xact, integer *ldxact, real *ferr, real *berr, real *reslts)
00023 {
00024
00025 integer a_dim1, a_offset, b_dim1, b_offset, x_dim1, x_offset, xact_dim1,
00026 xact_offset, i__1, i__2, i__3, i__4, i__5;
00027 real r__1, r__2, r__3, r__4;
00028 complex q__1, q__2;
00029
00030
00031 double r_imag(complex *);
00032
00033
00034 integer i__, j, k;
00035 real eps, tmp, diff, axbi;
00036 integer imax;
00037 real unfl, ovfl;
00038 extern logical lsame_(char *, char *);
00039 logical upper;
00040 real xnorm;
00041 extern integer icamax_(integer *, complex *, integer *);
00042 extern doublereal slamch_(char *);
00043 real errbnd;
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
00155
00156 a_dim1 = *lda;
00157 a_offset = 1 + a_dim1;
00158 a -= a_offset;
00159 b_dim1 = *ldb;
00160 b_offset = 1 + b_dim1;
00161 b -= b_offset;
00162 x_dim1 = *ldx;
00163 x_offset = 1 + x_dim1;
00164 x -= x_offset;
00165 xact_dim1 = *ldxact;
00166 xact_offset = 1 + xact_dim1;
00167 xact -= xact_offset;
00168 --ferr;
00169 --berr;
00170 --reslts;
00171
00172
00173 if (*n <= 0 || *nrhs <= 0) {
00174 reslts[1] = 0.f;
00175 reslts[2] = 0.f;
00176 return 0;
00177 }
00178
00179 eps = slamch_("Epsilon");
00180 unfl = slamch_("Safe minimum");
00181 ovfl = 1.f / unfl;
00182 upper = lsame_(uplo, "U");
00183
00184
00185
00186
00187
00188 errbnd = 0.f;
00189 i__1 = *nrhs;
00190 for (j = 1; j <= i__1; ++j) {
00191 imax = icamax_(n, &x[j * x_dim1 + 1], &c__1);
00192
00193 i__2 = imax + j * x_dim1;
00194 r__3 = (r__1 = x[i__2].r, dabs(r__1)) + (r__2 = r_imag(&x[imax + j *
00195 x_dim1]), dabs(r__2));
00196 xnorm = dmax(r__3,unfl);
00197 diff = 0.f;
00198 i__2 = *n;
00199 for (i__ = 1; i__ <= i__2; ++i__) {
00200 i__3 = i__ + j * x_dim1;
00201 i__4 = i__ + j * xact_dim1;
00202 q__2.r = x[i__3].r - xact[i__4].r, q__2.i = x[i__3].i - xact[i__4]
00203 .i;
00204 q__1.r = q__2.r, q__1.i = q__2.i;
00205
00206 r__3 = diff, r__4 = (r__1 = q__1.r, dabs(r__1)) + (r__2 = r_imag(&
00207 q__1), dabs(r__2));
00208 diff = dmax(r__3,r__4);
00209
00210 }
00211
00212 if (xnorm > 1.f) {
00213 goto L20;
00214 } else if (diff <= ovfl * xnorm) {
00215 goto L20;
00216 } else {
00217 errbnd = 1.f / eps;
00218 goto L30;
00219 }
00220
00221 L20:
00222 if (diff / xnorm <= ferr[j]) {
00223
00224 r__1 = errbnd, r__2 = diff / xnorm / ferr[j];
00225 errbnd = dmax(r__1,r__2);
00226 } else {
00227 errbnd = 1.f / eps;
00228 }
00229 L30:
00230 ;
00231 }
00232 reslts[1] = errbnd;
00233
00234
00235
00236
00237 i__1 = *nrhs;
00238 for (k = 1; k <= i__1; ++k) {
00239 i__2 = *n;
00240 for (i__ = 1; i__ <= i__2; ++i__) {
00241 i__3 = i__ + k * b_dim1;
00242 tmp = (r__1 = b[i__3].r, dabs(r__1)) + (r__2 = r_imag(&b[i__ + k *
00243 b_dim1]), dabs(r__2));
00244 if (upper) {
00245 i__3 = i__ - 1;
00246 for (j = 1; j <= i__3; ++j) {
00247 i__4 = j + i__ * a_dim1;
00248 i__5 = j + k * x_dim1;
00249 tmp += ((r__1 = a[i__4].r, dabs(r__1)) + (r__2 = r_imag(&
00250 a[j + i__ * a_dim1]), dabs(r__2))) * ((r__3 = x[
00251 i__5].r, dabs(r__3)) + (r__4 = r_imag(&x[j + k *
00252 x_dim1]), dabs(r__4)));
00253
00254 }
00255 i__3 = i__ + i__ * a_dim1;
00256 i__4 = i__ + k * x_dim1;
00257 tmp += (r__1 = a[i__3].r, dabs(r__1)) * ((r__2 = x[i__4].r,
00258 dabs(r__2)) + (r__3 = r_imag(&x[i__ + k * x_dim1]),
00259 dabs(r__3)));
00260 i__3 = *n;
00261 for (j = i__ + 1; j <= i__3; ++j) {
00262 i__4 = i__ + j * a_dim1;
00263 i__5 = j + k * x_dim1;
00264 tmp += ((r__1 = a[i__4].r, dabs(r__1)) + (r__2 = r_imag(&
00265 a[i__ + j * a_dim1]), dabs(r__2))) * ((r__3 = x[
00266 i__5].r, dabs(r__3)) + (r__4 = r_imag(&x[j + k *
00267 x_dim1]), dabs(r__4)));
00268
00269 }
00270 } else {
00271 i__3 = i__ - 1;
00272 for (j = 1; j <= i__3; ++j) {
00273 i__4 = i__ + j * a_dim1;
00274 i__5 = j + k * x_dim1;
00275 tmp += ((r__1 = a[i__4].r, dabs(r__1)) + (r__2 = r_imag(&
00276 a[i__ + j * a_dim1]), dabs(r__2))) * ((r__3 = x[
00277 i__5].r, dabs(r__3)) + (r__4 = r_imag(&x[j + k *
00278 x_dim1]), dabs(r__4)));
00279
00280 }
00281 i__3 = i__ + i__ * a_dim1;
00282 i__4 = i__ + k * x_dim1;
00283 tmp += (r__1 = a[i__3].r, dabs(r__1)) * ((r__2 = x[i__4].r,
00284 dabs(r__2)) + (r__3 = r_imag(&x[i__ + k * x_dim1]),
00285 dabs(r__3)));
00286 i__3 = *n;
00287 for (j = i__ + 1; j <= i__3; ++j) {
00288 i__4 = j + i__ * a_dim1;
00289 i__5 = j + k * x_dim1;
00290 tmp += ((r__1 = a[i__4].r, dabs(r__1)) + (r__2 = r_imag(&
00291 a[j + i__ * a_dim1]), dabs(r__2))) * ((r__3 = x[
00292 i__5].r, dabs(r__3)) + (r__4 = r_imag(&x[j + k *
00293 x_dim1]), dabs(r__4)));
00294
00295 }
00296 }
00297 if (i__ == 1) {
00298 axbi = tmp;
00299 } else {
00300 axbi = dmin(axbi,tmp);
00301 }
00302
00303 }
00304
00305 r__1 = axbi, r__2 = (*n + 1) * unfl;
00306 tmp = berr[k] / ((*n + 1) * eps + (*n + 1) * unfl / dmax(r__1,r__2));
00307 if (k == 1) {
00308 reslts[2] = tmp;
00309 } else {
00310 reslts[2] = dmax(reslts[2],tmp);
00311 }
00312
00313 }
00314
00315 return 0;
00316
00317
00318
00319 }