⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clatme.c

📁 SuperLU is a general purpose library for the direct solution of large, sparse, nonsymmetric systems
💻 C
📖 第 1 页 / 共 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.f) {		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.f) {	*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.f) {	*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_("CLATME", &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 */    clatm1_(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 = c_abs(&d[1]);	i__1 = *n;	for (i = 2; i <= i__1; ++i) {/* Computing MAX */	    r__1 = temp, r__2 = c_abs(&d[i]);	    temp = dmax(r__1,r__2);/* L30: */	}	if (temp > 0.f) {	    q__1.r = dmax__->r / temp, q__1.i = dmax__->i / temp;	    alpha.r = q__1.r, alpha.i = q__1.i;	} else {	    *info = 2;	    return 0;	}	cscal_(n, &alpha, &d[1], &c__1);    }    claset_("Full", n, n, &c_b1, &c_b1, &a[a_offset], lda);    i__1 = *lda + 1;    ccopy_(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;	    clarnv_(&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 */	slatm1_(modes, conds, &c__0, &c__0, &iseed[1], &ds[1], n, &iinfo);	if (iinfo != 0) {	    *info = 3;	    return 0;	}/*        Multiply by V and V' */	clarge_(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) {	    csscal_(n, &ds[j], &a[j + a_dim1], lda);	    if (ds[j] != 0.f) {		r__1 = 1.f / ds[j];		csscal_(n, &r__1, &a[j * a_dim1 + 1], &c__1);	    } else {		*info = 5;		return 0;	    }/* L50: */	}/*        Multiply by U and U' */	clarge_(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;	    ccopy_(&irows, &a[jcr + ic * a_dim1], &c__1, &work[1], &c__1);	    xnorms.r = work[1].r, xnorms.i = work[1].i;	    clarfg_(&irows, &xnorms, &work[2], &c__1, &tau);	    r_cnjg(&q__1, &tau);	    tau.r = q__1.r, tau.i = q__1.i;	    work[1].r = 1.f, work[1].i = 0.f;	    clarnd_(&q__1, &c__5, &iseed[1]);	    alpha.r = q__1.r, alpha.i = q__1.i;	    cgemv_("C", &irows, &icols, &c_b2, &a[jcr + (ic + 1) * a_dim1], 		    lda, &work[1], &c__1, &c_b1, &work[irows + 1], &c__1);	    q__1.r = -(doublereal)tau.r, q__1.i = -(doublereal)tau.i;	    cgerc_(&irows, &icols, &q__1, &work[1], &c__1, &work[irows + 1], &		    c__1, &a[jcr + (ic + 1) * a_dim1], lda);	    cgemv_("N", n, &irows, &c_b2, &a[jcr * a_dim1 + 1], lda, &work[1],		     &c__1, &c_b1, &work[irows + 1], &c__1);	    r_cnjg(&q__2, &tau);	    q__1.r = -(doublereal)q__2.r, q__1.i = -(doublereal)q__2.i;	    cgerc_(n, &irows, &q__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;	    claset_("Full", &i__2, &c__1, &c_b1, &c_b1, &a[jcr + 1 + ic * 		    a_dim1], lda);	    i__2 = icols + 1;	    cscal_(&i__2, &alpha, &a[jcr + ic * a_dim1], lda);	    r_cnjg(&q__1, &alpha);	    cscal_(n, &q__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;	    ccopy_(&icols, &a[ir + jcr * a_dim1], lda, &work[1], &c__1);	    xnorms.r = work[1].r, xnorms.i = work[1].i;	    clarfg_(&icols, &xnorms, &work[2], &c__1, &tau);	    r_cnjg(&q__1, &tau);	    tau.r = q__1.r, tau.i = q__1.i;	    work[1].r = 1.f, work[1].i = 0.f;	    i__2 = icols - 1;	    clacgv_(&i__2, &work[2], &c__1);	    clarnd_(&q__1, &c__5, &iseed[1]);	    alpha.r = q__1.r, alpha.i = q__1.i;	    cgemv_("N", &irows, &icols, &c_b2, &a[ir + 1 + jcr * a_dim1], lda,		     &work[1], &c__1, &c_b1, &work[icols + 1], &c__1);	    q__1.r = -(doublereal)tau.r, q__1.i = -(doublereal)tau.i;	    cgerc_(&irows, &icols, &q__1, &work[icols + 1], &c__1, &work[1], &		    c__1, &a[ir + 1 + jcr * a_dim1], lda);	    cgemv_("C", &icols, n, &c_b2, &a[jcr + a_dim1], lda, &work[1], &		    c__1, &c_b1, &work[icols + 1], &c__1);	    r_cnjg(&q__2, &tau);	    q__1.r = -(doublereal)q__2.r, q__1.i = -(doublereal)q__2.i;	    cgerc_(&icols, n, &q__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;	    claset_("Full", &c__1, &i__2, &c_b1, &c_b1, &a[ir + (jcr + 1) * 		    a_dim1], lda);	    i__2 = irows + 1;	    cscal_(&i__2, &alpha, &a[ir + jcr * a_dim1], &c__1);	    r_cnjg(&q__1, &alpha);	    cscal_(n, &q__1, &a[jcr + a_dim1], lda);/* L70: */	}    }/*     Scale the matrix to have norm ANORM */    if (*anorm >= 0.f) {	temp = clange_("M", n, n, &a[a_offset], lda, tempa);	if (temp > 0.f) {	    ralpha = *anorm / temp;	    i__1 = *n;	    for (j = 1; j <= i__1; ++j) {		csscal_(n, &ralpha, &a[j * a_dim1 + 1], &c__1);/* L80: */	    }	}    }    return 0;/*     End of CLATME */} /* clatme_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -