xref: /phasta/phSolver/compressible/i3lu.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine i3LU (Diag, r, code)
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc----------------------------------------------------------------------
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc This routine performs a LU factorization/solve of a set of matrices,
6*59599516SKenneth E. Jansenc used for block diagonal preconditioning in the iterative driver.
7*59599516SKenneth E. Jansen
8*59599516SKenneth E. Jansenc input:
9*59599516SKenneth E. Jansenc  Diag (nshg,nflow,nflow)  : block diagonal (symmetric storage)
10*59599516SKenneth E. Jansenc  r    (nshg,nflow)    : residual
11*59599516SKenneth E. Jansenc  code                 : operation code
12*59599516SKenneth E. Jansenc                           .eq. 'LU_Fact ', Cholesky Factor
13*59599516SKenneth E. Jansenc                           .eq. 'forward ', forward reduction
14*59599516SKenneth E. Jansenc                           .eq. 'backward', backward substitution
15*59599516SKenneth E. Jansenc                           .eq. 'product ', product Diag.r
16*59599516SKenneth E. Jansenc
17*59599516SKenneth E. Jansenc output:
18*59599516SKenneth E. Jansenc  Diag (nshg,nflow,nflow)  : LU decomp. of block diagonal
19*59599516SKenneth E. Jansenc  r    (nshg,nflow)    : reduced residual
20*59599516SKenneth E. Jansenc
21*59599516SKenneth E. Jansenc
22*59599516SKenneth E. Jansenc Note: the formulation used here is taken from Golub's "Matrix
23*59599516SKenneth E. Jansenc       Computations" Book (1984), pages 82-85 algorithm P5.1-3.
24*59599516SKenneth E. Jansenc
25*59599516SKenneth E. Jansenc       L and U overwrite Diag
26*59599516SKenneth E. Jansenc
27*59599516SKenneth E. Jansenc       The diagonal terms (i,i) of U are stored in inverted form.
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansenc
30*59599516SKenneth E. Jansenc----------------------------------------------------------------------
31*59599516SKenneth E. Jansenc
32*59599516SKenneth E. Jansen        include "common.h"
33*59599516SKenneth E. Jansenc
34*59599516SKenneth E. Jansen        dimension Diag(nshg,nflow,nflow),        r(nshg,nflow)
35*59599516SKenneth E. Jansenc
36*59599516SKenneth E. Jansen        character*8 code
37*59599516SKenneth E. Jansen
38*59599516SKenneth E. Jansenc
39*59599516SKenneth E. Jansenc.... perform LU decomposition with the Diagonal terms inverted
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansen        if (code .eq. 'LU_Fact ') then
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansen          Diag(:,1,1) = one   / Diag(:,1,1)
44*59599516SKenneth E. Jansenc
45*59599516SKenneth E. Jansen          Diag(:,2,1) = Diag(:,1,1) *  Diag(:,2,1)
46*59599516SKenneth E. Jansen          Diag(:,3,1) = Diag(:,1,1) *  Diag(:,3,1)
47*59599516SKenneth E. Jansen          Diag(:,4,1) = Diag(:,1,1) *  Diag(:,4,1)
48*59599516SKenneth E. Jansen          Diag(:,5,1) = Diag(:,1,1) *  Diag(:,5,1)
49*59599516SKenneth E. Jansenc
50*59599516SKenneth E. Jansen          Diag(:,2,2) = Diag(:,2,2) - Diag(:,2,1) *  Diag(:,1,2)
51*59599516SKenneth E. Jansen          Diag(:,2,3) = Diag(:,2,3) - Diag(:,2,1) *  Diag(:,1,3)
52*59599516SKenneth E. Jansen          Diag(:,2,4) = Diag(:,2,4) - Diag(:,2,1) *  Diag(:,1,4)
53*59599516SKenneth E. Jansen          Diag(:,2,5) = Diag(:,2,5) - Diag(:,2,1) *  Diag(:,1,5)
54*59599516SKenneth E. Jansen          Diag(:,2,2) = one   / Diag(:,2,2)
55*59599516SKenneth E. Jansenc
56*59599516SKenneth E. Jansen          Diag(:,3,2) = Diag(:,2,2)*(Diag(:,3,2)
57*59599516SKenneth E. Jansen     &                             - Diag(:,3,1) * Diag(:,1,2))
58*59599516SKenneth E. Jansen          Diag(:,4,2) = Diag(:,2,2)*(Diag(:,4,2)
59*59599516SKenneth E. Jansen     &                             - Diag(:,4,1) * Diag(:,1,2))
60*59599516SKenneth E. Jansen          Diag(:,5,2) = Diag(:,2,2)*(Diag(:,5,2)
61*59599516SKenneth E. Jansen     &                             - Diag(:,5,1) * Diag(:,1,2))
62*59599516SKenneth E. Jansenc
63*59599516SKenneth E. Jansen
64*59599516SKenneth E. Jansen          Diag(:,3,3) = Diag(:,3,3) - Diag(:,3,1) * Diag(:,1,3)
65*59599516SKenneth E. Jansen     &                              - Diag(:,3,2) * Diag(:,2,3)
66*59599516SKenneth E. Jansen          Diag(:,3,4) = Diag(:,3,4) - Diag(:,3,1) * Diag(:,1,4)
67*59599516SKenneth E. Jansen     &                              - Diag(:,3,2) * Diag(:,2,4)
68*59599516SKenneth E. Jansen          Diag(:,3,5) = Diag(:,3,5) - Diag(:,3,1) * Diag(:,1,5)
69*59599516SKenneth E. Jansen     &                              - Diag(:,3,2) * Diag(:,2,5)
70*59599516SKenneth E. Jansen          Diag(:,3,3) = one   / Diag(:,3,3)
71*59599516SKenneth E. Jansenc
72*59599516SKenneth E. Jansen          Diag(:,4,3) = Diag(:,3,3) *(Diag(:,4,3)
73*59599516SKenneth E. Jansen     &                              - Diag(:,4,1) * Diag(:,1,3)
74*59599516SKenneth E. Jansen     &                              - Diag(:,4,2) * Diag(:,2,3))
75*59599516SKenneth E. Jansen          Diag(:,5,3) = Diag(:,3,3) *(Diag(:,5,3)
76*59599516SKenneth E. Jansen     &                              - Diag(:,5,1) * Diag(:,1,3)
77*59599516SKenneth E. Jansen     &                              - Diag(:,5,2) * Diag(:,2,3))
78*59599516SKenneth E. Jansenc
79*59599516SKenneth E. Jansen          Diag(:,4,4) = Diag(:,4,4) - Diag(:,4,1) * Diag(:,1,4)
80*59599516SKenneth E. Jansen     &                              - Diag(:,4,2) * Diag(:,2,4)
81*59599516SKenneth E. Jansen     &                              - Diag(:,4,3) * Diag(:,3,4)
82*59599516SKenneth E. Jansen          Diag(:,4,4) = one / Diag(:,4,4)
83*59599516SKenneth E. Jansenc
84*59599516SKenneth E. Jansen          Diag(:,5,4) = Diag(:,4,4) *(Diag(:,5,4)
85*59599516SKenneth E. Jansen     &                              - Diag(:,5,1) * Diag(:,1,4)
86*59599516SKenneth E. Jansen     &                              - Diag(:,5,2) * Diag(:,2,4)
87*59599516SKenneth E. Jansen     &                              - Diag(:,5,3) * Diag(:,3,4))
88*59599516SKenneth E. Jansenc
89*59599516SKenneth E. Jansen          Diag(:,5,5) = Diag(:,5,5) - Diag(:,5,1) * Diag(:,1,5)
90*59599516SKenneth E. Jansen     &                              - Diag(:,5,2) * Diag(:,2,5)
91*59599516SKenneth E. Jansen     &                              - Diag(:,5,3) * Diag(:,3,5)
92*59599516SKenneth E. Jansen     &                              - Diag(:,5,4) * Diag(:,4,5)
93*59599516SKenneth E. Jansen          Diag(:,5,5) = one / Diag(:,5,5)
94*59599516SKenneth E. Jansenc
95*59599516SKenneth E. Jansenc  INACCURATE NOW          flops = flops + 110*nshg
96*59599516SKenneth E. Jansenc
97*59599516SKenneth E. Jansen          return
98*59599516SKenneth E. Jansen        endif
99*59599516SKenneth E. Jansenc
100*59599516SKenneth E. Jansenc.... perform forward reduction
101*59599516SKenneth E. Jansenc
102*59599516SKenneth E. Jansen        if (code .eq. 'forward ') then
103*59599516SKenneth E. Jansenc
104*59599516SKenneth E. Jansenc         r(:,1) =  r(:,1) !no-op
105*59599516SKenneth E. Jansen          r(:,2) =  r(:,2) - Diag(:,2,1) *  r(:,1)
106*59599516SKenneth E. Jansen          r(:,3) =  r(:,3) - Diag(:,3,1) *  r(:,1)
107*59599516SKenneth E. Jansen     &                     - Diag(:,3,2) *  r(:,2)
108*59599516SKenneth E. Jansen          r(:,4) =  r(:,4) - Diag(:,4,1) *  r(:,1)
109*59599516SKenneth E. Jansen     &                     - Diag(:,4,2) *  r(:,2)
110*59599516SKenneth E. Jansen     &                     - Diag(:,4,3) *  r(:,3)
111*59599516SKenneth E. Jansen          r(:,5) =  r(:,5) - Diag(:,5,1) *  r(:,1)
112*59599516SKenneth E. Jansen     &                     - Diag(:,5,2) *  r(:,2)
113*59599516SKenneth E. Jansen     &                     - Diag(:,5,3) *  r(:,3)
114*59599516SKenneth E. Jansen     &                     - Diag(:,5,4) *  r(:,4)
115*59599516SKenneth E. Jansenc
116*59599516SKenneth E. Jansenc.... flop count
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansenc  INACCURATE           flops = flops + 25*nshg
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansen          return
121*59599516SKenneth E. Jansen        endif
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansenc.... perform backward substitution
124*59599516SKenneth E. Jansenc
125*59599516SKenneth E. Jansen        if (code .eq. 'backward') then
126*59599516SKenneth E. Jansenc
127*59599516SKenneth E. Jansen          r(:,5) = Diag(:,5,5) *   r(:,5)
128*59599516SKenneth E. Jansen          r(:,4) = Diag(:,4,4) * ( r(:,4)
129*59599516SKenneth E. Jansen     &                         -   r(:,5) * Diag(:,4,5) )
130*59599516SKenneth E. Jansen          r(:,3) = Diag(:,3,3) * ( r(:,3)
131*59599516SKenneth E. Jansen     &                         -   r(:,5) * Diag(:,3,5)
132*59599516SKenneth E. Jansen     &                         -   r(:,4) * Diag(:,3,4) )
133*59599516SKenneth E. Jansen          r(:,2) = Diag(:,2,2) * ( r(:,2)
134*59599516SKenneth E. Jansen     &                         -   r(:,5) * Diag(:,2,5)
135*59599516SKenneth E. Jansen     &                         -   r(:,4) * Diag(:,2,4)
136*59599516SKenneth E. Jansen     &                         -   r(:,3) * Diag(:,2,3) )
137*59599516SKenneth E. Jansen          r(:,1) = Diag(:,1,1) * ( r(:,1)
138*59599516SKenneth E. Jansen     &                         -   r(:,5) * Diag(:,1,5)
139*59599516SKenneth E. Jansen     &                         -   r(:,4) * Diag(:,1,4)
140*59599516SKenneth E. Jansen     &                         -   r(:,3) * Diag(:,1,3)
141*59599516SKenneth E. Jansen     &                         -   r(:,2) * Diag(:,1,2) )
142*59599516SKenneth E. Jansenc
143*59599516SKenneth E. Jansenc.... flop count
144*59599516SKenneth E. Jansenc
145*59599516SKenneth E. Jansen          flops = flops + 25*nshg
146*59599516SKenneth E. Jansen
147*59599516SKenneth E. Jansen          return
148*59599516SKenneth E. Jansen        endif
149*59599516SKenneth E. Jansenc
150*59599516SKenneth E. Jansenc.... perform product U.r
151*59599516SKenneth E. Jansenc
152*59599516SKenneth E. Jansen        if (code .eq. 'product ') then
153*59599516SKenneth E. Jansenc
154*59599516SKenneth E. Jansen          r(:,1) = r(:,1) / Diag(:,1,1) + r(:,2) * Diag(:,1,2) +
155*59599516SKenneth E. Jansen     &             r(:,3) * Diag(:,1,3) + r(:,4) * Diag(:,1,4) +
156*59599516SKenneth E. Jansen     &             r(:,5) * Diag(:,1,5)
157*59599516SKenneth E. Jansen          r(:,2) = r(:,2) / Diag(:,2,2) +
158*59599516SKenneth E. Jansen     &             r(:,3) * Diag(:,2,3) + r(:,4) * Diag(:,2,4) +
159*59599516SKenneth E. Jansen     &             r(:,5) * Diag(:,2,5)
160*59599516SKenneth E. Jansen          r(:,3) = r(:,3) / Diag(:,3,3) +
161*59599516SKenneth E. Jansen     &             r(:,4) * Diag(:,3,4) +
162*59599516SKenneth E. Jansen     &             r(:,5) * Diag(:,3,5)
163*59599516SKenneth E. Jansen          r(:,4) = r(:,4) / Diag(:,4,4) +
164*59599516SKenneth E. Jansen     &             r(:,5) * Diag(:,4,5)
165*59599516SKenneth E. Jansen          r(:,5) = r(:,5) / Diag(:,5,5)
166*59599516SKenneth E. Jansenc
167*59599516SKenneth E. Jansenc.... flop count
168*59599516SKenneth E. Jansenc
169*59599516SKenneth E. Jansen          flops = flops + 40*nshg
170*59599516SKenneth E. Jansen
171*59599516SKenneth E. Jansen          return
172*59599516SKenneth E. Jansen        endif
173*59599516SKenneth E. Jansenc
174*59599516SKenneth E. Jansen        call error ('i3LU    ', code, 0)
175*59599516SKenneth E. Jansenc
176*59599516SKenneth E. Jansenc.... return
177*59599516SKenneth E. Jansenc
178*59599516SKenneth E. Jansenc
179*59599516SKenneth E. Jansen111     format(5(e14.7,2x))
180*59599516SKenneth E. Jansen        return
181*59599516SKenneth E. Jansen        end
182