xref: /phasta/phSolver/compressible/au1gmr.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine Au1GMR (EGmass,   uBrg,   ilwork,iBC,iper )
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc----------------------------------------------------------------------
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc This routine performs a matrix-vector product for the EBE -
6*59599516SKenneth E. Jansenc preconditioned GMRES solver.
7*59599516SKenneth E. Jansenc
8*59599516SKenneth E. Jansenc input:
9*59599516SKenneth E. Jansenc     EGmass   (numel, nedof, nedof)  : element mass matrices
10*59599516SKenneth E. Jansenc     ilwork   (nlwork)               : local MPI communication array
11*59599516SKenneth E. Jansenc
12*59599516SKenneth E. Jansenc output:
13*59599516SKenneth E. Jansenc     uBrg   (nshg,nflow)              : next Krylov vector
14*59599516SKenneth E. Jansenc
15*59599516SKenneth E. Jansenc----------------------------------------------------------------------
16*59599516SKenneth E. Jansenc
17*59599516SKenneth E. Jansen      use pointer_data
18*59599516SKenneth E. Jansen
19*59599516SKenneth E. Jansen      include "common.h"
20*59599516SKenneth E. Jansen      include "mpif.h"
21*59599516SKenneth E. Jansenc
22*59599516SKenneth E. Jansen      dimension EGmass(numel,nedof,nedof),  uBrg(nshg,nflow),
23*59599516SKenneth E. Jansen     &          uBtmp(nshg,nflow),          ilwork(nlwork),
24*59599516SKenneth E. Jansen     &          iBC(nshg),
25*59599516SKenneth E. Jansen     &          iper(nshg)
26*59599516SKenneth E. Jansenc
27*59599516SKenneth E. Jansenc.... communicate:: copy the master's portion of uBrg to each slave
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansen      if (numpe > 1) then
30*59599516SKenneth E. Jansen         call commu (uBrg, ilwork, nflow  , 'out')
31*59599516SKenneth E. Jansen      endif
32*59599516SKenneth E. Jansenc
33*59599516SKenneth E. Jansenc.... local periodic boundary conditions (no communications)
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansen        do j=1,nflow
36*59599516SKenneth E. Jansen           uBrg(:,j)=uBrg(iper(:),j)
37*59599516SKenneth E. Jansen        enddo
38*59599516SKenneth E. Jansenc
39*59599516SKenneth E. Jansenc       slave has masters value, for abc we need to rotate it
40*59599516SKenneth E. Jansenc        (if this is a vector only no SCALARS)
41*59599516SKenneth E. Jansen        if((iabc==1)) !are there any axisym bc's
42*59599516SKenneth E. Jansen     &     call rotabc(uBrg(1,2), iBC,  'out')
43*59599516SKenneth E. Jansen
44*59599516SKenneth E. Jansenc
45*59599516SKenneth E. Jansenc.... initialize
46*59599516SKenneth E. Jansenc
47*59599516SKenneth E. Jansen      uBtmp = zero
48*59599516SKenneth E. Jansenc
49*59599516SKenneth E. Jansenc.... loop over element blocks
50*59599516SKenneth E. Jansenc
51*59599516SKenneth E. Jansen      do iblk = 1, nelblk
52*59599516SKenneth E. Jansen         iel   = lcblk(1,iblk)
53*59599516SKenneth E. Jansen         nenl  = lcblk(5,iblk)
54*59599516SKenneth E. Jansen         npro  = lcblk(1,iblk+1) - iel
55*59599516SKenneth E. Jansen         inum = iel + npro - 1
56*59599516SKenneth E. Jansen         nshl = lcblk(10,iblk)
57*59599516SKenneth E. Jansenc
58*59599516SKenneth E. Jansenc.... compute and assemble the Au product
59*59599516SKenneth E. Jansenc
60*59599516SKenneth E. Jansen         call asAuGMR (mien(iblk)%p,  EGmass(iel:inum,:,:), uBrg,
61*59599516SKenneth E. Jansen     &                 uBtmp )
62*59599516SKenneth E. Jansenc
63*59599516SKenneth E. Jansen      enddo
64*59599516SKenneth E. Jansen
65*59599516SKenneth E. Jansen      uBrg = uBtmp
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansenc
70*59599516SKenneth E. Jansen        if((iabc==1)) !are there any axisym bc's
71*59599516SKenneth E. Jansen     &       call rotabc(uBrg(1,2), iBC,  'in ')
72*59599516SKenneth E. Jansenc
73*59599516SKenneth E. Jansen      if (numpe > 1) then
74*59599516SKenneth E. Jansenc
75*59599516SKenneth E. Jansenc.... send slave's copy of uBrg to the master
76*59599516SKenneth E. Jansenc
77*59599516SKenneth E. Jansen        call commu (uBrg  , ilwork, nflow  , 'in ')
78*59599516SKenneth E. Jansenc
79*59599516SKenneth E. Jansenc.... nodes treated on another processor are eliminated
80*59599516SKenneth E. Jansenc
81*59599516SKenneth E. Jansen         numtask = ilwork(1)
82*59599516SKenneth E. Jansen         itkbeg = 1
83*59599516SKenneth E. Jansen
84*59599516SKenneth E. Jansen         do itask = 1, numtask
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
87*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
88*59599516SKenneth E. Jansen
89*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
90*59599516SKenneth E. Jansen               do is = 1,numseg
91*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
92*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
93*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
94*59599516SKenneth E. Jansen                  uBrg(isgbeg:isgend,:) = zero
95*59599516SKenneth E. Jansen               enddo
96*59599516SKenneth E. Jansen            endif
97*59599516SKenneth E. Jansen
98*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
99*59599516SKenneth E. Jansen
100*59599516SKenneth E. Jansen         enddo
101*59599516SKenneth E. Jansen      endif
102*59599516SKenneth E. Jansenc
103*59599516SKenneth E. Jansenc.... end
104*59599516SKenneth E. Jansenc
105*59599516SKenneth E. Jansen      return
106*59599516SKenneth E. Jansen      end
107*59599516SKenneth E. Jansenc
108*59599516SKenneth E. Jansenc
109*59599516SKenneth E. Jansenc
110*59599516SKenneth E. Jansen        subroutine Au1GMRSclr (EGmasst,   uBrg,   ilwork, iper )
111*59599516SKenneth E. Jansenc
112*59599516SKenneth E. Jansenc----------------------------------------------------------------------
113*59599516SKenneth E. Jansenc
114*59599516SKenneth E. Jansenc This routine performs a matrix-vector product for the EBE -
115*59599516SKenneth E. Jansenc preconditioned GMRES solver.
116*59599516SKenneth E. Jansenc
117*59599516SKenneth E. Jansenc input:
118*59599516SKenneth E. Jansenc     EGmasst  (numel, nshape, nshape)  : element mass matrices
119*59599516SKenneth E. Jansenc     ilwork   (nlwork)                 : local MPI communication array
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansenc output:
122*59599516SKenneth E. Jansenc     uBrg   (nshg)              : next Krylov vector
123*59599516SKenneth E. Jansenc
124*59599516SKenneth E. Jansenc----------------------------------------------------------------------
125*59599516SKenneth E. Jansenc
126*59599516SKenneth E. Jansen      use pointer_data
127*59599516SKenneth E. Jansen
128*59599516SKenneth E. Jansen      include "common.h"
129*59599516SKenneth E. Jansen      include "mpif.h"
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansen      dimension EGmasst(numel,nshape,nshape),uBrg(nshg),
132*59599516SKenneth E. Jansen     &          uBtmp(nshg),  ilwork(nlwork), iper(nshg)
133*59599516SKenneth E. Jansenc
134*59599516SKenneth E. Jansenc.... communicate:: copy the master's portion of uBrg to each slave
135*59599516SKenneth E. Jansenc
136*59599516SKenneth E. Jansen      if (numpe > 1) then
137*59599516SKenneth E. Jansen         call commu (uBrg, ilwork, 1, 'out')
138*59599516SKenneth E. Jansen      endif
139*59599516SKenneth E. Jansenc ... changed
140*59599516SKenneth E. Jansenc.... local periodic boundary conditions (no communications)
141*59599516SKenneth E. Jansenc
142*59599516SKenneth E. Jansen           uBrg(:)=uBrg(iper(:))
143*59599516SKenneth E. Jansenc
144*59599516SKenneth E. Jansenc
145*59599516SKenneth E. Jansenc.... initialize
146*59599516SKenneth E. Jansenc
147*59599516SKenneth E. Jansen      uBtmp = zero
148*59599516SKenneth E. Jansenc
149*59599516SKenneth E. Jansenc.... loop over element blocks
150*59599516SKenneth E. Jansenc
151*59599516SKenneth E. Jansen      do iblk = 1, nelblk
152*59599516SKenneth E. Jansen         iel   = lcblk(1,iblk)
153*59599516SKenneth E. Jansen         nenl  = lcblk(5,iblk)
154*59599516SKenneth E. Jansen         npro  = lcblk(1,iblk+1) - iel
155*59599516SKenneth E. Jansen         inum = iel + npro - 1
156*59599516SKenneth E. Jansen         nshl = lcblk(10,iblk)
157*59599516SKenneth E. Jansenc
158*59599516SKenneth E. Jansenc.... compute and assemble the Au product
159*59599516SKenneth E. Jansenc
160*59599516SKenneth E. Jansen         call asAuGMRSclr (mien(iblk)%p,  EGmassT(iel:inum,:,:), uBrg,
161*59599516SKenneth E. Jansen     &                 uBtmp )
162*59599516SKenneth E. Jansenc
163*59599516SKenneth E. Jansen      enddo
164*59599516SKenneth E. Jansen
165*59599516SKenneth E. Jansen      uBrg = uBtmp
166*59599516SKenneth E. Jansenc
167*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
168*59599516SKenneth E. Jansenc
169*59599516SKenneth E. Jansen      if (numpe > 1) then
170*59599516SKenneth E. Jansenc
171*59599516SKenneth E. Jansenc.... send slave's copy of uBrg to the master
172*59599516SKenneth E. Jansenc
173*59599516SKenneth E. Jansen        call commu (uBrg  , ilwork, 1, 'in ')
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansenc.... nodes treated on another processor are eliminated
176*59599516SKenneth E. Jansenc
177*59599516SKenneth E. Jansen         numtask = ilwork(1)
178*59599516SKenneth E. Jansen         itkbeg = 1
179*59599516SKenneth E. Jansen
180*59599516SKenneth E. Jansen         do itask = 1, numtask
181*59599516SKenneth E. Jansen
182*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
183*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
184*59599516SKenneth E. Jansen
185*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
186*59599516SKenneth E. Jansen               do is = 1,numseg
187*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
188*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
189*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
190*59599516SKenneth E. Jansen                  uBrg(isgbeg:isgend) = zero
191*59599516SKenneth E. Jansen               enddo
192*59599516SKenneth E. Jansen            endif
193*59599516SKenneth E. Jansen
194*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
195*59599516SKenneth E. Jansen
196*59599516SKenneth E. Jansen         enddo
197*59599516SKenneth E. Jansen      endif
198*59599516SKenneth E. Jansenc
199*59599516SKenneth E. Jansenc.... end
200*59599516SKenneth E. Jansenc
201*59599516SKenneth E. Jansen      return
202*59599516SKenneth E. Jansen      end
203*59599516SKenneth E. Jansen
204*59599516SKenneth E. Jansen
205