📄 zqrdc.c
字号:
/* compute the norms of the free columns. */
/*< if (pu .lt. pl) go to 80 >*/
if (pu < pl) {
goto L80;
}
/*< do 70 j = pl, pu >*/
i__1 = pu;
for (j = pl; j <= i__1; ++j) {
/*< qraux(j) = dcmplx(dznrm2(n,x(1,j),1),0.0d0) >*/
i__2 = j;
d__1 = dznrm2_(n, &x[j * x_dim1 + 1], &c__1);
z__1.r = d__1, z__1.i = 0.;
qraux[i__2].r = z__1.r, qraux[i__2].i = z__1.i;
/*< work(j) = qraux(j) >*/
i__2 = j;
i__3 = j;
work[i__2].r = qraux[i__3].r, work[i__2].i = qraux[i__3].i;
/*< 70 continue >*/
/* L70: */
}
/*< 80 continue >*/
L80:
/* perform the householder reduction of x. */
/*< lup = min0(n,p) >*/
lup = min(*n,*p);
/*< do 200 l = 1, lup >*/
i__1 = lup;
for (l = 1; l <= i__1; ++l) {
/*< if (l .lt. pl .or. l .ge. pu) go to 120 >*/
if (l < pl || l >= pu) {
goto L120;
}
/* locate the column of largest norm and bring it */
/* into the pivot position. */
/*< maxnrm = 0.0d0 >*/
maxnrm = 0.;
/*< maxj = l >*/
maxj = l;
/*< do 100 j = l, pu >*/
i__2 = pu;
for (j = l; j <= i__2; ++j) {
/*< if (dreal(qraux(j)) .le. maxnrm) go to 90 >*/
i__3 = j;
if (qraux[i__3].r <= maxnrm) {
goto L90;
}
/*< maxnrm = dreal(qraux(j)) >*/
i__3 = j;
maxnrm = qraux[i__3].r;
/*< maxj = j >*/
maxj = j;
/*< 90 continue >*/
L90:
/*< 100 continue >*/
/* L100: */
;
}
/*< if (maxj .eq. l) go to 110 >*/
if (maxj == l) {
goto L110;
}
/*< call zswap(n,x(1,l),1,x(1,maxj),1) >*/
zswap_(n, &x[l * x_dim1 + 1], &c__1, &x[maxj * x_dim1 + 1], &c__1);
/*< qraux(maxj) = qraux(l) >*/
i__2 = maxj;
i__3 = l;
qraux[i__2].r = qraux[i__3].r, qraux[i__2].i = qraux[i__3].i;
/*< work(maxj) = work(l) >*/
i__2 = maxj;
i__3 = l;
work[i__2].r = work[i__3].r, work[i__2].i = work[i__3].i;
/*< jp = jpvt(maxj) >*/
jp = jpvt[maxj];
/*< jpvt(maxj) = jpvt(l) >*/
jpvt[maxj] = jpvt[l];
/*< jpvt(l) = jp >*/
jpvt[l] = jp;
/*< 110 continue >*/
L110:
/*< 120 continue >*/
L120:
/*< qraux(l) = (0.0d0,0.0d0) >*/
i__2 = l;
qraux[i__2].r = 0., qraux[i__2].i = 0.;
/*< if (l .eq. n) go to 190 >*/
if (l == *n) {
goto L190;
}
/* compute the householder transformation for column l. */
/*< nrmxl = dcmplx(dznrm2(n-l+1,x(l,l),1),0.0d0) >*/
i__2 = *n - l + 1;
d__1 = dznrm2_(&i__2, &x[l + l * x_dim1], &c__1);
z__1.r = d__1, z__1.i = 0.;
nrmxl.r = z__1.r, nrmxl.i = z__1.i;
/*< if (cabs1(nrmxl) .eq. 0.0d0) go to 180 >*/
z__1.r = nrmxl.r * 0. - nrmxl.i * -1., z__1.i = nrmxl.i * 0. +
nrmxl.r * -1.;
if ((d__1 = nrmxl.r, abs(d__1)) + (d__2 = z__1.r, abs(d__2)) == 0.) {
goto L180;
}
/*< >*/
i__2 = l + l * x_dim1;
i__3 = l + l * x_dim1;
z__1.r = x[i__3].r * 0. - x[i__3].i * -1., z__1.i = x[i__3].i * 0. +
x[i__3].r * -1.;
if ((d__1 = x[i__2].r, abs(d__1)) + (d__2 = z__1.r, abs(d__2)) != 0.)
{
d__3 = z_abs(&nrmxl);
i__4 = l + l * x_dim1;
d__4 = z_abs(&x[l + l * x_dim1]);
z__3.r = x[i__4].r / d__4, z__3.i = x[i__4].i / d__4;
z__2.r = d__3 * z__3.r, z__2.i = d__3 * z__3.i;
nrmxl.r = z__2.r, nrmxl.i = z__2.i;
}
/*< call zscal(n-l+1,(1.0d0,0.0d0)/nrmxl,x(l,l),1) >*/
i__2 = *n - l + 1;
z_div(&z__1, &c_b28, &nrmxl);
zscal_(&i__2, &z__1, &x[l + l * x_dim1], &c__1);
/*< x(l,l) = (1.0d0,0.0d0) + x(l,l) >*/
i__2 = l + l * x_dim1;
i__3 = l + l * x_dim1;
z__1.r = x[i__3].r + 1., z__1.i = x[i__3].i + 0.;
x[i__2].r = z__1.r, x[i__2].i = z__1.i;
/* apply the transformation to the remaining columns, */
/* updating the norms. */
/*< lp1 = l + 1 >*/
lp1 = l + 1;
/*< if (p .lt. lp1) go to 170 >*/
if (*p < lp1) {
goto L170;
}
/*< do 160 j = lp1, p >*/
i__2 = *p;
for (j = lp1; j <= i__2; ++j) {
/*< t = -zdotc(n-l+1,x(l,l),1,x(l,j),1)/x(l,l) >*/
i__3 = *n - l + 1;
zdotc_(&z__3, &i__3, &x[l + l * x_dim1], &c__1, &x[l + j * x_dim1]
, &c__1);
z__2.r = -z__3.r, z__2.i = -z__3.i;
z_div(&z__1, &z__2, &x[l + l * x_dim1]);
t.r = z__1.r, t.i = z__1.i;
/*< call zaxpy(n-l+1,t,x(l,l),1,x(l,j),1) >*/
i__3 = *n - l + 1;
zaxpy_(&i__3, &t, &x[l + l * x_dim1], &c__1, &x[l + j * x_dim1], &
c__1);
/*< if (j .lt. pl .or. j .gt. pu) go to 150 >*/
if (j < pl || j > pu) {
goto L150;
}
/*< if (cabs1(qraux(j)) .eq. 0.0d0) go to 150 >*/
i__3 = j;
i__4 = j;
z__1.r = qraux[i__4].r * 0. - qraux[i__4].i * -1., z__1.i = qraux[
i__4].i * 0. + qraux[i__4].r * -1.;
if ((d__1 = qraux[i__3].r, abs(d__1)) + (d__2 = z__1.r, abs(d__2))
== 0.) {
goto L150;
}
/*< tt = 1.0d0 - (cdabs(x(l,j))/dreal(qraux(j)))**2 >*/
i__3 = j;
/* Computing 2nd power */
d__1 = z_abs(&x[l + j * x_dim1]) / qraux[i__3].r;
tt = 1. - d__1 * d__1;
/*< tt = dmax1(tt,0.0d0) >*/
tt = max(tt,0.);
/*< t = dcmplx(tt,0.0d0) >*/
z__1.r = tt, z__1.i = 0.;
t.r = z__1.r, t.i = z__1.i;
/*< >*/
i__3 = j;
i__4 = j;
/* Computing 2nd power */
d__1 = qraux[i__3].r / work[i__4].r;
tt = tt * .05 * (d__1 * d__1) + 1.;
/*< if (tt .eq. 1.0d0) go to 130 >*/
if (tt == 1.) {
goto L130;
}
/*< qraux(j) = qraux(j)*cdsqrt(t) >*/
i__3 = j;
i__4 = j;
z_sqrt(&z__2, &t);
z__1.r = qraux[i__4].r * z__2.r - qraux[i__4].i * z__2.i, z__1.i =
qraux[i__4].r * z__2.i + qraux[i__4].i * z__2.r;
qraux[i__3].r = z__1.r, qraux[i__3].i = z__1.i;
/*< go to 140 >*/
goto L140;
/*< 130 continue >*/
L130:
/*< qraux(j) = dcmplx(dznrm2(n-l,x(l+1,j),1),0.0d0) >*/
i__3 = j;
i__4 = *n - l;
d__1 = dznrm2_(&i__4, &x[l + 1 + j * x_dim1], &c__1);
z__1.r = d__1, z__1.i = 0.;
qraux[i__3].r = z__1.r, qraux[i__3].i = z__1.i;
/*< work(j) = qraux(j) >*/
i__3 = j;
i__4 = j;
work[i__3].r = qraux[i__4].r, work[i__3].i = qraux[i__4].i;
/*< 140 continue >*/
L140:
/*< 150 continue >*/
L150:
/*< 160 continue >*/
/* L160: */
;
}
/*< 170 continue >*/
L170:
/* save the transformation. */
/*< qraux(l) = x(l,l) >*/
i__2 = l;
i__3 = l + l * x_dim1;
qraux[i__2].r = x[i__3].r, qraux[i__2].i = x[i__3].i;
/*< x(l,l) = -nrmxl >*/
i__2 = l + l * x_dim1;
z__1.r = -nrmxl.r, z__1.i = -nrmxl.i;
x[i__2].r = z__1.r, x[i__2].i = z__1.i;
/*< 180 continue >*/
L180:
/*< 190 continue >*/
L190:
/*< 200 continue >*/
/* L200: */
;
}
/*< return >*/
return 0;
/*< end >*/
} /* zqrdc_ */
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -