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

📄 slatmr.c

📁 SuperLU is a general purpose library for the direct solution of large, sparse, nonsymmetric systems
💻 C
📖 第 1 页 / 共 3 页
字号:
    =====================================================================          1)      Decode and Test the input parameters.                  Initialize flags & seed.          Parameter adjustments */    --iseed;    --d;    --dl;    --dr;    --ipivot;    a_dim1 = *lda;    a_offset = a_dim1 + 1;    a -= a_offset;    --iwork;    /* Function Body */    *info = 0;/*     Quick return if possible */    if (*m == 0 || *n == 0) {	return 0;    }/*     Decode DIST */    if (lsame_(dist, "U")) {	idist = 1;    } else if (lsame_(dist, "S")) {	idist = 2;    } else if (lsame_(dist, "N")) {	idist = 3;    } else {	idist = -1;    }/*     Decode SYM */    if (lsame_(sym, "S")) {	isym = 0;    } else if (lsame_(sym, "N")) {	isym = 1;    } else if (lsame_(sym, "H")) {	isym = 0;    } else {	isym = -1;    }/*     Decode RSIGN */    if (lsame_(rsign, "F")) {	irsign = 0;    } else if (lsame_(rsign, "T")) {	irsign = 1;    } else {	irsign = -1;    }/*     Decode PIVTNG */    if (lsame_(pivtng, "N")) {	ipvtng = 0;    } else if (lsame_(pivtng, " ")) {	ipvtng = 0;    } else if (lsame_(pivtng, "L")) {	ipvtng = 1;	npvts = *m;    } else if (lsame_(pivtng, "R")) {	ipvtng = 2;	npvts = *n;    } else if (lsame_(pivtng, "B")) {	ipvtng = 3;	npvts = min(*n,*m);    } else if (lsame_(pivtng, "F")) {	ipvtng = 3;	npvts = min(*n,*m);    } else {	ipvtng = -1;    }/*     Decode GRADE */    if (lsame_(grade, "N")) {	igrade = 0;    } else if (lsame_(grade, "L")) {	igrade = 1;    } else if (lsame_(grade, "R")) {	igrade = 2;    } else if (lsame_(grade, "B")) {	igrade = 3;    } else if (lsame_(grade, "E")) {	igrade = 4;    } else if (lsame_(grade, "H") || lsame_(grade, "S")) {	igrade = 5;    } else {	igrade = -1;    }/*     Decode PACK */    if (lsame_(pack, "N")) {	ipack = 0;    } else if (lsame_(pack, "U")) {	ipack = 1;    } else if (lsame_(pack, "L")) {	ipack = 2;    } else if (lsame_(pack, "C")) {	ipack = 3;    } else if (lsame_(pack, "R")) {	ipack = 4;    } else if (lsame_(pack, "B")) {	ipack = 5;    } else if (lsame_(pack, "Q")) {	ipack = 6;    } else if (lsame_(pack, "Z")) {	ipack = 7;    } else {	ipack = -1;    }/*     Set certain internal parameters */    mnmin = min(*m,*n);/* Computing MIN */    i__1 = *kl, i__2 = *m - 1;    kll = min(i__1,i__2);/* Computing MIN */    i__1 = *ku, i__2 = *n - 1;    kuu = min(i__1,i__2);/*     If inv(DL) is used, check to see if DL has a zero entry. */    dzero = FALSE_;    if (igrade == 4 && *model == 0) {	i__1 = *m;	for (i = 1; i <= i__1; ++i) {	    if (dl[i] == 0.f) {		dzero = TRUE_;	    }/* L10: */	}    }/*     Check values in IPIVOT */    badpvt = FALSE_;    if (ipvtng > 0) {	i__1 = npvts;	for (j = 1; j <= i__1; ++j) {	    if (ipivot[j] <= 0 || ipivot[j] > npvts) {		badpvt = TRUE_;	    }/* L20: */	}    }/*     Set INFO if an error */    if (*m < 0) {	*info = -1;    } else if (*m != *n && isym == 0) {	*info = -1;    } else if (*n < 0) {	*info = -2;    } else if (idist == -1) {	*info = -3;    } else if (isym == -1) {	*info = -5;    } else if (*mode < -6 || *mode > 6) {	*info = -7;    } else if (*mode != -6 && *mode != 0 && *mode != 6 && *cond < 1.f) {	*info = -8;    } else if (*mode != -6 && *mode != 0 && *mode != 6 && irsign == -1) {	*info = -10;    } else if (igrade == -1 || igrade == 4 && *m != *n || igrade >= 1 && 	    igrade <= 4 && isym == 0) {	*info = -11;    } else if (igrade == 4 && dzero) {	*info = -12;    } else if ((igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5) && (	    *model < -6 || *model > 6)) {	*info = -13;    } else if ((igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5) && (	    *model != -6 && *model != 0 && *model != 6) && *condl < 1.f) {	*info = -14;    } else if ((igrade == 2 || igrade == 3) && (*moder < -6 || *moder > 6)) {	*info = -16;    } else if ((igrade == 2 || igrade == 3) && (*moder != -6 && *moder != 0 &&	     *moder != 6) && *condr < 1.f) {	*info = -17;    } else if (ipvtng == -1 || ipvtng == 3 && *m != *n || (ipvtng == 1 || 	    ipvtng == 2) && isym == 0) {	*info = -18;    } else if (ipvtng != 0 && badpvt) {	*info = -19;    } else if (*kl < 0) {	*info = -20;    } else if (*ku < 0 || isym == 0 && *kl != *ku) {	*info = -21;    } else if (*sparse < 0.f || *sparse > 1.f) {	*info = -22;    } else if (ipack == -1 || (ipack == 1 || ipack == 2 || ipack == 5 || 	    ipack == 6) && isym == 1 || ipack == 3 && isym == 1 && (*kl != 0 	    || *m != *n) || ipack == 4 && isym == 1 && (*ku != 0 || *m != *n))	     {	*info = -24;    } else if ((ipack == 0 || ipack == 1 || ipack == 2) && *lda < max(1,*m) ||	     (ipack == 3 || ipack == 4) && *lda < 1 || (ipack == 5 || ipack ==	     6) && *lda < kuu + 1 || ipack == 7 && *lda < kll + kuu + 1) {	*info = -26;    }    if (*info != 0) {	i__1 = -(*info);	xerbla_("SLATMR", &i__1);	return 0;    }/*     Decide if we can pivot consistently */    fulbnd = FALSE_;    if (kuu == *n - 1 && kll == *m - 1) {	fulbnd = TRUE_;    }/*     Initialize random number generator */    for (i = 1; i <= 4; ++i) {	iseed[i] = (i__1 = iseed[i], abs(i__1)) % 4096;/* L30: */    }    iseed[4] = (iseed[4] / 2 << 1) + 1;/*     2)      Set up D, DL, and DR, if indicated.                  Compute D according to COND and MODE */    slatm1_(mode, cond, &irsign, &idist, &iseed[1], &d[1], &mnmin, info);    if (*info != 0) {	*info = 1;	return 0;    }    if (*mode != 0 && *mode != -6 && *mode != 6) {/*        Scale by DMAX */	temp = dabs(d[1]);	i__1 = mnmin;	for (i = 2; i <= i__1; ++i) {/* Computing MAX */	    r__2 = temp, r__3 = (r__1 = d[i], dabs(r__1));	    temp = dmax(r__2,r__3);/* L40: */	}	if (temp == 0.f && *dmax__ != 0.f) {	    *info = 2;	    return 0;	}	if (temp != 0.f) {	    alpha = *dmax__ / temp;	} else {	    alpha = 1.f;	}	i__1 = mnmin;	for (i = 1; i <= i__1; ++i) {	    d[i] = alpha * d[i];/* L50: */	}    }/*     Compute DL if grading set */    if (igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5) {	slatm1_(model, condl, &c__0, &idist, &iseed[1], &dl[1], m, info);	if (*info != 0) {	    *info = 3;	    return 0;	}    }/*     Compute DR if grading set */    if (igrade == 2 || igrade == 3) {	slatm1_(moder, condr, &c__0, &idist, &iseed[1], &dr[1], n, info);	if (*info != 0) {	    *info = 4;	    return 0;	}    }/*     3)     Generate IWORK if pivoting */    if (ipvtng > 0) {	i__1 = npvts;	for (i = 1; i <= i__1; ++i) {	    iwork[i] = i;/* L60: */	}	if (fulbnd) {	    i__1 = npvts;	    for (i = 1; i <= i__1; ++i) {		k = ipivot[i];		j = iwork[i];		iwork[i] = iwork[k];		iwork[k] = j;/* L70: */	    }	} else {	    for (i = npvts; i >= 1; --i) {		k = ipivot[i];		j = iwork[i];		iwork[i] = iwork[k];		iwork[k] = j;/* L80: */	    }	}    }/*     4)      Generate matrices for each kind of PACKing                  Always sweep matrix columnwise (if symmetric, upper                  half only) so that matrix generated does not depend                  on PACK */    if (fulbnd) {/*        Use SLATM3 so matrices generated with differing PIVOTing only             differ only in the order of their rows and/or columns. */	if (ipack == 0) {	    if (isym == 0) {		i__1 = *n;		for (j = 1; j <= i__1; ++j) {		    i__2 = j;		    for (i = 1; i <= i__2; ++i) {			temp = slatm3_(m, n, &i, &j, &isub, &jsub, kl, ku, &				idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[				1], &ipvtng, &iwork[1], sparse);			a[isub + jsub * a_dim1] = temp;			a[jsub + isub * a_dim1] = temp;/* L90: */		    }/* L100: */		}	    } else if (isym == 1) {		i__1 = *n;		for (j = 1; j <= i__1; ++j) {		    i__2 = *m;		    for (i = 1; i <= i__2; ++i) {			temp = slatm3_(m, n, &i, &j, &isub, &jsub, kl, ku, &				idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[				1], &ipvtng, &iwork[1], sparse);			a[isub + jsub * a_dim1] = temp;/* L110: */		    }/* L120: */		}	    }	} else if (ipack == 1) {	    i__1 = *n;	    for (j = 1; j <= i__1; ++j) {		i__2 = j;		for (i = 1; i <= i__2; ++i) {		    temp = slatm3_(m, n, &i, &j, &isub, &jsub, kl, ku, &idist,			     &iseed[1], &d[1], &igrade, &dl[1], &dr[1], &			    ipvtng, &iwork[1], sparse);		    mnsub = min(isub,jsub);		    mxsub = max(isub,jsub);		    a[mnsub + mxsub * a_dim1] = temp;		    if (mnsub != mxsub) {			a[mxsub + mnsub * a_dim1] = 0.f;		    }/* L130: */		}/* L140: */	    }	} else if (ipack == 2) {	    i__1 = *n;	    for (j = 1; j <= i__1; ++j) {		i__2 = j;		for (i = 1; i <= i__2; ++i) {		    temp = slatm3_(m, n, &i, &j, &isub, &jsub, kl, ku, &idist,			     &iseed[1], &d[1], &igrade, &dl[1], &dr[1], &			    ipvtng, &iwork[1], sparse);		    mnsub = min(isub,jsub);		    mxsub = max(isub,jsub);		    a[mxsub + mnsub * a_dim1] = temp;		    if (mnsub != mxsub) {			a[mnsub + mxsub * a_dim1] = 0.f;		    }/* L150: */		}/* L160: */	    }	} else if (ipack == 3) {	    i__1 = *n;	    for (j = 1; j <= i__1; ++j) {		i__2 = j;		for (i = 1; i <= i__2; ++i) {		    temp = slatm3_(m, n, &i, &j, &isub, &jsub, kl, ku, &idist,			     &iseed[1], &d[1], &igrade, &dl[1], &dr[1], &			    ipvtng, &iwork[1], sparse);/*                 Compute K = location of (ISUB,JSUB) entry in packed                      array */		    mnsub = min(isub,jsub);		    mxsub = max(isub,jsub);		    k = mxsub * (mxsub - 1) / 2 + mnsub;/*                 Convert K to (IISUB,JJSUB) location */		    jjsub = (k - 1) / *lda + 1;		    iisub = k - *lda * (jjsub - 1);		    a[iisub + jjsub * a_dim1] = temp;/* L170: */

⌨️ 快捷键说明

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