📄 zlatme.c
字号:
} else if (lsame_(dist, "S")) { idist = 2; } else if (lsame_(dist, "N")) { idist = 3; } else if (lsame_(dist, "D")) { idist = 4; } else { idist = -1; }/* Decode RSIGN */ if (lsame_(rsign, "T")) { irsign = 1; } else if (lsame_(rsign, "F")) { irsign = 0; } else { irsign = -1; }/* Decode UPPER */ if (lsame_(upper, "T")) { iupper = 1; } else if (lsame_(upper, "F")) { iupper = 0; } else { iupper = -1; }/* Decode SIM */ if (lsame_(sim, "T")) { isim = 1; } else if (lsame_(sim, "F")) { isim = 0; } else { isim = -1; }/* Check DS, if MODES=0 and ISIM=1 */ bads = FALSE_; if (*modes == 0 && isim == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (ds[j] == 0.) { bads = TRUE_; }/* L10: */ } }/* Set INFO if an error */ if (*n < 0) { *info = -1; } else if (idist == -1) { *info = -2; } else if (abs(*mode) > 6) { *info = -5; } else if (*mode != 0 && abs(*mode) != 6 && *cond < 1.) { *info = -6; } else if (irsign == -1) { *info = -9; } else if (iupper == -1) { *info = -10; } else if (isim == -1) { *info = -11; } else if (bads) { *info = -12; } else if (isim == 1 && abs(*modes) > 5) { *info = -13; } else if (isim == 1 && *modes != 0 && *conds < 1.) { *info = -14; } else if (*kl < 1) { *info = -15; } else if (*ku < 1 || *ku < *n - 1 && *kl < *n - 1) { *info = -16; } else if (*lda < max(1,*n)) { *info = -19; } if (*info != 0) { i__1 = -(*info); xerbla_("ZLATME", &i__1); return 0; }/* Initialize random number generator */ for (i = 1; i <= 4; ++i) { iseed[i] = (i__1 = iseed[i], abs(i__1)) % 4096;/* L20: */ } if (iseed[4] % 2 != 1) { ++iseed[4]; }/* 2) Set up diagonal of A Compute D according to COND and MODE */ zlatm1_(mode, cond, &irsign, &idist, &iseed[1], &d[1], n, &iinfo); if (iinfo != 0) { *info = 1; return 0; } if (*mode != 0 && abs(*mode) != 6) {/* Scale by DMAX */ temp = z_abs(&d[1]); i__1 = *n; for (i = 2; i <= i__1; ++i) {/* Computing MAX */ d__1 = temp, d__2 = z_abs(&d[i]); temp = max(d__1,d__2);/* L30: */ } if (temp > 0.) { z__1.r = dmax__->r / temp, z__1.i = dmax__->i / temp; alpha.r = z__1.r, alpha.i = z__1.i; } else { *info = 2; return 0; } zscal_(n, &alpha, &d[1], &c__1); } zlaset_("Full", n, n, &c_b1, &c_b1, &a[a_offset], lda); i__1 = *lda + 1; zcopy_(n, &d[1], &c__1, &a[a_offset], &i__1);/* 3) If UPPER='T', set upper triangle of A to random numbers. */ if (iupper != 0) { i__1 = *n; for (jc = 2; jc <= i__1; ++jc) { i__2 = jc - 1; zlarnv_(&idist, &iseed[1], &i__2, &a[jc * a_dim1 + 1]);/* L40: */ } }/* 4) If SIM='T', apply similarity transformation. -1 Transform is X A X , where X = U S V, thus it is U S V A V' (1/S) U' */ if (isim != 0) {/* Compute S (singular values of the eigenvector matrix) according to CONDS and MODES */ dlatm1_(modes, conds, &c__0, &c__0, &iseed[1], &ds[1], n, &iinfo); if (iinfo != 0) { *info = 3; return 0; }/* Multiply by V and V' */ zlarge_(n, &a[a_offset], lda, &iseed[1], &work[1], &iinfo); if (iinfo != 0) { *info = 4; return 0; }/* Multiply by S and (1/S) */ i__1 = *n; for (j = 1; j <= i__1; ++j) { zdscal_(n, &ds[j], &a[j + a_dim1], lda); if (ds[j] != 0.) { d__1 = 1. / ds[j]; zdscal_(n, &d__1, &a[j * a_dim1 + 1], &c__1); } else { *info = 5; return 0; }/* L50: */ }/* Multiply by U and U' */ zlarge_(n, &a[a_offset], lda, &iseed[1], &work[1], &iinfo); if (iinfo != 0) { *info = 4; return 0; } }/* 5) Reduce the bandwidth. */ if (*kl < *n - 1) {/* Reduce bandwidth -- kill column */ i__1 = *n - 1; for (jcr = *kl + 1; jcr <= i__1; ++jcr) { ic = jcr - *kl; irows = *n + 1 - jcr; icols = *n + *kl - jcr; zcopy_(&irows, &a[jcr + ic * a_dim1], &c__1, &work[1], &c__1); xnorms.r = work[1].r, xnorms.i = work[1].i; zlarfg_(&irows, &xnorms, &work[2], &c__1, &tau); d_cnjg(&z__1, &tau); tau.r = z__1.r, tau.i = z__1.i; work[1].r = 1., work[1].i = 0.; zlarnd_(&z__1, &c__5, &iseed[1]); alpha.r = z__1.r, alpha.i = z__1.i; zgemv_("C", &irows, &icols, &c_b2, &a[jcr + (ic + 1) * a_dim1], lda, &work[1], &c__1, &c_b1, &work[irows + 1], &c__1); z__1.r = -tau.r, z__1.i = -tau.i; zgerc_(&irows, &icols, &z__1, &work[1], &c__1, &work[irows + 1], & c__1, &a[jcr + (ic + 1) * a_dim1], lda); zgemv_("N", n, &irows, &c_b2, &a[jcr * a_dim1 + 1], lda, &work[1], &c__1, &c_b1, &work[irows + 1], &c__1); d_cnjg(&z__2, &tau); z__1.r = -z__2.r, z__1.i = -z__2.i; zgerc_(n, &irows, &z__1, &work[irows + 1], &c__1, &work[1], &c__1, &a[jcr * a_dim1 + 1], lda); i__2 = jcr + ic * a_dim1; a[i__2].r = xnorms.r, a[i__2].i = xnorms.i; i__2 = irows - 1; zlaset_("Full", &i__2, &c__1, &c_b1, &c_b1, &a[jcr + 1 + ic * a_dim1], lda); i__2 = icols + 1; zscal_(&i__2, &alpha, &a[jcr + ic * a_dim1], lda); d_cnjg(&z__1, &alpha); zscal_(n, &z__1, &a[jcr * a_dim1 + 1], &c__1);/* L60: */ } } else if (*ku < *n - 1) {/* Reduce upper bandwidth -- kill a row at a time. */ i__1 = *n - 1; for (jcr = *ku + 1; jcr <= i__1; ++jcr) { ir = jcr - *ku; irows = *n + *ku - jcr; icols = *n + 1 - jcr; zcopy_(&icols, &a[ir + jcr * a_dim1], lda, &work[1], &c__1); xnorms.r = work[1].r, xnorms.i = work[1].i; zlarfg_(&icols, &xnorms, &work[2], &c__1, &tau); d_cnjg(&z__1, &tau); tau.r = z__1.r, tau.i = z__1.i; work[1].r = 1., work[1].i = 0.; i__2 = icols - 1; zlacgv_(&i__2, &work[2], &c__1); zlarnd_(&z__1, &c__5, &iseed[1]); alpha.r = z__1.r, alpha.i = z__1.i; zgemv_("N", &irows, &icols, &c_b2, &a[ir + 1 + jcr * a_dim1], lda, &work[1], &c__1, &c_b1, &work[icols + 1], &c__1); z__1.r = -tau.r, z__1.i = -tau.i; zgerc_(&irows, &icols, &z__1, &work[icols + 1], &c__1, &work[1], & c__1, &a[ir + 1 + jcr * a_dim1], lda); zgemv_("C", &icols, n, &c_b2, &a[jcr + a_dim1], lda, &work[1], & c__1, &c_b1, &work[icols + 1], &c__1); d_cnjg(&z__2, &tau); z__1.r = -z__2.r, z__1.i = -z__2.i; zgerc_(&icols, n, &z__1, &work[1], &c__1, &work[icols + 1], &c__1, &a[jcr + a_dim1], lda); i__2 = ir + jcr * a_dim1; a[i__2].r = xnorms.r, a[i__2].i = xnorms.i; i__2 = icols - 1; zlaset_("Full", &c__1, &i__2, &c_b1, &c_b1, &a[ir + (jcr + 1) * a_dim1], lda); i__2 = irows + 1; zscal_(&i__2, &alpha, &a[ir + jcr * a_dim1], &c__1); d_cnjg(&z__1, &alpha); zscal_(n, &z__1, &a[jcr + a_dim1], lda);/* L70: */ } }/* Scale the matrix to have norm ANORM */ if (*anorm >= 0.) { temp = zlange_("M", n, n, &a[a_offset], lda, tempa); if (temp > 0.) { ralpha = *anorm / temp; i__1 = *n; for (j = 1; j <= i__1; ++j) { zdscal_(n, &ralpha, &a[j * a_dim1 + 1], &c__1);/* L80: */ } } } return 0;/* End of ZLATME */} /* zlatme_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -