📄 zlatmr.c
字号:
storage schemes can be obtained: GB - use 'Z' PB, HB or TB - use 'B' or 'Q' PP, HP or TP - use 'C' or 'R' If two calls to ZLATMR differ only in the PACK parameter, they will generate mathematically equivalent matrices. Not modified. A - COMPLEX*16 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 ZLATM1 (computing D) 2 => Cannot scale diagonal to DMAX (max. entry is 0) 3 => Error return from ZLATM1 (computing DL) 4 => Error return from ZLATM1 (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. && dl[i__2].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 || 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.) { *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.) { *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 || 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. || *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_("ZLATMR", &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 */ zlatm1_(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 = z_abs(&d[1]); i__1 = mnmin; for (i = 2; i <= i__1; ++i) {/* Computing MAX */ d__1 = temp, d__2 = z_abs(&d[i]); temp = max(d__1,d__2);/* L40: */ } if (temp == 0. && (dmax__->r != 0. || dmax__->i != 0.)) { *info = 2; return 0; } if (temp != 0.) { z__1.r = dmax__->r / temp, z__1.i = dmax__->i / temp; calpha.r = z__1.r, calpha.i = z__1.i; } else { calpha.r = 1., calpha.i = 0.; } i__1 = mnmin; for (i = 1; i <= i__1; ++i) { i__2 = i; i__3 = i; z__1.r = calpha.r * d[i__3].r - calpha.i * d[i__3].i, z__1.i = calpha.r * d[i__3].i + calpha.i * d[i__3].r; d[i__2].r = z__1.r, d[i__2].i = z__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.;/* L60: */ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -