xref: /phasta/phSolver/compressible/elmgmr.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine ElmGMRe (y,         ac,        x,
2*59599516SKenneth E. Jansen     &                     shp,       shgl,      iBC,
3*59599516SKenneth E. Jansen     &                     BC,        shpb,      shglb,
4*59599516SKenneth E. Jansen     &                     res,       rmes,      BDiag,
5*59599516SKenneth E. Jansen     &                     iper,      ilwork,    EGmass, rerr)
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc----------------------------------------------------------------------
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
10*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
11*59599516SKenneth E. Jansenc solver.
12*59599516SKenneth E. Jansenc
13*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
14*59599516SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
15*59599516SKenneth E. Jansenc----------------------------------------------------------------------
16*59599516SKenneth E. Jansenc
17*59599516SKenneth E. Jansen        use pointer_data
18*59599516SKenneth E. Jansen        use timedata
19*59599516SKenneth E. Jansenc
20*59599516SKenneth E. Jansen        include "common.h"
21*59599516SKenneth E. Jansen        include "mpif.h"
22*59599516SKenneth E. Jansenc
23*59599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
24*59599516SKenneth E. Jansen     &            x(numnp,nsd),
25*59599516SKenneth E. Jansen     &            iBC(nshg),
26*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
27*59599516SKenneth E. Jansen     &            res(nshg,nflow),
28*59599516SKenneth E. Jansen     &            rmes(nshg,nflow),      BDiag(nshg,nflow,nflow),
29*59599516SKenneth E. Jansen     &            iper(nshg),           EGmass(numel,nedof,nedof)
30*59599516SKenneth E. Jansenc
31*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
32*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
33*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
34*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
35*59599516SKenneth E. Jansenc
36*59599516SKenneth E. Jansen        dimension qres(nshg, idflx),     rmass(nshg)
37*59599516SKenneth E. Jansenc
38*59599516SKenneth E. Jansen        dimension ilwork(nlwork)
39*59599516SKenneth E. Jansen
40*59599516SKenneth E. Jansen        real*8 Bdiagvec(nshg,nflow), rerr(nshg,10)
41*59599516SKenneth E. Jansen
42*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
43*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
44*59599516SKenneth E. Jansen
45*59599516SKenneth E. Jansen	ttim(80) = ttim(80) - secs(0.0)
46*59599516SKenneth E. Jansenc
47*59599516SKenneth E. Jansenc.... set up the timer
48*59599516SKenneth E. Jansenc
49*59599516SKenneth E. Jansen
50*59599516SKenneth E. Jansen        call timer ('Elm_Form')
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
53*59599516SKenneth E. Jansenc
54*59599516SKenneth E. Jansenc.... set up parameters
55*59599516SKenneth E. Jansenc
56*59599516SKenneth E. Jansen        ires   = 1
57*59599516SKenneth E. Jansenc
58*59599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
59*59599516SKenneth E. Jansen                                                       ! of qdiff
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
62*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
63*59599516SKenneth E. Jansenc
64*59599516SKenneth E. Jansen        qres = zero
65*59599516SKenneth E. Jansen        rmass = zero
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen        do iblk = 1, nelblk
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansenc.... set up the parameters
70*59599516SKenneth E. Jansenc
71*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
72*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
73*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
74*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
75*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
76*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
77*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
78*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
79*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
80*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
81*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
82*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
83*59599516SKenneth E. Jansenc
84*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
85*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
86*59599516SKenneth E. Jansen
87*59599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
88*59599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
89*59599516SKenneth E. Jansen
90*59599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
91*59599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
92*59599516SKenneth E. Jansen
93*59599516SKenneth E. Jansen          call AsIq (y,                x,
94*59599516SKenneth E. Jansen     &               tmpshp,
95*59599516SKenneth E. Jansen     &               tmpshgl,
96*59599516SKenneth E. Jansen     &               mien(iblk)%p,     mxmudmi(iblk)%p,
97*59599516SKenneth E. Jansen     &               qres,
98*59599516SKenneth E. Jansen     &               rmass)
99*59599516SKenneth E. Jansen
100*59599516SKenneth E. Jansen          deallocate ( tmpshp )
101*59599516SKenneth E. Jansen          deallocate ( tmpshgl )
102*59599516SKenneth E. Jansen       enddo
103*59599516SKenneth E. Jansen
104*59599516SKenneth E. Jansenc
105*59599516SKenneth E. Jansenc.... take care of periodic boundary conditions
106*59599516SKenneth E. Jansenc
107*59599516SKenneth E. Jansen
108*59599516SKenneth E. Jansen       call qpbc( rmass, qres, iBC,  iper, ilwork )
109*59599516SKenneth E. Jansenc
110*59599516SKenneth E. Jansen      endif                     ! computation of global diffusive flux
111*59599516SKenneth E. Jansenc
112*59599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals
113*59599516SKenneth E. Jansenc
114*59599516SKenneth E. Jansenc
115*59599516SKenneth E. Jansenc.... initialize the arrays
116*59599516SKenneth E. Jansenc
117*59599516SKenneth E. Jansen        res    = zero
118*59599516SKenneth E. Jansen        rmes   = zero ! to avoid trap_uninitialized
119*59599516SKenneth E. Jansen        if (lhs. eq. 1)   EGmass = zero
120*59599516SKenneth E. Jansen        if (iprec .ne. 0) BDiag = zero
121*59599516SKenneth E. Jansen        flxID = zero
122*59599516SKenneth E. Jansen
123*59599516SKenneth E. Jansenc
124*59599516SKenneth E. Jansenc.... loop over the element-blocks
125*59599516SKenneth E. Jansenc
126*59599516SKenneth E. Jansen        do iblk = 1, nelblk
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansenc.... set up the parameters
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. Jansen          iblkts = iblk          ! used in timeseries
131*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
132*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
133*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
134*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
135*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
136*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
137*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
138*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
139*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
140*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
141*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
142*59599516SKenneth E. Jansen          inum   = iel + npro - 1
143*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
144*59599516SKenneth E. Jansenc
145*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
146*59599516SKenneth E. Jansenc
147*59599516SKenneth E. Jansen
148*59599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
149*59599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
150*59599516SKenneth E. Jansen
151*59599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
152*59599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
153*59599516SKenneth E. Jansen
154*59599516SKenneth E. Jansen          call AsIGMR (y,                   ac,
155*59599516SKenneth E. Jansen     &                 x,                   mxmudmi(iblk)%p,
156*59599516SKenneth E. Jansen     &                 tmpshp,
157*59599516SKenneth E. Jansen     &                 tmpshgl,             mien(iblk)%p,
158*59599516SKenneth E. Jansen     &                 mmat(iblk)%p,        res,
159*59599516SKenneth E. Jansen     &                 rmes,                BDiag,
160*59599516SKenneth E. Jansen     &                 qres,                EGmass(iel:inum,:,:),
161*59599516SKenneth E. Jansen     &                 rerr)
162*59599516SKenneth E. Jansenc
163*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansen          call bc3LHS (iBC,                  BC,  mien(iblk)%p,
166*59599516SKenneth E. Jansen     &                 EGmass(iel:inum,:,:)  )
167*59599516SKenneth E. Jansen
168*59599516SKenneth E. Jansen          deallocate ( tmpshp )
169*59599516SKenneth E. Jansen          deallocate ( tmpshgl )
170*59599516SKenneth E. Jansenc
171*59599516SKenneth E. Jansenc.... end of interior element loop
172*59599516SKenneth E. Jansenc
173*59599516SKenneth E. Jansen       enddo
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
176*59599516SKenneth E. Jansenc
177*59599516SKenneth E. Jansenc.... loop over the boundary elements
178*59599516SKenneth E. Jansenc
179*59599516SKenneth E. Jansen        do iblk = 1, nelblb
180*59599516SKenneth E. Jansenc
181*59599516SKenneth E. Jansenc.... set up the parameters
182*59599516SKenneth E. Jansenc
183*59599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
184*59599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
185*59599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
186*59599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
187*59599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
188*59599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
189*59599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
190*59599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
191*59599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
192*59599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
193*59599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
194*59599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
195*59599516SKenneth E. Jansen          ngaussb = nintb(lcsyst)
196*59599516SKenneth E. Jansen
197*59599516SKenneth E. Jansenc
198*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
199*59599516SKenneth E. Jansenc     boundary integral
200*59599516SKenneth E. Jansenc
201*59599516SKenneth E. Jansen
202*59599516SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
203*59599516SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
204*59599516SKenneth E. Jansen
205*59599516SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
206*59599516SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
207*59599516SKenneth E. Jansen
208*59599516SKenneth E. Jansen          call AsBMFG (y,                       x,
209*59599516SKenneth E. Jansen     &                 tmpshpb,                 tmpshglb,
210*59599516SKenneth E. Jansen     &                 mienb(iblk)%p,           mmatb(iblk)%p,
211*59599516SKenneth E. Jansen     &                 miBCB(iblk)%p,           mBCB(iblk)%p,
212*59599516SKenneth E. Jansen     &                 res,                     rmes)
213*59599516SKenneth E. Jansen
214*59599516SKenneth E. Jansen          deallocate (tmpshpb)
215*59599516SKenneth E. Jansen          deallocate (tmpshglb)
216*59599516SKenneth E. Jansenc
217*59599516SKenneth E. Jansenc.... end of boundary element loop
218*59599516SKenneth E. Jansenc
219*59599516SKenneth E. Jansen        enddo
220*59599516SKenneth E. Jansenc
221*59599516SKenneth E. Jansen      ttim(80) = ttim(80) + secs(0.0)
222*59599516SKenneth E. Jansenc
223*59599516SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric
224*59599516SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead
225*59599516SKenneth E. Jansenc of a dof combination).  Take care of all nodes now so periodicity, like
226*59599516SKenneth E. Jansenc commu is a simple dof add.
227*59599516SKenneth E. Jansenc
228*59599516SKenneth E. Jansenc      if(iabc==1)               !are there any axisym bc's
229*59599516SKenneth E. Jansenc     &     call rotabc(res(1,2), iBC, BC, nflow,  'in ')
230*59599516SKenneth E. Jansen      if(iabc==1) then               !are there any axisym bc's
231*59599516SKenneth E. Jansen          call rotabc(res(1,2), iBC,  'in ')
232*59599516SKenneth E. Jansenc          Bdiagvec(:,1)=BDiag(:,1,1)
233*59599516SKenneth E. Jansenc          Bdiagvec(:,2)=BDiag(:,2,2)
234*59599516SKenneth E. Jansenc          Bdiagvec(:,3)=BDiag(:,3,3)
235*59599516SKenneth E. Jansenc          Bdiagvec(:,4)=BDiag(:,4,4)
236*59599516SKenneth E. Jansenc          Bdiagvec(:,5)=BDiag(:,5,5)
237*59599516SKenneth E. Jansenc          call rotabc(Bdiagvec(1,2), iBC, BC, 2,  'in ')
238*59599516SKenneth E. Jansenc          BDiag(:,:,:)=zero
239*59599516SKenneth E. Jansenc          BDiag(:,1,1)=Bdiagvec(:,1)
240*59599516SKenneth E. Jansenc          BDiag(:,2,2)=Bdiagvec(:,2)
241*59599516SKenneth E. Jansenc          BDiag(:,3,3)=Bdiagvec(:,3)
242*59599516SKenneth E. Jansenc          BDiag(:,4,4)=Bdiagvec(:,4)
243*59599516SKenneth E. Jansenc          BDiag(:,5,5)=Bdiagvec(:,5)
244*59599516SKenneth E. Jansen       endif
245*59599516SKenneth E. Jansen
246*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
247*59599516SKenneth E. Jansenc
248*59599516SKenneth E. Jansen
249*59599516SKenneth E. Jansen      if (numpe > 1) then
250*59599516SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'in ')
251*59599516SKenneth E. Jansen
252*59599516SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
253*59599516SKenneth E. Jansen
254*59599516SKenneth E. Jansen        if(iprec .ne. 0) call commu (BDiag, ilwork, nflow*nflow, 'in ')
255*59599516SKenneth E. Jansen      endif
256*59599516SKenneth E. Jansen
257*59599516SKenneth E. Jansenc
258*59599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
259*59599516SKenneth E. Jansenc
260*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual
261*59599516SKenneth E. Jansenc
262*59599516SKenneth E. Jansen      call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
263*59599516SKenneth E. Jansenc
264*59599516SKenneth E. Jansenc.... satisfy the BCs on the block-diagonal preconditioner
265*59599516SKenneth E. Jansenc
266*59599516SKenneth E. Jansen      if (iprec .ne. 0) then
267*59599516SKenneth E. Jansen         call bc3BDg (y,  iBC,  BC,  BDiag, iper, ilwork)
268*59599516SKenneth E. Jansen      endif
269*59599516SKenneth E. Jansenc
270*59599516SKenneth E. Jansenc.... return
271*59599516SKenneth E. Jansenc
272*59599516SKenneth E. Jansen      call timer ('Back    ')
273*59599516SKenneth E. Jansen      return
274*59599516SKenneth E. Jansen      end
275*59599516SKenneth E. Jansenc
276*59599516SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
277*59599516SKenneth E. Jansenccccccccccccc       SPARSE
278*59599516SKenneth E. Jansenc_______________________________________________________________
279*59599516SKenneth E. Jansen
280*59599516SKenneth E. Jansen        subroutine ElmGMRs (y,         ac,        x,
281*59599516SKenneth E. Jansen     &                     shp,       shgl,      iBC,
282*59599516SKenneth E. Jansen     &                     BC,        shpb,      shglb,
283*59599516SKenneth E. Jansen     &                     res,       rmes,      BDiag,
284*59599516SKenneth E. Jansen     &                     iper,      ilwork,    lhsK,
285*59599516SKenneth E. Jansen     &                     col,       row,       rerr)
286*59599516SKenneth E. Jansenc
287*59599516SKenneth E. Jansenc----------------------------------------------------------------------
288*59599516SKenneth E. Jansenc
289*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
290*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
291*59599516SKenneth E. Jansenc solver.
292*59599516SKenneth E. Jansenc
293*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
294*59599516SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
295*59599516SKenneth E. Jansenc----------------------------------------------------------------------
296*59599516SKenneth E. Jansenc
297*59599516SKenneth E. Jansen        use pointer_data
298*59599516SKenneth E. Jansen        use timedata
299*59599516SKenneth E. Jansenc
300*59599516SKenneth E. Jansen        include "common.h"
301*59599516SKenneth E. Jansen        include "mpif.h"
302*59599516SKenneth E. Jansenc
303*59599516SKenneth E. Jansen        integer col(nshg+1), row(nnz*nshg)
304*59599516SKenneth E. Jansen        real*8 lhsK(nflow*nflow,nnz_tot)
305*59599516SKenneth E. Jansen
306*59599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
307*59599516SKenneth E. Jansen     &            x(numnp,nsd),
308*59599516SKenneth E. Jansen     &            iBC(nshg),
309*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
310*59599516SKenneth E. Jansen     &            res(nshg,nflow),
311*59599516SKenneth E. Jansen     &            rmes(nshg,nflow),      BDiag(nshg,nflow,nflow),
312*59599516SKenneth E. Jansen     &            iper(nshg)
313*59599516SKenneth E. Jansenc
314*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
315*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
316*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
317*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
318*59599516SKenneth E. Jansenc
319*59599516SKenneth E. Jansen        dimension qres(nshg, idflx),     rmass(nshg)
320*59599516SKenneth E. Jansenc
321*59599516SKenneth E. Jansen        dimension ilwork(nlwork)
322*59599516SKenneth E. Jansen
323*59599516SKenneth E. Jansen        real*8 Bdiagvec(nshg,nflow), rerr(nshg,10)
324*59599516SKenneth E. Jansen
325*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
326*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
327*59599516SKenneth E. Jansen        real*8, allocatable :: EGmass(:,:,:)
328*59599516SKenneth E. Jansen	ttim(80) = ttim(80) - secs(0.0)
329*59599516SKenneth E. Jansenc
330*59599516SKenneth E. Jansenc.... set up the timer
331*59599516SKenneth E. Jansenc
332*59599516SKenneth E. Jansen
333*59599516SKenneth E. Jansen        call timer ('Elm_Form')
334*59599516SKenneth E. Jansenc
335*59599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
336*59599516SKenneth E. Jansenc
337*59599516SKenneth E. Jansenc.... set up parameters
338*59599516SKenneth E. Jansenc
339*59599516SKenneth E. Jansen        ires   = 1
340*59599516SKenneth E. Jansenc
341*59599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
342*59599516SKenneth E. Jansen                                                       ! of qdiff
343*59599516SKenneth E. Jansenc
344*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
345*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
346*59599516SKenneth E. Jansenc
347*59599516SKenneth E. Jansen        qres = zero
348*59599516SKenneth E. Jansen        rmass = zero
349*59599516SKenneth E. Jansen
350*59599516SKenneth E. Jansen        do iblk = 1, nelblk
351*59599516SKenneth E. Jansenc
352*59599516SKenneth E. Jansenc.... set up the parameters
353*59599516SKenneth E. Jansenc
354*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
355*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
356*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
357*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
358*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
359*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
360*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
361*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
362*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
363*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
364*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
365*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
366*59599516SKenneth E. Jansenc
367*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
368*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
369*59599516SKenneth E. Jansen
370*59599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
371*59599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
372*59599516SKenneth E. Jansen
373*59599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
374*59599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
375*59599516SKenneth E. Jansen
376*59599516SKenneth E. Jansen          call AsIq (y,                x,
377*59599516SKenneth E. Jansen     &               tmpshp,
378*59599516SKenneth E. Jansen     &               tmpshgl,
379*59599516SKenneth E. Jansen     &               mien(iblk)%p,     mxmudmi(iblk)%p,
380*59599516SKenneth E. Jansen     &               qres,
381*59599516SKenneth E. Jansen     &               rmass)
382*59599516SKenneth E. Jansen
383*59599516SKenneth E. Jansen          deallocate ( tmpshp )
384*59599516SKenneth E. Jansen          deallocate ( tmpshgl )
385*59599516SKenneth E. Jansen       enddo
386*59599516SKenneth E. Jansen
387*59599516SKenneth E. Jansenc
388*59599516SKenneth E. Jansenc.... take care of periodic boundary conditions
389*59599516SKenneth E. Jansenc
390*59599516SKenneth E. Jansen
391*59599516SKenneth E. Jansen       call qpbc( rmass, qres, iBC, iper, ilwork )
392*59599516SKenneth E. Jansenc
393*59599516SKenneth E. Jansen      endif                     ! computation of global diffusive flux
394*59599516SKenneth E. Jansenc
395*59599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals
396*59599516SKenneth E. Jansenc
397*59599516SKenneth E. Jansenc
398*59599516SKenneth E. Jansenc.... initialize the arrays
399*59599516SKenneth E. Jansenc
400*59599516SKenneth E. Jansen        res    = zero
401*59599516SKenneth E. Jansen        rmes   = zero ! to avoid trap_uninitialized
402*59599516SKenneth E. Jansen        if (lhs. eq. 1)   lhsK = zero
403*59599516SKenneth E. Jansen        if (iprec .ne. 0) BDiag = zero
404*59599516SKenneth E. Jansen        flxID = zero
405*59599516SKenneth E. Jansenc
406*59599516SKenneth E. Jansenc.... loop over the element-blocks
407*59599516SKenneth E. Jansenc
408*59599516SKenneth E. Jansen        do iblk = 1, nelblk
409*59599516SKenneth E. Jansenc
410*59599516SKenneth E. Jansenc.... set up the parameters
411*59599516SKenneth E. Jansenc
412*59599516SKenneth E. Jansen          iblkts = iblk          ! used in timeseries
413*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
414*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
415*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
416*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
417*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
418*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
419*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
420*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
421*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
422*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
423*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
424*59599516SKenneth E. Jansen          inum   = iel + npro - 1
425*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
426*59599516SKenneth E. Jansenc
427*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
428*59599516SKenneth E. Jansenc
429*59599516SKenneth E. Jansen
430*59599516SKenneth E. Jansen          if(lhs.eq.1) then
431*59599516SKenneth E. Jansen             allocate (EGmass(npro,nedof,nedof))
432*59599516SKenneth E. Jansen             EGmass = zero
433*59599516SKenneth E. Jansen          else
434*59599516SKenneth E. Jansen             allocate (EGmass(1,1,1))
435*59599516SKenneth E. Jansen          endif
436*59599516SKenneth E. Jansen
437*59599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
438*59599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
439*59599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
440*59599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
441*59599516SKenneth E. Jansen
442*59599516SKenneth E. Jansen          call AsIGMR (y,                   ac,
443*59599516SKenneth E. Jansen     &                 x,                   mxmudmi(iblk)%p,
444*59599516SKenneth E. Jansen     &                 tmpshp,
445*59599516SKenneth E. Jansen     &                 tmpshgl,             mien(iblk)%p,
446*59599516SKenneth E. Jansen     &                 mmat(iblk)%p,        res,
447*59599516SKenneth E. Jansen     &                 rmes,                BDiag,
448*59599516SKenneth E. Jansen     &                 qres,                EGmass,
449*59599516SKenneth E. Jansen     &                 rerr )
450*59599516SKenneth E. Jansen          if(lhs.eq.1) then
451*59599516SKenneth E. Jansenc
452*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
453*59599516SKenneth E. Jansenc
454*59599516SKenneth E. Jansen             call bc3LHS (iBC,                  BC,  mien(iblk)%p,
455*59599516SKenneth E. Jansen     &                    EGmass  )
456*59599516SKenneth E. Jansen
457*59599516SKenneth E. Jansenc
458*59599516SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix
459*59599516SKenneth E. Jansenc
460*59599516SKenneth E. Jansen             call fillsparseC( mien(iblk)%p, EGmass,
461*59599516SKenneth E. Jansen     1                        lhsK, row, col)
462*59599516SKenneth E. Jansen          endif
463*59599516SKenneth E. Jansenc
464*59599516SKenneth E. Jansen          deallocate ( EGmass )
465*59599516SKenneth E. Jansen          deallocate ( tmpshp )
466*59599516SKenneth E. Jansen          deallocate ( tmpshgl )
467*59599516SKenneth E. Jansenc
468*59599516SKenneth E. Jansenc.... end of interior element loop
469*59599516SKenneth E. Jansenc
470*59599516SKenneth E. Jansen       enddo
471*59599516SKenneth E. Jansenc
472*59599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
473*59599516SKenneth E. Jansenc
474*59599516SKenneth E. Jansenc.... loop over the boundary elements
475*59599516SKenneth E. Jansenc
476*59599516SKenneth E. Jansen        do iblk = 1, nelblb
477*59599516SKenneth E. Jansenc
478*59599516SKenneth E. Jansenc.... set up the parameters
479*59599516SKenneth E. Jansenc
480*59599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
481*59599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
482*59599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
483*59599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
484*59599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
485*59599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
486*59599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
487*59599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
488*59599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
489*59599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
490*59599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
491*59599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
492*59599516SKenneth E. Jansen          ngaussb = nintb(lcsyst)
493*59599516SKenneth E. Jansen
494*59599516SKenneth E. Jansenc
495*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
496*59599516SKenneth E. Jansenc     boundary integral
497*59599516SKenneth E. Jansenc
498*59599516SKenneth E. Jansen
499*59599516SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
500*59599516SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
501*59599516SKenneth E. Jansen
502*59599516SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
503*59599516SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
504*59599516SKenneth E. Jansen
505*59599516SKenneth E. Jansen          call AsBMFG (y,                       x,
506*59599516SKenneth E. Jansen     &                 tmpshpb,                 tmpshglb,
507*59599516SKenneth E. Jansen     &                 mienb(iblk)%p,           mmatb(iblk)%p,
508*59599516SKenneth E. Jansen     &                 miBCB(iblk)%p,           mBCB(iblk)%p,
509*59599516SKenneth E. Jansen     &                 res,                     rmes)
510*59599516SKenneth E. Jansen
511*59599516SKenneth E. Jansen          deallocate (tmpshpb)
512*59599516SKenneth E. Jansen          deallocate (tmpshglb)
513*59599516SKenneth E. Jansenc
514*59599516SKenneth E. Jansenc.... end of boundary element loop
515*59599516SKenneth E. Jansenc
516*59599516SKenneth E. Jansen        enddo
517*59599516SKenneth E. Jansenc
518*59599516SKenneth E. Jansen      ttim(80) = ttim(80) + secs(0.0)
519*59599516SKenneth E. Jansenc
520*59599516SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric
521*59599516SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead
522*59599516SKenneth E. Jansenc of a dof combination).  Take care of all nodes now so periodicity, like
523*59599516SKenneth E. Jansenc commu is a simple dof add.
524*59599516SKenneth E. Jansenc
525*59599516SKenneth E. Jansen      if(iabc==1) then               !are there any axisym bc's
526*59599516SKenneth E. Jansen          call rotabc(res(1,2), iBC,  'in ')
527*59599516SKenneth E. Jansenc          Bdiagvec(:,1)=BDiag(:,1,1)
528*59599516SKenneth E. Jansenc          Bdiagvec(:,2)=BDiag(:,2,2)
529*59599516SKenneth E. Jansenc          Bdiagvec(:,3)=BDiag(:,3,3)
530*59599516SKenneth E. Jansenc          Bdiagvec(:,4)=BDiag(:,4,4)
531*59599516SKenneth E. Jansenc          Bdiagvec(:,5)=BDiag(:,5,5)
532*59599516SKenneth E. Jansenc          call rotabc(Bdiagvec(1,2), iBC,  'in ')
533*59599516SKenneth E. Jansenc          BDiag(:,:,:)=zero
534*59599516SKenneth E. Jansenc          BDiag(:,1,1)=Bdiagvec(:,1)
535*59599516SKenneth E. Jansenc          BDiag(:,2,2)=Bdiagvec(:,2)
536*59599516SKenneth E. Jansenc          BDiag(:,3,3)=Bdiagvec(:,3)
537*59599516SKenneth E. Jansenc          BDiag(:,4,4)=Bdiagvec(:,4)
538*59599516SKenneth E. Jansenc          BDiag(:,5,5)=Bdiagvec(:,5)
539*59599516SKenneth E. Jansen       endif
540*59599516SKenneth E. Jansen
541*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
542*59599516SKenneth E. Jansenc
543*59599516SKenneth E. Jansen
544*59599516SKenneth E. Jansen      if (numpe > 1) then
545*59599516SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'in ')
546*59599516SKenneth E. Jansen
547*59599516SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
548*59599516SKenneth E. Jansen
549*59599516SKenneth E. Jansen        if(iprec .ne. 0) call commu (BDiag, ilwork, nflow*nflow, 'in ')
550*59599516SKenneth E. Jansen      endif
551*59599516SKenneth E. Jansen
552*59599516SKenneth E. Jansenc
553*59599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
554*59599516SKenneth E. Jansenc
555*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual
556*59599516SKenneth E. Jansenc
557*59599516SKenneth E. Jansen      call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
558*59599516SKenneth E. Jansenc
559*59599516SKenneth E. Jansenc.... satisfy the BCs on the block-diagonal preconditioner
560*59599516SKenneth E. Jansenc
561*59599516SKenneth E. Jansenc  This code fragment would extract the "on processor diagonal
562*59599516SKenneth E. Jansenc      blocks". lhsK alread has the BC's applied to it (using BC3lhs),
563*59599516SKenneth E. Jansenc      though it was on an ebe basis. For now, we forgo this and still
564*59599516SKenneth E. Jansenc      form BDiag before BC3lhs, leaving the need to still apply BC's
565*59599516SKenneth E. Jansenc      below.  Keep in mind that if we used the code fragment below we
566*59599516SKenneth E. Jansenc      would still need to make BDiag periodic since BC3lhs did not do
567*59599516SKenneth E. Jansenc      that part.
568*59599516SKenneth E. Jansenc
569*59599516SKenneth E. Jansen      if (iprec .ne. 0) then
570*59599516SKenneth E. Jansenc$$$         do iaa=1,nshg
571*59599516SKenneth E. Jansenc$$$            k = sparseloc( row(col(iaa)), col(iaa+1)-colm(iaa), iaa )
572*59599516SKenneth E. Jansenc$$$     &       + colm(iaa)-1
573*59599516SKenneth E. Jansenc$$$            do idof=1,nflow
574*59599516SKenneth E. Jansenc$$$               do jdof=1,nflow
575*59599516SKenneth E. Jansenc$$$                  idx=idof+(jdof-1)*nflow
576*59599516SKenneth E. Jansenc$$$                  BDiag(iaa,idof,jdof)=lhsK(idx,k)
577*59599516SKenneth E. Jansenc$$$               enddo
578*59599516SKenneth E. Jansenc$$$            enddo
579*59599516SKenneth E. Jansenc$$$         enddo
580*59599516SKenneth E. Jansen         call bc3BDg (y,  iBC,  BC,  BDiag, iper, ilwork)
581*59599516SKenneth E. Jansen      endif
582*59599516SKenneth E. Jansenc
583*59599516SKenneth E. Jansenc.... return
584*59599516SKenneth E. Jansenc
585*59599516SKenneth E. Jansen      call timer ('Back    ')
586*59599516SKenneth E. Jansen      return
587*59599516SKenneth E. Jansen      end
588*59599516SKenneth E. Jansenc
589*59599516SKenneth E. Jansenc
590*59599516SKenneth E. Jansen
591*59599516SKenneth E. Jansenc
592*59599516SKenneth E. Jansen        subroutine ElmGMRSclr(y,      ac,
593*59599516SKenneth E. Jansen     &                        x,      elDw,
594*59599516SKenneth E. Jansen     &                        shp,    shgl,   iBC,
595*59599516SKenneth E. Jansen     &                        BC,     shpb,   shglb,
596*59599516SKenneth E. Jansen     &                        rest,   rmest,  Diag,
597*59599516SKenneth E. Jansen     &                        iper,   ilwork, EGmasst)
598*59599516SKenneth E. Jansenc
599*59599516SKenneth E. Jansenc----------------------------------------------------------------------
600*59599516SKenneth E. Jansenc
601*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
602*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
603*59599516SKenneth E. Jansenc solver.
604*59599516SKenneth E. Jansenc
605*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
606*59599516SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
607*59599516SKenneth E. Jansenc----------------------------------------------------------------------
608*59599516SKenneth E. Jansenc
609*59599516SKenneth E. Jansen        use pointer_data
610*59599516SKenneth E. Jansenc
611*59599516SKenneth E. Jansen        include "common.h"
612*59599516SKenneth E. Jansen        include "mpif.h"
613*59599516SKenneth E. Jansenc
614*59599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
615*59599516SKenneth E. Jansen     &            x(numnp,nsd),
616*59599516SKenneth E. Jansen     &            iBC(nshg),
617*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
618*59599516SKenneth E. Jansen     &            rest(nshg),           Diag(nshg),
619*59599516SKenneth E. Jansen     &            rmest(nshg),          BDiag(nshg,nflow,nflow),
620*59599516SKenneth E. Jansen     &            iper(nshg),           EGmasst(numel,nshape,nshape)
621*59599516SKenneth E. Jansenc
622*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
623*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
624*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
625*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
626*59599516SKenneth E. Jansenc
627*59599516SKenneth E. Jansen        dimension qrest(nshg),          rmasst(nshg)
628*59599516SKenneth E. Jansenc
629*59599516SKenneth E. Jansen        dimension ilwork(nlwork)
630*59599516SKenneth E. Jansen        dimension elDw(numel)
631*59599516SKenneth E. Jansenc
632*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
633*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
634*59599516SKenneth E. Jansen        real*8, allocatable :: elDwl(:)
635*59599516SKenneth E. Jansenc
636*59599516SKenneth E. Jansen	ttim(80) = ttim(80) - tmr()
637*59599516SKenneth E. Jansenc
638*59599516SKenneth E. Jansenc.... set up the timer
639*59599516SKenneth E. Jansenc
640*59599516SKenneth E. Jansen
641*59599516SKenneth E. Jansen        call timer ('Elm_Form')
642*59599516SKenneth E. Jansenc
643*59599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
644*59599516SKenneth E. Jansenc
645*59599516SKenneth E. Jansenc.... set up parameters
646*59599516SKenneth E. Jansenc
647*59599516SKenneth E. Jansen        intrul = intg  (1,itseq)
648*59599516SKenneth E. Jansen        intind = intpt (intrul)
649*59599516SKenneth E. Jansenc
650*59599516SKenneth E. Jansen        ires   = 1
651*59599516SKenneth E. Jansen
652*59599516SKenneth E. Jansenc       if (idiff>=1) then  ! global reconstruction of qdiff
653*59599516SKenneth E. Jansenc
654*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
655*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
656*59599516SKenneth E. Jansenc
657*59599516SKenneth E. Jansenc        qrest = zero
658*59599516SKenneth E. Jansenc        rmasst = zero
659*59599516SKenneth E. Jansenc
660*59599516SKenneth E. Jansenc        do iblk = 1, nelblk
661*59599516SKenneth E. Jansenc
662*59599516SKenneth E. Jansenc.... set up the parameters
663*59599516SKenneth E. Jansenc
664*59599516SKenneth E. Jansenc          iel    = lcblk(1,iblk)
665*59599516SKenneth E. Jansenc          lelCat = lcblk(2,iblk)
666*59599516SKenneth E. Jansenc          lcsyst = lcblk(3,iblk)
667*59599516SKenneth E. Jansenc          iorder = lcblk(4,iblk)
668*59599516SKenneth E. Jansenc          nenl   = lcblk(5,iblk)   ! no. of vertices per element
669*59599516SKenneth E. Jansenc          mattyp = lcblk(7,iblk)
670*59599516SKenneth E. Jansenc          ndofl  = lcblk(8,iblk)
671*59599516SKenneth E. Jansenc          nsymdl = lcblk(9,iblk)
672*59599516SKenneth E. Jansenc          npro   = lcblk(1,iblk+1) - iel
673*59599516SKenneth E. Jansenc
674*59599516SKenneth E. Jansenc          nintg  = numQpt (nsd,intrul,lcsyst)
675*59599516SKenneth E. Jansenc
676*59599516SKenneth E. Jansenc
677*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
678*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
679*59599516SKenneth E. Jansenc
680*59599516SKenneth E. Jansenc          call AsIq (y,                x,
681*59599516SKenneth E. Jansenc     &               shp(1,intind,lelCat),
682*59599516SKenneth E. Jansenc     &               shgl(1,intind,lelCat),
683*59599516SKenneth E. Jansenc     &               mien(iblk)%p,    mxmudmi(iblk)%p,
684*59599516SKenneth E. Jansenc     &               qres,           rmass )
685*59599516SKenneth E. Jansenc
686*59599516SKenneth E. Jansenc       enddo
687*59599516SKenneth E. Jansenc
688*59599516SKenneth E. Jansenc
689*59599516SKenneth E. Jansenc.... compute qi for node A, i.e., qres <-- qres/rmass
690*59599516SKenneth E. Jansenc
691*59599516SKenneth E. Jansenc       if (numpe > 1) then
692*59599516SKenneth E. Jansenc          call commu (qres  , ilwork, (ndof-1)*nsd  , 'in ')
693*59599516SKenneth E. Jansenc          call commu (rmass , ilwork,  1            , 'in ')
694*59599516SKenneth E. Jansenc       endif
695*59599516SKenneth E. Jansenc
696*59599516SKenneth E. Jansenc.... take care of periodic boundary conditions
697*59599516SKenneth E. Jansenc
698*59599516SKenneth E. Jansenc       call qpbc( rmass, qres, iBC, iper )
699*59599516SKenneth E. Jansenc
700*59599516SKenneth E. Jansenc       rmass = one/rmass
701*59599516SKenneth E. Jansenc
702*59599516SKenneth E. Jansenc       do i=1, (nflow-1)*nsd
703*59599516SKenneth E. Jansenc          qres(:,i) = rmass*qres(:,i)
704*59599516SKenneth E. Jansenc       enddo
705*59599516SKenneth E. Jansenc
706*59599516SKenneth E. Jansenc       if(numpe > 1) then
707*59599516SKenneth E. Jansenc          call commu (qres, ilwork, (nflow-1)*nsd, 'out')
708*59599516SKenneth E. Jansenc       endif
709*59599516SKenneth E. Jansenc
710*59599516SKenneth E. Jansenc      endif                     ! computation of global diffusive flux
711*59599516SKenneth E. Jansenc
712*59599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals
713*59599516SKenneth E. Jansenc
714*59599516SKenneth E. Jansenc
715*59599516SKenneth E. Jansenc.... initialize the arrays
716*59599516SKenneth E. Jansenc
717*59599516SKenneth E. Jansen        rest    = zero
718*59599516SKenneth E. Jansen        rmest   = zero ! to avoid trap_uninitialized
719*59599516SKenneth E. Jansen        if (lhs .eq. 1)   EGmasst = zero
720*59599516SKenneth E. Jansen        if (iprec. ne. 0)   Diag  = zero
721*59599516SKenneth E. Jansenc
722*59599516SKenneth E. Jansenc.... loop over the element-blocks
723*59599516SKenneth E. Jansenc
724*59599516SKenneth E. Jansen        do iblk = 1, nelblk
725*59599516SKenneth E. Jansenc
726*59599516SKenneth E. Jansenc
727*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
728*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
729*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
730*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
731*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
732*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
733*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
734*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
735*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
736*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
737*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
738*59599516SKenneth E. Jansen          inum   = iel + npro - 1
739*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
740*59599516SKenneth E. Jansenc
741*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
742*59599516SKenneth E. Jansenc
743*59599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
744*59599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
745*59599516SKenneth E. Jansen
746*59599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
747*59599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
748*59599516SKenneth E. Jansen
749*59599516SKenneth E. Jansen          allocate (elDwl(npro))
750*59599516SKenneth E. Jansenc
751*59599516SKenneth E. Jansen          call AsIGMRSclr(y,
752*59599516SKenneth E. Jansen     &                    ac,
753*59599516SKenneth E. Jansen     &                    x,               elDwl,
754*59599516SKenneth E. Jansen     &                    tmpshp,          tmpshgl,
755*59599516SKenneth E. Jansen     &                    mien(iblk)%p,
756*59599516SKenneth E. Jansen     &                    mmat(iblk)%p,    rest,
757*59599516SKenneth E. Jansen     &                    rmest,
758*59599516SKenneth E. Jansen     &                    qrest,           EGmasst(iel:inum,:,:),
759*59599516SKenneth E. Jansen     &                    Diag )
760*59599516SKenneth E. Jansenc
761*59599516SKenneth E. Jansen
762*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
763*59599516SKenneth E. Jansenc
764*59599516SKenneth E. Jansen          call bc3LHSSclr (iBC, mien(iblk)%p, EGmasst(iel:inum,:,:) )
765*59599516SKenneth E. Jansenc
766*59599516SKenneth E. Jansen          elDw(iel:iel+npro)=elDwl(1:npro)
767*59599516SKenneth E. Jansen          deallocate ( elDwl )
768*59599516SKenneth E. Jansen          deallocate ( tmpshp )
769*59599516SKenneth E. Jansen          deallocate ( tmpshgl )
770*59599516SKenneth E. Jansenc.... end of interior element loop
771*59599516SKenneth E. Jansenc
772*59599516SKenneth E. Jansen       enddo
773*59599516SKenneth E. Jansenc
774*59599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
775*59599516SKenneth E. Jansenc
776*59599516SKenneth E. Jansenc.... set up parameters
777*59599516SKenneth E. Jansenc
778*59599516SKenneth E. Jansen        intrul = intg   (2,itseq)
779*59599516SKenneth E. Jansen        intind = intptb (intrul)
780*59599516SKenneth E. Jansenc
781*59599516SKenneth E. Jansenc.... loop over the boundary elements
782*59599516SKenneth E. Jansenc
783*59599516SKenneth E. Jansen        do iblk = 1, nelblb
784*59599516SKenneth E. Jansenc
785*59599516SKenneth E. Jansenc.... set up the parameters
786*59599516SKenneth E. Jansenc
787*59599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
788*59599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
789*59599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
790*59599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
791*59599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
792*59599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
793*59599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
794*59599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
795*59599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
796*59599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
797*59599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
798*59599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
799*59599516SKenneth E. Jansen          ngaussb = nintb(lcsyst)
800*59599516SKenneth E. Jansenc
801*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
802*59599516SKenneth E. Jansenc     boundary integral
803*59599516SKenneth E. Jansenc
804*59599516SKenneth E. Jansen
805*59599516SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
806*59599516SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
807*59599516SKenneth E. Jansen
808*59599516SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
809*59599516SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
810*59599516SKenneth E. Jansenc
811*59599516SKenneth E. Jansen          call AsBMFGSclr (y,                  x,
812*59599516SKenneth E. Jansen     &                     tmpshpb,
813*59599516SKenneth E. Jansen     &                     tmpshglb,
814*59599516SKenneth E. Jansen     &                     mienb(iblk)%p,      mmatb(iblk)%p,
815*59599516SKenneth E. Jansen     &                     miBCB(iblk)%p,      mBCB(iblk)%p,
816*59599516SKenneth E. Jansen     &                     rest,               rmest)
817*59599516SKenneth E. Jansenc
818*59599516SKenneth E. Jansen          deallocate ( tmpshpb )
819*59599516SKenneth E. Jansen          deallocate ( tmpshglb )
820*59599516SKenneth E. Jansen
821*59599516SKenneth E. Jansenc.... end of boundary element loop
822*59599516SKenneth E. Jansenc
823*59599516SKenneth E. Jansen        enddo
824*59599516SKenneth E. Jansen
825*59599516SKenneth E. Jansen
826*59599516SKenneth E. Jansen      ttim(80) = ttim(80) + tmr()
827*59599516SKenneth E. Jansenc
828*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
829*59599516SKenneth E. Jansenc
830*59599516SKenneth E. Jansen
831*59599516SKenneth E. Jansen      if (numpe > 1) then
832*59599516SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'in ')
833*59599516SKenneth E. Jansen
834*59599516SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
835*59599516SKenneth E. Jansen
836*59599516SKenneth E. Jansen        if(iprec .ne. 0) call commu (Diag, ilwork, 1, 'in ')
837*59599516SKenneth E. Jansen      endif
838*59599516SKenneth E. Jansen
839*59599516SKenneth E. Jansenc
840*59599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
841*59599516SKenneth E. Jansenc
842*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual
843*59599516SKenneth E. Jansenc
844*59599516SKenneth E. Jansen      call bc3ResSclr (y,  iBC,  BC,  rest,  iper, ilwork)
845*59599516SKenneth E. Jansenc
846*59599516SKenneth E. Jansenc.... satisfy the BCs on the preconditioner
847*59599516SKenneth E. Jansenc
848*59599516SKenneth E. Jansen      call bc3BDgSclr (iBC, Diag, iper, ilwork)
849*59599516SKenneth E. Jansenc
850*59599516SKenneth E. Jansenc.... return
851*59599516SKenneth E. Jansenc
852*59599516SKenneth E. Jansen      call timer ('Back    ')
853*59599516SKenneth E. Jansen      return
854*59599516SKenneth E. Jansen      end
855*59599516SKenneth E. Jansen
856