annotate main/sparse/SuperLU/SRC/dlaqgs.c @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 * -- SuperLU routine (version 2.0) --
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 * Univ. of California Berkeley, Xerox Palo Alto Research Center,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 * and Lawrence Berkeley National Lab.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 * November 15, 1997
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 * File name: dlaqgs.c
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 * History: Modified from LAPACK routine DLAQGE
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 #include <math.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 #include "dsp_defs.h"
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16 #include "util.h"
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 void
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 dlaqgs(SuperMatrix *A, double *r, double *c,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 double rowcnd, double colcnd, double amax, char *equed)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 Purpose
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 =======
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 DLAQGS equilibrates a general sparse M by N matrix A using the row and
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 scaling factors in the vectors R and C.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 See supermatrix.h for the definition of 'SuperMatrix' structure.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 Arguments
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 =========
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 A (input/output) SuperMatrix*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 On exit, the equilibrated matrix. See EQUED for the form of
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 the equilibrated matrix. The type of A can be:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 Stype = NC; Dtype = _D; Mtype = GE.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 R (input) double*, dimension (A->nrow)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 The row scale factors for A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 C (input) double*, dimension (A->ncol)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 The column scale factors for A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 ROWCND (input) double
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 Ratio of the smallest R(i) to the largest R(i).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 COLCND (input) double
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 Ratio of the smallest C(i) to the largest C(i).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 AMAX (input) double
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 Absolute value of largest matrix entry.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 EQUED (output) char*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 Specifies the form of equilibration that was done.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 = 'N': No equilibration
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 = 'R': Row equilibration, i.e., A has been premultiplied by
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 diag(R).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 = 'C': Column equilibration, i.e., A has been postmultiplied
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 by diag(C).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 = 'B': Both row and column equilibration, i.e., A has been
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 replaced by diag(R) * A * diag(C).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 Internal Parameters
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 ===================
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 THRESH is a threshold value used to decide if row or column scaling
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 should be done based on the ratio of the row or column scaling
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 factors. If ROWCND < THRESH, row scaling is done, and if
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 COLCND < THRESH, column scaling is done.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 LARGE and SMALL are threshold values used to decide if row scaling
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 should be done based on the absolute size of the largest matrix
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 element. If AMAX > LARGE or AMAX < SMALL, row scaling is done.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 =====================================================================
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 #define THRESH (0.1)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 /* Local variables */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 NCformat *Astore;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 double *Aval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 int i, j, irow;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 double large, small, cj;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 extern double dlamch_(char *);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 /* Quick return if possible */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 if (A->nrow <= 0 || A->ncol <= 0) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 *(unsigned char *)equed = 'N';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 return;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 Astore = A->Store;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 Aval = Astore->nzval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 /* Initialize LARGE and SMALL. */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99 small = dlamch_("Safe minimum") / dlamch_("Precision");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 large = 1. / small;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 if (rowcnd >= THRESH && amax >= small && amax <= large) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103 if (colcnd >= THRESH)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 *(unsigned char *)equed = 'N';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 /* Column scaling */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107 for (j = 0; j < A->ncol; ++j) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108 cj = c[j];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109 for (i = Astore->colptr[j]; i < Astore->colptr[j+1]; ++i) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110 Aval[i] *= cj;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113 *(unsigned char *)equed = 'C';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 } else if (colcnd >= THRESH) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116 /* Row scaling, no column scaling */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 for (j = 0; j < A->ncol; ++j)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118 for (i = Astore->colptr[j]; i < Astore->colptr[j+1]; ++i) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119 irow = Astore->rowind[i];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120 Aval[i] *= r[irow];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122 *(unsigned char *)equed = 'R';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123 } else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124 /* Row and column scaling */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125 for (j = 0; j < A->ncol; ++j) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 cj = c[j];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127 for (i = Astore->colptr[j]; i < Astore->colptr[j+1]; ++i) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 irow = Astore->rowind[i];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129 Aval[i] *= cj * r[irow];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132 *(unsigned char *)equed = 'B';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135 return;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 } /* dlaqgs */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138