annotate libcruft/lapack/dlatrs.f @ 4329:d53c33d93440

[project @ 2003-02-18 20:00:48 by jwe]
author jwe
date Tue, 18 Feb 2003 20:08:20 +0000
parents
children 68db500cb558
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
1 SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
2 $ CNORM, INFO )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
3 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
4 * -- LAPACK auxiliary routine (version 3.0) --
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
5 * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
6 * Courant Institute, Argonne National Lab, and Rice University
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
7 * June 30, 1992
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
8 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
9 * .. Scalar Arguments ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
10 CHARACTER DIAG, NORMIN, TRANS, UPLO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
11 INTEGER INFO, LDA, N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
12 DOUBLE PRECISION SCALE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
13 * ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
14 * .. Array Arguments ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
15 DOUBLE PRECISION A( LDA, * ), CNORM( * ), X( * )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
16 * ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
17 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
18 * Purpose
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
19 * =======
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
20 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
21 * DLATRS solves one of the triangular systems
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
22 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
23 * A *x = s*b or A'*x = s*b
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
24 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
25 * with scaling to prevent overflow. Here A is an upper or lower
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
26 * triangular matrix, A' denotes the transpose of A, x and b are
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
27 * n-element vectors, and s is a scaling factor, usually less than
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
28 * or equal to 1, chosen so that the components of x will be less than
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
29 * the overflow threshold. If the unscaled problem will not cause
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
30 * overflow, the Level 2 BLAS routine DTRSV is called. If the matrix A
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
31 * is singular (A(j,j) = 0 for some j), then s is set to 0 and a
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
32 * non-trivial solution to A*x = 0 is returned.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
33 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
34 * Arguments
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
35 * =========
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
36 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
37 * UPLO (input) CHARACTER*1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
38 * Specifies whether the matrix A is upper or lower triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
39 * = 'U': Upper triangular
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
40 * = 'L': Lower triangular
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
41 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
42 * TRANS (input) CHARACTER*1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
43 * Specifies the operation applied to A.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
44 * = 'N': Solve A * x = s*b (No transpose)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
45 * = 'T': Solve A'* x = s*b (Transpose)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
46 * = 'C': Solve A'* x = s*b (Conjugate transpose = Transpose)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
47 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
48 * DIAG (input) CHARACTER*1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
49 * Specifies whether or not the matrix A is unit triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
50 * = 'N': Non-unit triangular
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
51 * = 'U': Unit triangular
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
52 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
53 * NORMIN (input) CHARACTER*1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
54 * Specifies whether CNORM has been set or not.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
55 * = 'Y': CNORM contains the column norms on entry
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
56 * = 'N': CNORM is not set on entry. On exit, the norms will
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
57 * be computed and stored in CNORM.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
58 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
59 * N (input) INTEGER
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
60 * The order of the matrix A. N >= 0.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
61 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
62 * A (input) DOUBLE PRECISION array, dimension (LDA,N)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
63 * The triangular matrix A. If UPLO = 'U', the leading n by n
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
64 * upper triangular part of the array A contains the upper
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
65 * triangular matrix, and the strictly lower triangular part of
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
66 * A is not referenced. If UPLO = 'L', the leading n by n lower
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
67 * triangular part of the array A contains the lower triangular
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
68 * matrix, and the strictly upper triangular part of A is not
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
69 * referenced. If DIAG = 'U', the diagonal elements of A are
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
70 * also not referenced and are assumed to be 1.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
71 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
72 * LDA (input) INTEGER
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
73 * The leading dimension of the array A. LDA >= max (1,N).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
74 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
75 * X (input/output) DOUBLE PRECISION array, dimension (N)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
76 * On entry, the right hand side b of the triangular system.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
77 * On exit, X is overwritten by the solution vector x.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
78 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
79 * SCALE (output) DOUBLE PRECISION
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
80 * The scaling factor s for the triangular system
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
81 * A * x = s*b or A'* x = s*b.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
82 * If SCALE = 0, the matrix A is singular or badly scaled, and
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
83 * the vector x is an exact or approximate solution to A*x = 0.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
84 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
85 * CNORM (input or output) DOUBLE PRECISION array, dimension (N)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
86 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
87 * If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
88 * contains the norm of the off-diagonal part of the j-th column
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
89 * of A. If TRANS = 'N', CNORM(j) must be greater than or equal
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
90 * to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
91 * must be greater than or equal to the 1-norm.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
92 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
93 * If NORMIN = 'N', CNORM is an output argument and CNORM(j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
94 * returns the 1-norm of the offdiagonal part of the j-th column
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
95 * of A.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
96 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
97 * INFO (output) INTEGER
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
98 * = 0: successful exit
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
99 * < 0: if INFO = -k, the k-th argument had an illegal value
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
100 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
101 * Further Details
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
102 * ======= =======
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
103 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
104 * A rough bound on x is computed; if that is less than overflow, DTRSV
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
105 * is called, otherwise, specific code is used which checks for possible
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
106 * overflow or divide-by-zero at every operation.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
107 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
108 * A columnwise scheme is used for solving A*x = b. The basic algorithm
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
109 * if A is lower triangular is
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
110 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
111 * x[1:n] := b[1:n]
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
112 * for j = 1, ..., n
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
113 * x(j) := x(j) / A(j,j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
114 * x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
115 * end
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
116 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
117 * Define bounds on the components of x after j iterations of the loop:
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
118 * M(j) = bound on x[1:j]
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
119 * G(j) = bound on x[j+1:n]
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
120 * Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
121 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
122 * Then for iteration j+1 we have
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
123 * M(j+1) <= G(j) / | A(j+1,j+1) |
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
124 * G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
125 * <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
126 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
127 * where CNORM(j+1) is greater than or equal to the infinity-norm of
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
128 * column j+1 of A, not counting the diagonal. Hence
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
129 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
130 * G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
131 * 1<=i<=j
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
132 * and
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
133 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
134 * |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
135 * 1<=i< j
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
136 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
137 * Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTRSV if the
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
138 * reciprocal of the largest M(j), j=1,..,n, is larger than
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
139 * max(underflow, 1/overflow).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
140 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
141 * The bound on x(j) is also used to determine when a step in the
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
142 * columnwise method can be performed without fear of overflow. If
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
143 * the computed bound is greater than a large constant, x is scaled to
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
144 * prevent overflow, but if the bound overflows, x is set to 0, x(j) to
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
145 * 1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
146 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
147 * Similarly, a row-wise scheme is used to solve A'*x = b. The basic
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
148 * algorithm for A upper triangular is
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
149 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
150 * for j = 1, ..., n
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
151 * x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
152 * end
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
153 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
154 * We simultaneously compute two bounds
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
155 * G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
156 * M(j) = bound on x(i), 1<=i<=j
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
157 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
158 * The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
159 * add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
160 * Then the bound on x(j) is
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
161 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
162 * M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
163 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
164 * <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
165 * 1<=i<=j
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
166 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
167 * and we can safely call DTRSV if 1/M(n) and 1/G(n) are both greater
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
168 * than max(underflow, 1/overflow).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
169 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
170 * =====================================================================
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
171 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
172 * .. Parameters ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
173 DOUBLE PRECISION ZERO, HALF, ONE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
174 PARAMETER ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
175 * ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
176 * .. Local Scalars ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
177 LOGICAL NOTRAN, NOUNIT, UPPER
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
178 INTEGER I, IMAX, J, JFIRST, JINC, JLAST
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
179 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
180 $ TMAX, TSCAL, USCAL, XBND, XJ, XMAX
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
181 * ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
182 * .. External Functions ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
183 LOGICAL LSAME
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
184 INTEGER IDAMAX
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
185 DOUBLE PRECISION DASUM, DDOT, DLAMCH
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
186 EXTERNAL LSAME, IDAMAX, DASUM, DDOT, DLAMCH
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
187 * ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
188 * .. External Subroutines ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
189 EXTERNAL DAXPY, DSCAL, DTRSV, XERBLA
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
190 * ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
191 * .. Intrinsic Functions ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
192 INTRINSIC ABS, MAX, MIN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
193 * ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
194 * .. Executable Statements ..
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
195 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
196 INFO = 0
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
197 UPPER = LSAME( UPLO, 'U' )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
198 NOTRAN = LSAME( TRANS, 'N' )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
199 NOUNIT = LSAME( DIAG, 'N' )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
200 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
201 * Test the input parameters.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
202 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
203 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
204 INFO = -1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
205 ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
206 $ LSAME( TRANS, 'C' ) ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
207 INFO = -2
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
208 ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
209 INFO = -3
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
210 ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
211 $ LSAME( NORMIN, 'N' ) ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
212 INFO = -4
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
213 ELSE IF( N.LT.0 ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
214 INFO = -5
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
215 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
216 INFO = -7
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
217 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
218 IF( INFO.NE.0 ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
219 CALL XERBLA( 'DLATRS', -INFO )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
220 RETURN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
221 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
222 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
223 * Quick return if possible
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
224 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
225 IF( N.EQ.0 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
226 $ RETURN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
227 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
228 * Determine machine dependent parameters to control overflow.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
229 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
230 SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
231 BIGNUM = ONE / SMLNUM
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
232 SCALE = ONE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
233 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
234 IF( LSAME( NORMIN, 'N' ) ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
235 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
236 * Compute the 1-norm of each column, not including the diagonal.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
237 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
238 IF( UPPER ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
239 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
240 * A is upper triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
241 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
242 DO 10 J = 1, N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
243 CNORM( J ) = DASUM( J-1, A( 1, J ), 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
244 10 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
245 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
246 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
247 * A is lower triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
248 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
249 DO 20 J = 1, N - 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
250 CNORM( J ) = DASUM( N-J, A( J+1, J ), 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
251 20 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
252 CNORM( N ) = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
253 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
254 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
255 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
256 * Scale the column norms by TSCAL if the maximum element in CNORM is
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
257 * greater than BIGNUM.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
258 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
259 IMAX = IDAMAX( N, CNORM, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
260 TMAX = CNORM( IMAX )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
261 IF( TMAX.LE.BIGNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
262 TSCAL = ONE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
263 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
264 TSCAL = ONE / ( SMLNUM*TMAX )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
265 CALL DSCAL( N, TSCAL, CNORM, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
266 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
267 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
268 * Compute a bound on the computed solution vector to see if the
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
269 * Level 2 BLAS routine DTRSV can be used.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
270 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
271 J = IDAMAX( N, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
272 XMAX = ABS( X( J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
273 XBND = XMAX
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
274 IF( NOTRAN ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
275 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
276 * Compute the growth in A * x = b.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
277 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
278 IF( UPPER ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
279 JFIRST = N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
280 JLAST = 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
281 JINC = -1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
282 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
283 JFIRST = 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
284 JLAST = N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
285 JINC = 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
286 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
287 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
288 IF( TSCAL.NE.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
289 GROW = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
290 GO TO 50
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
291 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
292 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
293 IF( NOUNIT ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
294 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
295 * A is non-unit triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
296 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
297 * Compute GROW = 1/G(j) and XBND = 1/M(j).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
298 * Initially, G(0) = max{x(i), i=1,...,n}.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
299 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
300 GROW = ONE / MAX( XBND, SMLNUM )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
301 XBND = GROW
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
302 DO 30 J = JFIRST, JLAST, JINC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
303 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
304 * Exit the loop if the growth factor is too small.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
305 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
306 IF( GROW.LE.SMLNUM )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
307 $ GO TO 50
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
308 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
309 * M(j) = G(j-1) / abs(A(j,j))
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
310 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
311 TJJ = ABS( A( J, J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
312 XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
313 IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
314 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
315 * G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
316 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
317 GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
318 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
319 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
320 * G(j) could overflow, set GROW to 0.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
321 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
322 GROW = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
323 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
324 30 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
325 GROW = XBND
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
326 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
327 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
328 * A is unit triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
329 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
330 * Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
331 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
332 GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
333 DO 40 J = JFIRST, JLAST, JINC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
334 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
335 * Exit the loop if the growth factor is too small.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
336 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
337 IF( GROW.LE.SMLNUM )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
338 $ GO TO 50
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
339 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
340 * G(j) = G(j-1)*( 1 + CNORM(j) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
341 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
342 GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
343 40 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
344 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
345 50 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
346 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
347 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
348 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
349 * Compute the growth in A' * x = b.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
350 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
351 IF( UPPER ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
352 JFIRST = 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
353 JLAST = N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
354 JINC = 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
355 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
356 JFIRST = N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
357 JLAST = 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
358 JINC = -1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
359 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
360 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
361 IF( TSCAL.NE.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
362 GROW = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
363 GO TO 80
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
364 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
365 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
366 IF( NOUNIT ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
367 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
368 * A is non-unit triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
369 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
370 * Compute GROW = 1/G(j) and XBND = 1/M(j).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
371 * Initially, M(0) = max{x(i), i=1,...,n}.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
372 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
373 GROW = ONE / MAX( XBND, SMLNUM )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
374 XBND = GROW
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
375 DO 60 J = JFIRST, JLAST, JINC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
376 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
377 * Exit the loop if the growth factor is too small.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
378 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
379 IF( GROW.LE.SMLNUM )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
380 $ GO TO 80
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
381 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
382 * G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
383 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
384 XJ = ONE + CNORM( J )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
385 GROW = MIN( GROW, XBND / XJ )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
386 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
387 * M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
388 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
389 TJJ = ABS( A( J, J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
390 IF( XJ.GT.TJJ )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
391 $ XBND = XBND*( TJJ / XJ )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
392 60 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
393 GROW = MIN( GROW, XBND )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
394 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
395 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
396 * A is unit triangular.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
397 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
398 * Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
399 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
400 GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
401 DO 70 J = JFIRST, JLAST, JINC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
402 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
403 * Exit the loop if the growth factor is too small.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
404 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
405 IF( GROW.LE.SMLNUM )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
406 $ GO TO 80
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
407 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
408 * G(j) = ( 1 + CNORM(j) )*G(j-1)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
409 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
410 XJ = ONE + CNORM( J )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
411 GROW = GROW / XJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
412 70 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
413 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
414 80 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
415 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
416 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
417 IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
418 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
419 * Use the Level 2 BLAS solve if the reciprocal of the bound on
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
420 * elements of X is not too small.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
421 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
422 CALL DTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
423 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
424 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
425 * Use a Level 1 BLAS solve, scaling intermediate results.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
426 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
427 IF( XMAX.GT.BIGNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
428 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
429 * Scale X so that its components are less than or equal to
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
430 * BIGNUM in absolute value.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
431 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
432 SCALE = BIGNUM / XMAX
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
433 CALL DSCAL( N, SCALE, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
434 XMAX = BIGNUM
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
435 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
436 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
437 IF( NOTRAN ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
438 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
439 * Solve A * x = b
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
440 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
441 DO 110 J = JFIRST, JLAST, JINC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
442 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
443 * Compute x(j) = b(j) / A(j,j), scaling x if necessary.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
444 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
445 XJ = ABS( X( J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
446 IF( NOUNIT ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
447 TJJS = A( J, J )*TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
448 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
449 TJJS = TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
450 IF( TSCAL.EQ.ONE )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
451 $ GO TO 100
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
452 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
453 TJJ = ABS( TJJS )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
454 IF( TJJ.GT.SMLNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
455 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
456 * abs(A(j,j)) > SMLNUM:
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
457 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
458 IF( TJJ.LT.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
459 IF( XJ.GT.TJJ*BIGNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
460 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
461 * Scale x by 1/b(j).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
462 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
463 REC = ONE / XJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
464 CALL DSCAL( N, REC, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
465 SCALE = SCALE*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
466 XMAX = XMAX*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
467 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
468 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
469 X( J ) = X( J ) / TJJS
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
470 XJ = ABS( X( J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
471 ELSE IF( TJJ.GT.ZERO ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
472 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
473 * 0 < abs(A(j,j)) <= SMLNUM:
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
474 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
475 IF( XJ.GT.TJJ*BIGNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
476 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
477 * Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
478 * to avoid overflow when dividing by A(j,j).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
479 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
480 REC = ( TJJ*BIGNUM ) / XJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
481 IF( CNORM( J ).GT.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
482 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
483 * Scale by 1/CNORM(j) to avoid overflow when
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
484 * multiplying x(j) times column j.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
485 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
486 REC = REC / CNORM( J )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
487 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
488 CALL DSCAL( N, REC, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
489 SCALE = SCALE*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
490 XMAX = XMAX*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
491 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
492 X( J ) = X( J ) / TJJS
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
493 XJ = ABS( X( J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
494 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
495 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
496 * A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
497 * scale = 0, and compute a solution to A*x = 0.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
498 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
499 DO 90 I = 1, N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
500 X( I ) = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
501 90 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
502 X( J ) = ONE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
503 XJ = ONE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
504 SCALE = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
505 XMAX = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
506 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
507 100 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
508 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
509 * Scale x if necessary to avoid overflow when adding a
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
510 * multiple of column j of A.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
511 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
512 IF( XJ.GT.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
513 REC = ONE / XJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
514 IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
515 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
516 * Scale x by 1/(2*abs(x(j))).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
517 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
518 REC = REC*HALF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
519 CALL DSCAL( N, REC, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
520 SCALE = SCALE*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
521 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
522 ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
523 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
524 * Scale x by 1/2.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
525 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
526 CALL DSCAL( N, HALF, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
527 SCALE = SCALE*HALF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
528 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
529 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
530 IF( UPPER ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
531 IF( J.GT.1 ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
532 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
533 * Compute the update
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
534 * x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
535 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
536 CALL DAXPY( J-1, -X( J )*TSCAL, A( 1, J ), 1, X,
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
537 $ 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
538 I = IDAMAX( J-1, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
539 XMAX = ABS( X( I ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
540 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
541 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
542 IF( J.LT.N ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
543 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
544 * Compute the update
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
545 * x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
546 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
547 CALL DAXPY( N-J, -X( J )*TSCAL, A( J+1, J ), 1,
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
548 $ X( J+1 ), 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
549 I = J + IDAMAX( N-J, X( J+1 ), 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
550 XMAX = ABS( X( I ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
551 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
552 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
553 110 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
554 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
555 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
556 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
557 * Solve A' * x = b
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
558 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
559 DO 160 J = JFIRST, JLAST, JINC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
560 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
561 * Compute x(j) = b(j) - sum A(k,j)*x(k).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
562 * k<>j
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
563 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
564 XJ = ABS( X( J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
565 USCAL = TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
566 REC = ONE / MAX( XMAX, ONE )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
567 IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
568 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
569 * If x(j) could overflow, scale x by 1/(2*XMAX).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
570 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
571 REC = REC*HALF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
572 IF( NOUNIT ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
573 TJJS = A( J, J )*TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
574 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
575 TJJS = TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
576 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
577 TJJ = ABS( TJJS )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
578 IF( TJJ.GT.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
579 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
580 * Divide by A(j,j) when scaling x if A(j,j) > 1.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
581 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
582 REC = MIN( ONE, REC*TJJ )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
583 USCAL = USCAL / TJJS
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
584 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
585 IF( REC.LT.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
586 CALL DSCAL( N, REC, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
587 SCALE = SCALE*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
588 XMAX = XMAX*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
589 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
590 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
591 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
592 SUMJ = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
593 IF( USCAL.EQ.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
594 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
595 * If the scaling needed for A in the dot product is 1,
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
596 * call DDOT to perform the dot product.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
597 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
598 IF( UPPER ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
599 SUMJ = DDOT( J-1, A( 1, J ), 1, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
600 ELSE IF( J.LT.N ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
601 SUMJ = DDOT( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
602 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
603 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
604 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
605 * Otherwise, use in-line code for the dot product.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
606 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
607 IF( UPPER ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
608 DO 120 I = 1, J - 1
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
609 SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
610 120 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
611 ELSE IF( J.LT.N ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
612 DO 130 I = J + 1, N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
613 SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
614 130 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
615 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
616 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
617 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
618 IF( USCAL.EQ.TSCAL ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
619 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
620 * Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
621 * was not used to scale the dotproduct.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
622 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
623 X( J ) = X( J ) - SUMJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
624 XJ = ABS( X( J ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
625 IF( NOUNIT ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
626 TJJS = A( J, J )*TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
627 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
628 TJJS = TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
629 IF( TSCAL.EQ.ONE )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
630 $ GO TO 150
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
631 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
632 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
633 * Compute x(j) = x(j) / A(j,j), scaling if necessary.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
634 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
635 TJJ = ABS( TJJS )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
636 IF( TJJ.GT.SMLNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
637 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
638 * abs(A(j,j)) > SMLNUM:
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
639 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
640 IF( TJJ.LT.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
641 IF( XJ.GT.TJJ*BIGNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
642 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
643 * Scale X by 1/abs(x(j)).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
644 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
645 REC = ONE / XJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
646 CALL DSCAL( N, REC, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
647 SCALE = SCALE*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
648 XMAX = XMAX*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
649 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
650 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
651 X( J ) = X( J ) / TJJS
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
652 ELSE IF( TJJ.GT.ZERO ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
653 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
654 * 0 < abs(A(j,j)) <= SMLNUM:
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
655 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
656 IF( XJ.GT.TJJ*BIGNUM ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
657 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
658 * Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
659 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
660 REC = ( TJJ*BIGNUM ) / XJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
661 CALL DSCAL( N, REC, X, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
662 SCALE = SCALE*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
663 XMAX = XMAX*REC
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
664 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
665 X( J ) = X( J ) / TJJS
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
666 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
667 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
668 * A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
669 * scale = 0, and compute a solution to A'*x = 0.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
670 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
671 DO 140 I = 1, N
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
672 X( I ) = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
673 140 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
674 X( J ) = ONE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
675 SCALE = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
676 XMAX = ZERO
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
677 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
678 150 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
679 ELSE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
680 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
681 * Compute x(j) := x(j) / A(j,j) - sumj if the dot
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
682 * product has already been divided by 1/A(j,j).
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
683 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
684 X( J ) = X( J ) / TJJS - SUMJ
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
685 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
686 XMAX = MAX( XMAX, ABS( X( J ) ) )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
687 160 CONTINUE
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
688 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
689 SCALE = SCALE / TSCAL
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
690 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
691 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
692 * Scale the column norms by 1/TSCAL for return.
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
693 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
694 IF( TSCAL.NE.ONE ) THEN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
695 CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
696 END IF
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
697 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
698 RETURN
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
699 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
700 * End of DLATRS
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
701 *
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents:
diff changeset
702 END