xref: /phasta/phSolver/compressible/i3pre.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine i3pre (BDtmp,  Binv,  EGmass,  ilwork )
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc---------------------------------------------------------------------
4*59599516SKenneth E. Jansenc This is the initialization routine for the EBE-GMRES solver.
5*59599516SKenneth E. Jansenc It pre-preconditions the LHS mass matrix and sets up the
6*59599516SKenneth E. Jansenc EBE preconditioners. (pre-preconditioning is block diagonal
7*59599516SKenneth E. Jansenc scaling).
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansenc input:
10*59599516SKenneth E. Jansenc     BDtmp  (nshg,nflow,nflow)  : block diagonal scaling matrix
11*59599516SKenneth E. Jansenc                                  which is already LU factored.
12*59599516SKenneth E. Jansenc     EGmass (numel,nedof,nedof) : element mass matrix
13*59599516SKenneth E. Jansenc
14*59599516SKenneth E. Jansenc output:
15*59599516SKenneth E. Jansenc     EGmass (numel,nedof,nedof) : pre-preconditioned (scaled) mass matrix
16*59599516SKenneth E. Jansenc     Binv   (numel,nedof,nedof) : EBE preconditioner for each element
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansenc---------------------------------------------------------------------
19*59599516SKenneth E. Jansenc
20*59599516SKenneth E. Jansen      use pointer_data
21*59599516SKenneth E. Jansen
22*59599516SKenneth E. Jansen      include "common.h"
23*59599516SKenneth E. Jansen
24*59599516SKenneth E. Jansen      dimension  BDtmp(nshg,nflow,nflow),
25*59599516SKenneth E. Jansen     &           EGmass(numel,nedof,nedof),
26*59599516SKenneth E. Jansenctoomuchmemory     &           Binv(numel,nedof,nedof),
27*59599516SKenneth E. Jansen     &           ilwork(nlwork)
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansen      dimension  BDiagl(numel,nshape,nflow,nflow),
30*59599516SKenneth E. Jansen     &           BDiag(nshg,nflow,nflow)
31*59599516SKenneth E. Jansen
32*59599516SKenneth E. Jansen      BDiag = BDtmp
33*59599516SKenneth E. Jansen
34*59599516SKenneth E. Jansen      if (numpe > 1) then
35*59599516SKenneth E. Jansen        call commu (BDiag  , ilwork, nflow*nflow  , 'out')
36*59599516SKenneth E. Jansen      endif
37*59599516SKenneth E. Jansenc
38*59599516SKenneth E. Jansenc.... block-diagonal pre-precondition LHS
39*59599516SKenneth E. Jansenc
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansenc.... loop over element blocks
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansen      do iblk = 1, nelblk
44*59599516SKenneth E. Jansen         iel    = lcblk(1,iblk)
45*59599516SKenneth E. Jansen         nenl   = lcblk(5,iblk)
46*59599516SKenneth E. Jansen         npro   = lcblk(1,iblk+1) - iel
47*59599516SKenneth E. Jansen         n      = iel - 1
48*59599516SKenneth E. Jansen         inum   = iel + npro - 1
49*59599516SKenneth E. Jansen         nshl   = lcblk(10,iblk)
50*59599516SKenneth E. Jansenc
51*59599516SKenneth E. Jansenc.... localize block diagonal scaling matrices
52*59599516SKenneth E. Jansenc
53*59599516SKenneth E. Jansen         call local (BDiag,  BDiagl(iel:inum,:,:,:), abs(mien(iblk)%p),
54*59599516SKenneth E. Jansen     &               nflow*nflow,  'gather  ' )
55*59599516SKenneth E. Jansenc
56*59599516SKenneth E. Jansenc.... loop through local nodes and reduce all columns and rows
57*59599516SKenneth E. Jansenc
58*59599516SKenneth E. Jansen         do inode = 1, nshl
59*59599516SKenneth E. Jansen            i = (inode - 1) * nflow ! EGmass dof offset
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansenc.... reduce by columns, (left block diagonal preconditioning)
62*59599516SKenneth E. Jansenc
63*59599516SKenneth E. Jansenc     EGmass <-- inverse(L^tilde) EGmass
64*59599516SKenneth E. Jansenc
65*59599516SKenneth E. Jansen            do j = 1, nedof
66*59599516SKenneth E. Jansen               do iv = 1, npro
67*59599516SKenneth E. Jansen                  EGmass(n+iv,i+1,j) = EGmass(n+iv,i+1,j)
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansen                  EGmass(n+iv,i+2,j) = (EGmass(n+iv,i+2,j)
70*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,2,1) * EGmass(n+iv,i+1,j))
71*59599516SKenneth E. Jansenc
72*59599516SKenneth E. Jansen                  EGmass(n+iv,i+3,j) = (EGmass(n+iv,i+3,j)
73*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,3,1) * EGmass(n+iv,i+1,j)
74*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,3,2) * EGmass(n+iv,i+2,j))
75*59599516SKenneth E. Jansenc
76*59599516SKenneth E. Jansen                  EGmass(n+iv,i+4,j) = (EGmass(n+iv,i+4,j)
77*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,4,1) * EGmass(n+iv,i+1,j)
78*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,4,2) * EGmass(n+iv,i+2,j)
79*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,4,3) * EGmass(n+iv,i+3,j))
80*59599516SKenneth E. Jansenc
81*59599516SKenneth E. Jansen                  EGmass(n+iv,i+5,j) = (EGmass(n+iv,i+5,j)
82*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,5,1) * EGmass(n+iv,i+1,j)
83*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,5,2) * EGmass(n+iv,i+2,j)
84*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,5,3) * EGmass(n+iv,i+3,j)
85*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,5,4) * EGmass(n+iv,i+4,j))
86*59599516SKenneth E. Jansen               enddo
87*59599516SKenneth E. Jansen            enddo
88*59599516SKenneth E. Jansen         enddo
89*59599516SKenneth E. Jansen
90*59599516SKenneth E. Jansen         do inode = 1, nshl
91*59599516SKenneth E. Jansen            i = (inode - 1) * nflow ! EGmass dof offset
92*59599516SKenneth E. Jansen
93*59599516SKenneth E. Jansenc
94*59599516SKenneth E. Jansenc.... reduce by rows, (right block diagonal preconditioning)
95*59599516SKenneth E. Jansenc
96*59599516SKenneth E. Jansenc     EGmass <-- EGmass inverse(U^tilde)
97*59599516SKenneth E. Jansenc
98*59599516SKenneth E. Jansen            do j = 1, nedof
99*59599516SKenneth E. Jansen               do iv = 1, npro
100*59599516SKenneth E. Jansen                  EGmass(n+iv,j,i+1) = BDiagl(n+iv,inode,1,1) *
101*59599516SKenneth E. Jansen     &                 (EGmass(n+iv,j,i+1))
102*59599516SKenneth E. Jansenc
103*59599516SKenneth E. Jansen                  EGmass(n+iv,j,i+2) = BDiagl(n+iv,inode,2,2) * (
104*59599516SKenneth E. Jansen     &                 EGmass(n+iv,j,i+2)
105*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,1,2) * EGmass(n+iv,j,i+1))
106*59599516SKenneth E. Jansenc
107*59599516SKenneth E. Jansen                  EGmass(n+iv,j,i+3) = BDiagl(n+iv,inode,3,3) * (
108*59599516SKenneth E. Jansen     &                 EGmass(n+iv,j,i+3)
109*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,1,3) * EGmass(n+iv,j,i+1)
110*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,2,3) * EGmass(n+iv,j,i+2))
111*59599516SKenneth E. Jansenc
112*59599516SKenneth E. Jansen                  EGmass(n+iv,j,i+4) = BDiagl(n+iv,inode,4,4) * (
113*59599516SKenneth E. Jansen     &                 EGmass(n+iv,j,i+4)
114*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,1,4) * EGmass(n+iv,j,i+1)
115*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,2,4) * EGmass(n+iv,j,i+2)
116*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,3,4) * EGmass(n+iv,j,i+3))
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansen                  EGmass(n+iv,j,i+5) = BDiagl(n+iv,inode,5,5) * (
119*59599516SKenneth E. Jansen     &                 EGmass(n+iv,j,i+5)
120*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,1,5) * EGmass(n+iv,j,i+1)
121*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,2,5) * EGmass(n+iv,j,i+2)
122*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,3,5) * EGmass(n+iv,j,i+3)
123*59599516SKenneth E. Jansen     &                 - BDiagl(n+iv,inode,4,5) * EGmass(n+iv,j,i+4))
124*59599516SKenneth E. Jansen               enddo
125*59599516SKenneth E. Jansen            enddo
126*59599516SKenneth E. Jansenc
127*59599516SKenneth E. Jansenc.... end loops over row and column nodes
128*59599516SKenneth E. Jansenc
129*59599516SKenneth E. Jansen         enddo
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansenc.... end of element blocks loop
132*59599516SKenneth E. Jansenc
133*59599516SKenneth E. Jansen      enddo
134*59599516SKenneth E. Jansenc
135*59599516SKenneth E. Jansenc.... calculate non-symmetric Cholesky EBE preconditioners
136*59599516SKenneth E. Jansenc
137*59599516SKenneth E. Jansenctoomuchmemory      Binv = EGmass
138*59599516SKenneth E. Jansenc$$$      if (iPcond .eq. 2) then
139*59599516SKenneth E. Jansenc$$$         call itrPr2 (ieneg, lcblk, Binv, ubBgl, ubBgl, 'LDU_Fact')
140*59599516SKenneth E. Jansenc$$$      endif
141*59599516SKenneth E. Jansenc
142*59599516SKenneth E. Jansenc.... end of (pre process), return
143*59599516SKenneth E. Jansenc
144*59599516SKenneth E. Jansen      return
145*59599516SKenneth E. Jansen
146*59599516SKenneth E. Jansen      end
147*59599516SKenneth E. Jansenc
148*59599516SKenneth E. Jansenc
149*59599516SKenneth E. Jansenc
150*59599516SKenneth E. Jansen      subroutine i3preSclr (Diag,  Dinv,  EGmassT,  ilwork )
151*59599516SKenneth E. Jansenc
152*59599516SKenneth E. Jansenc---------------------------------------------------------------------
153*59599516SKenneth E. Jansenc This is the initialization routine for the EBE-GMRES solver.
154*59599516SKenneth E. Jansenc It pre-preconditions the LHS mass matrix and sets up the
155*59599516SKenneth E. Jansenc EBE preconditioners. (pre-preconditioning is block diagonal
156*59599516SKenneth E. Jansenc scaling).
157*59599516SKenneth E. Jansenc
158*59599516SKenneth E. Jansenc input:
159*59599516SKenneth E. Jansenc     Diag  (numnp,nflow,nflow)    : diagonal scaling matrix
160*59599516SKenneth E. Jansenc     EGmass (numel,nedof,nedof) : element mass matrix
161*59599516SKenneth E. Jansenc
162*59599516SKenneth E. Jansenc output:
163*59599516SKenneth E. Jansenc     EGmass (numel,nedof,nedof) : pre-preconditioned (scaled) mass matrix
164*59599516SKenneth E. Jansenc     Dinv   (numel,nedof,nedof) : EBE preconditioner for each element
165*59599516SKenneth E. Jansenc
166*59599516SKenneth E. Jansenc---------------------------------------------------------------------
167*59599516SKenneth E. Jansenc
168*59599516SKenneth E. Jansen      use pointer_data
169*59599516SKenneth E. Jansen
170*59599516SKenneth E. Jansen      include "common.h"
171*59599516SKenneth E. Jansen
172*59599516SKenneth E. Jansen      dimension  EGmassT(numel,nshape,nshape),
173*59599516SKenneth E. Jansen     &           Dinv(nshg), ilwork(nlwork)
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansen      dimension  Dinvl(numel,nshl), Diag(nshg)
176*59599516SKenneth E. Jansenc
177*59599516SKenneth E. Jansen      Dinv = one/Diag
178*59599516SKenneth E. Jansenc
179*59599516SKenneth E. Jansen      if (numpe > 1) then
180*59599516SKenneth E. Jansen        call commu (Dinv  , ilwork, 1  , 'out')
181*59599516SKenneth E. Jansen      endif
182*59599516SKenneth E. Jansenc
183*59599516SKenneth E. Jansenc.... loop over element blocks
184*59599516SKenneth E. Jansenc
185*59599516SKenneth E. Jansen      do iblk = 1, nelblk
186*59599516SKenneth E. Jansen         iel    = lcblk(1,iblk)
187*59599516SKenneth E. Jansen         nenl   = lcblk(5,iblk)
188*59599516SKenneth E. Jansen         npro   = lcblk(1,iblk+1) - iel
189*59599516SKenneth E. Jansen         n      = iel - 1
190*59599516SKenneth E. Jansen         inum   = iel + npro - 1
191*59599516SKenneth E. Jansen         nshl   = lcblk(10,iblk)
192*59599516SKenneth E. Jansenc
193*59599516SKenneth E. Jansenc.... localize diagonal scaling matrices
194*59599516SKenneth E. Jansenc
195*59599516SKenneth E. Jansen         call local (Dinv,  Dinvl(iel:inum,:), mien(iblk)%p,
196*59599516SKenneth E. Jansen     &               1,  'gather  ' )
197*59599516SKenneth E. Jansenc
198*59599516SKenneth E. Jansenc.... loop through and reduce all columns
199*59599516SKenneth E. Jansenc
200*59599516SKenneth E. Jansen         do icol = 1, nshl
201*59599516SKenneth E. Jansen            do irow = 1, nshl
202*59599516SKenneth E. Jansen               do iv = 1, npro
203*59599516SKenneth E. Jansen                  EGmassT(n+iv,irow,icol) = EGmassT(n+iv,irow,icol)
204*59599516SKenneth E. Jansen     &                                      *Dinvl(n+iv,icol)
205*59599516SKenneth E. Jansen               enddo
206*59599516SKenneth E. Jansen            enddo
207*59599516SKenneth E. Jansen         enddo
208*59599516SKenneth E. Jansenc
209*59599516SKenneth E. Jansenc.... end of element blocks loop
210*59599516SKenneth E. Jansenc
211*59599516SKenneth E. Jansen      enddo
212*59599516SKenneth E. Jansenc
213*59599516SKenneth E. Jansenc.... end of (pre process), return
214*59599516SKenneth E. Jansenc
215*59599516SKenneth E. Jansen      return
216*59599516SKenneth E. Jansen
217*59599516SKenneth E. Jansen      end
218*59599516SKenneth E. Jansen
219*59599516SKenneth E. Jansen
220*59599516SKenneth E. Jansen
221*59599516SKenneth E. Jansen
222