📄 dlatmr.c
字号:
===================================================================== 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.) { 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.) { *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.) { *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.) { *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. || *sparse > 1.) { *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_("DLATMR", &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 */ dlatm1_(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 = abs(d[1]); i__1 = mnmin; for (i = 2; i <= i__1; ++i) {/* Computing MAX */ d__2 = temp, d__3 = (d__1 = d[i], abs(d__1)); temp = max(d__2,d__3);/* L40: */ } if (temp == 0. && *dmax__ != 0.) { *info = 2; return 0; } if (temp != 0.) { alpha = *dmax__ / temp; } else { alpha = 1.; } 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) { dlatm1_(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) { dlatm1_(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 DLATM3 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 = dlatm3_(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 = dlatm3_(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 = dlatm3_(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.; }/* 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 = dlatm3_(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.; }/* 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 = dlatm3_(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 + -