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

📄 clatmr.c

📁 SuperLU is a general purpose library for the direct solution of large, sparse, nonsymmetric systems
💻 C
📖 第 1 页 / 共 4 页
字号:
             PP, HP or TP     - use 'C' or 'R'                If two calls to CLATMR differ only in the PACK parameter,                they will generate mathematically equivalent matrices.                Not modified.       A      - COMPLEX array, dimension (LDA,N)                On exit A is the desired test matrix. Only those                entries of A which are significant on output                will be referenced (even if A is in packed or band                storage format). The 'unoccupied corners' of A in                band format will be zeroed out.       LDA    - INTEGER                on entry LDA specifies the first dimension of A as                declared in the calling program.                If PACK='N', 'U' or 'L', LDA must be at least max ( 1, M ).                If PACK='C' or 'R', LDA must be at least 1.                If PACK='B', or 'Q', LDA must be MIN ( KU+1, N )                If PACK='Z', LDA must be at least KUU+KLL+1, where                KUU = MIN ( KU, N-1 ) and KLL = MIN ( KL, N-1 )                Not modified.       IWORK  - INTEGER array, dimension (N or M)                Workspace. Not referenced if PIVTNG = 'N'. Changed on exit.       INFO   - INTEGER                Error parameter on exit:                  0 => normal return                 -1 => M negative or unequal to N and SYM='S' or 'H'                 -2 => N negative                 -3 => DIST illegal string                 -5 => SYM illegal string                 -7 => MODE not in range -6 to 6                 -8 => COND less than 1.0, and MODE neither -6, 0 nor 6                -10 => MODE neither -6, 0 nor 6 and RSIGN illegal string                -11 => GRADE illegal string, or GRADE='E' and                       M not equal to N, or GRADE='L', 'R', 'B', 'S' or 'E'                       and SYM = 'H', or GRADE='L', 'R', 'B', 'H' or 'E'                       and SYM = 'S'                -12 => GRADE = 'E' and DL contains zero                -13 => MODEL not in range -6 to 6 and GRADE= 'L', 'B', 'H',                       'S' or 'E'                -14 => CONDL less than 1.0, GRADE='L', 'B', 'H', 'S' or 'E',                       and MODEL neither -6, 0 nor 6                -16 => MODER not in range -6 to 6 and GRADE= 'R' or 'B'                -17 => CONDR less than 1.0, GRADE='R' or 'B', and                       MODER neither -6, 0 nor 6                -18 => PIVTNG illegal string, or PIVTNG='B' or 'F' and                       M not equal to N, or PIVTNG='L' or 'R' and SYM='S'                       or 'H'                -19 => IPIVOT contains out of range number and                       PIVTNG not equal to 'N'                -20 => KL negative                -21 => KU negative, or SYM='S' or 'H' and KU not equal to KL                -22 => SPARSE not in range 0. to 1.                -24 => PACK illegal string, or PACK='U', 'L', 'B' or 'Q'                       and SYM='N', or PACK='C' and SYM='N' and either KL                       not equal to 0 or N not equal to M, or PACK='R' and                       SYM='N', and either KU not equal to 0 or N not equal                       to M                -26 => LDA too small                  1 => Error return from CLATM1 (computing D)                  2 => Cannot scale diagonal to DMAX (max. entry is 0)                  3 => Error return from CLATM1 (computing DL)                  4 => Error return from CLATM1 (computing DR)                  5 => ANORM is positive, but matrix constructed prior to                       attempting to scale it to have norm ANORM, is zero       =====================================================================          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 if (lsame_(dist, "D")) {	idist = 4;    } else {	idist = -1;    }/*     Decode SYM */    if (lsame_(sym, "H")) {	isym = 0;    } else if (lsame_(sym, "N")) {	isym = 1;    } else if (lsame_(sym, "S")) {	isym = 2;    } 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")) {	igrade = 5;    } else if (lsame_(grade, "S")) {	igrade = 6;    } 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) {	    i__2 = i;	    if (dl[i__2].r == 0.f && dl[i__2].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 || isym == 2)) {	*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 == 2 || igrade == 3 || igrade == 4 || igrade == 6) && isym 	    == 0 || (igrade == 1 || igrade == 2 || igrade == 3 || igrade == 4 	    || igrade == 5) && isym == 2) {	*info = -11;    } else if (igrade == 4 && dzero) {	*info = -12;    } else if ((igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5 || 	    igrade == 6) && (*model < -6 || *model > 6)) {	*info = -13;    } else if ((igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5 || 	    igrade == 6) && (*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 || isym == 2)) {	*info = -18;    } else if (ipvtng != 0 && badpvt) {	*info = -19;    } else if (*kl < 0) {	*info = -20;    } else if (*ku < 0 || (isym == 0 || isym == 2) && *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_("CLATMR", &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 */    clatm1_(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 = c_abs(&d[1]);	i__1 = mnmin;	for (i = 2; i <= i__1; ++i) {/* Computing MAX */	    r__1 = temp, r__2 = c_abs(&d[i]);	    temp = dmax(r__1,r__2);/* L40: */	}	if (temp == 0.f && (dmax__->r != 0.f || dmax__->i != 0.f)) {	    *info = 2;	    return 0;	}	if (temp != 0.f) {	    q__1.r = dmax__->r / temp, q__1.i = dmax__->i / temp;	    calpha.r = q__1.r, calpha.i = q__1.i;	} else {	    calpha.r = 1.f, calpha.i = 0.f;	}	i__1 = mnmin;	for (i = 1; i <= i__1; ++i) {	    i__2 = i;	    i__3 = i;	    q__1.r = calpha.r * d[i__3].r - calpha.i * d[i__3].i, q__1.i = 		    calpha.r * d[i__3].i + calpha.i * d[i__3].r;	    d[i__2].r = q__1.r, d[i__2].i = q__1.i;/* L50: */	}    }/*     If matrix Hermitian, make D real */    if (isym == 0) {	i__1 = mnmin;	for (i = 1; i <= i__1; ++i) {	    i__2 = i;	    i__3 = i;	    d__1 = d[i__3].r;	    d[i__2].r = d__1, d[i__2].i = 0.f;/* L60: */	}    }

⌨️ 快捷键说明

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