xref: /phasta/phSolver/compressible/elmgmrpetsc.f (revision 1016729149754f57cd03fe576ba6fd0f1723ab31)
1*10167291SKenneth E. Jansenc
2*10167291SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
3*10167291SKenneth E. Jansenccccccccccccc       SPARSE
4*10167291SKenneth E. Jansenc_______________________________________________________________
5*10167291SKenneth E. Jansen
6*10167291SKenneth E. Jansen        subroutine ElmGMRPETSc (y,         ac,        x,
7*10167291SKenneth E. Jansen     &                     shp,       shgl,      iBC,
8*10167291SKenneth E. Jansen     &                     BC,        shpb,      shglb,
9*10167291SKenneth E. Jansen     &                     res,       rmes,
10*10167291SKenneth E. Jansen     &                     iper,      ilwork,
11*10167291SKenneth E. Jansen     &                     rerr, lhsP)
12*10167291SKenneth E. Jansenc
13*10167291SKenneth E. Jansenc----------------------------------------------------------------------
14*10167291SKenneth E. Jansenc
15*10167291SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
16*10167291SKenneth E. Jansenc vector, for use with the GMRES
17*10167291SKenneth E. Jansenc solver.
18*10167291SKenneth E. Jansenc
19*10167291SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
20*10167291SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
21*10167291SKenneth E. Jansenc----------------------------------------------------------------------
22*10167291SKenneth E. Jansenc
23*10167291SKenneth E. Jansen        use pointer_data
24*10167291SKenneth E. Jansen        use timedata
25*10167291SKenneth E. Jansenc
26*10167291SKenneth E. Jansen        include "common.h"
27*10167291SKenneth E. Jansen        include "mpif.h"
28*10167291SKenneth E. Jansenc
29*10167291SKenneth E. Jansen!        integer col(nshg+1), row(nnz*nshg)
30*10167291SKenneth E. Jansen!        real*8 lhsK(nflow*nflow,nnz_tot)
31*10167291SKenneth E. Jansen        real*8 BDiag(1,1,1)
32*10167291SKenneth E. Jansen
33*10167291SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
34*10167291SKenneth E. Jansen     &            x(numnp,nsd),
35*10167291SKenneth E. Jansen     &            iBC(nshg),
36*10167291SKenneth E. Jansen     &            BC(nshg,ndofBC),
37*10167291SKenneth E. Jansen     &            res(nshg,nflow),
38*10167291SKenneth E. Jansen     &            rmes(nshg,nflow),
39*10167291SKenneth E. Jansen     &            iper(nshg)
40*10167291SKenneth E. Jansenc
41*10167291SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
42*10167291SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
43*10167291SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
44*10167291SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
45*10167291SKenneth E. Jansenc
46*10167291SKenneth E. Jansen        dimension qres(nshg, idflx),     rmass(nshg)
47*10167291SKenneth E. Jansenc
48*10167291SKenneth E. Jansen        dimension ilwork(nlwork)
49*10167291SKenneth E. Jansen
50*10167291SKenneth E. Jansen        real*8 Bdiagvec(nshg,nflow), rerr(nshg,10)
51*10167291SKenneth E. Jansen
52*10167291SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
53*10167291SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
54*10167291SKenneth E. Jansen        real*8, allocatable :: EGmass(:,:,:)
55*10167291SKenneth E. Jansen        integer gnode(numnp)
56*10167291SKenneth E. Jansen	ttim(80) = ttim(80) - secs(0.0)
57*10167291SKenneth E. Jansen        iprec=0
58*10167291SKenneth E. Jansenc
59*10167291SKenneth E. Jansenc.... set up the timer
60*10167291SKenneth E. Jansenc
61*10167291SKenneth E. Jansen!        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
62*10167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'top of elmgmrpetsc '
63*10167291SKenneth E. Jansen
64*10167291SKenneth E. Jansen         call timer ('Elm_Form')
65*10167291SKenneth E. Jansenc
66*10167291SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
67*10167291SKenneth E. Jansenc
68*10167291SKenneth E. Jansenc.... set up parameters
69*10167291SKenneth E. Jansenc
70*10167291SKenneth E. Jansen        ires   = 1
71*10167291SKenneth E. Jansenc
72*10167291SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
73*10167291SKenneth E. Jansen                                                       ! of qdiff
74*10167291SKenneth E. Jansenc
75*10167291SKenneth E. Jansenc loop over element blocks for the global reconstruction
76*10167291SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
77*10167291SKenneth E. Jansenc
78*10167291SKenneth E. Jansen        qres = zero
79*10167291SKenneth E. Jansen        rmass = zero
80*10167291SKenneth E. Jansen
81*10167291SKenneth E. Jansen        do iblk = 1, nelblk
82*10167291SKenneth E. Jansenc
83*10167291SKenneth E. Jansenc.... set up the parameters
84*10167291SKenneth E. Jansenc
85*10167291SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
86*10167291SKenneth E. Jansen          iel    = lcblk(1,iblk)
87*10167291SKenneth E. Jansen          lelCat = lcblk(2,iblk)
88*10167291SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
89*10167291SKenneth E. Jansen          iorder = lcblk(4,iblk)
90*10167291SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
91*10167291SKenneth E. Jansen          nshl   = lcblk(10,iblk)
92*10167291SKenneth E. Jansen          mattyp = lcblk(7,iblk)
93*10167291SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
94*10167291SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
95*10167291SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
96*10167291SKenneth E. Jansen          ngauss = nint(lcsyst)
97*10167291SKenneth E. Jansenc
98*10167291SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
99*10167291SKenneth E. Jansenc     and lumped mass matrix, rmass
100*10167291SKenneth E. Jansen
101*10167291SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
102*10167291SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
103*10167291SKenneth E. Jansen
104*10167291SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
105*10167291SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
106*10167291SKenneth E. Jansen
107*10167291SKenneth E. Jansen          call AsIq (y,                x,
108*10167291SKenneth E. Jansen     &               tmpshp,
109*10167291SKenneth E. Jansen     &               tmpshgl,
110*10167291SKenneth E. Jansen     &               mien(iblk)%p,     mxmudmi(iblk)%p,
111*10167291SKenneth E. Jansen     &               qres,
112*10167291SKenneth E. Jansen     &               rmass)
113*10167291SKenneth E. Jansen
114*10167291SKenneth E. Jansen          deallocate ( tmpshp )
115*10167291SKenneth E. Jansen          deallocate ( tmpshgl )
116*10167291SKenneth E. Jansen       enddo
117*10167291SKenneth E. Jansen
118*10167291SKenneth E. Jansenc
119*10167291SKenneth E. Jansenc.... take care of periodic boundary conditions
120*10167291SKenneth E. Jansenc
121*10167291SKenneth E. Jansen
122*10167291SKenneth E. Jansen       call qpbc( rmass, qres, iBC, iper, ilwork )
123*10167291SKenneth E. Jansenc
124*10167291SKenneth E. Jansen      endif                     ! computation of global diffusive flux
125*10167291SKenneth E. Jansenc
126*10167291SKenneth E. Jansenc.... loop over element blocks to compute element residuals
127*10167291SKenneth E. Jansenc
128*10167291SKenneth E. Jansenc
129*10167291SKenneth E. Jansenc.... initialize the arrays
130*10167291SKenneth E. Jansenc
131*10167291SKenneth E. Jansen        res    = zero
132*10167291SKenneth E. Jansen        rmes   = zero ! to avoid trap_uninitialized
133*10167291SKenneth E. Jansen        !if (lhs. eq. 1)   lhsK = zero
134*10167291SKenneth E. Jansen        flxID = zero
135*10167291SKenneth E. Jansenc
136*10167291SKenneth E. Jansenc.... loop over the element-blocks
137*10167291SKenneth E. Jansenc
138*10167291SKenneth E. Jansen!        call commu (res  , ilwork, nflow  , 'in ') !FOR TEST
139*10167291SKenneth E. Jansen!        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
140*10167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'after res zeroed '
141*10167291SKenneth E. Jansen        do iblk = 1, nelblk
142*10167291SKenneth E. Jansenc
143*10167291SKenneth E. Jansenc.... set up the parameters
144*10167291SKenneth E. Jansenc
145*10167291SKenneth E. Jansen          iblkts = iblk          ! used in timeseries
146*10167291SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
147*10167291SKenneth E. Jansen          iel    = lcblk(1,iblk)
148*10167291SKenneth E. Jansen          lelCat = lcblk(2,iblk)
149*10167291SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
150*10167291SKenneth E. Jansen          iorder = lcblk(4,iblk)
151*10167291SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
152*10167291SKenneth E. Jansen          nshl   = lcblk(10,iblk)
153*10167291SKenneth E. Jansen          mattyp = lcblk(7,iblk)
154*10167291SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
155*10167291SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
156*10167291SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
157*10167291SKenneth E. Jansen          inum   = iel + npro - 1
158*10167291SKenneth E. Jansen          ngauss = nint(lcsyst)
159*10167291SKenneth E. Jansenc
160*10167291SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
161*10167291SKenneth E. Jansenc
162*10167291SKenneth E. Jansen
163*10167291SKenneth E. Jansen          if(lhs.eq.1) then
164*10167291SKenneth E. Jansen             allocate (EGmass(npro,nedof,nedof))
165*10167291SKenneth E. Jansen             EGmass = zero
166*10167291SKenneth E. Jansen          else
167*10167291SKenneth E. Jansen             allocate (EGmass(1,1,1))
168*10167291SKenneth E. Jansen          endif
169*10167291SKenneth E. Jansen
170*10167291SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
171*10167291SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
172*10167291SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
173*10167291SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
174*10167291SKenneth E. Jansen
175*10167291SKenneth E. Jansen          call AsIGMR (y,                   ac,
176*10167291SKenneth E. Jansen     &                 x,                   mxmudmi(iblk)%p,
177*10167291SKenneth E. Jansen     &                 tmpshp,
178*10167291SKenneth E. Jansen     &                 tmpshgl,             mien(iblk)%p,
179*10167291SKenneth E. Jansen     &                 mmat(iblk)%p,        res,
180*10167291SKenneth E. Jansen     &                 rmes,                BDiag,
181*10167291SKenneth E. Jansen     &                 qres,                EGmass,
182*10167291SKenneth E. Jansen     &                 rerr )
183*10167291SKenneth E. Jansen          if(lhs.eq.1) then
184*10167291SKenneth E. Jansenc
185*10167291SKenneth E. Jansenc.... satisfy the BCs on the implicit LHS
186*10167291SKenneth E. Jansenc
187*10167291SKenneth E. Jansen             call bc3LHS (iBC,                  BC,  mien(iblk)%p,
188*10167291SKenneth E. Jansen     &                    EGmass  )
189*10167291SKenneth E. Jansen
190*10167291SKenneth E. Jansenc
191*10167291SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix
192*10167291SKenneth E. Jansenc
193*10167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'before fillsparsepetscc ',iblk
194*10167291SKenneth E. Jansen             call cycle_count_start()
195*10167291SKenneth E. Jansen             call fillsparsecpetscc( mieng(iblk)%p, EGmass, lhsP)
196*10167291SKenneth E. Jansen             call cycle_count_stop()
197*10167291SKenneth E. Jansen          endif
198*10167291SKenneth E. Jansenc
199*10167291SKenneth E. Jansen          deallocate ( EGmass )
200*10167291SKenneth E. Jansen          deallocate ( tmpshp )
201*10167291SKenneth E. Jansen          deallocate ( tmpshgl )
202*10167291SKenneth E. Jansenc
203*10167291SKenneth E. Jansenc.... end of interior element loop
204*10167291SKenneth E. Jansenc
205*10167291SKenneth E. Jansen       enddo
206*10167291SKenneth E. Jansen       if(lhs.eq.1)   call cycle_count_print()
207*10167291SKenneth E. Jansen!        call commu (res  , ilwork, nflow  , 'in ') !FOR TEST
208*10167291SKenneth E. Jansen!        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
209*10167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'after fillsparsepetscc '
210*10167291SKenneth E. Jansenc
211*10167291SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
212*10167291SKenneth E. Jansenc
213*10167291SKenneth E. Jansenc.... loop over the boundary elements
214*10167291SKenneth E. Jansenc
215*10167291SKenneth E. Jansen        do iblk = 1, nelblb
216*10167291SKenneth E. Jansenc
217*10167291SKenneth E. Jansenc.... set up the parameters
218*10167291SKenneth E. Jansenc
219*10167291SKenneth E. Jansen          iel    = lcblkb(1,iblk)
220*10167291SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
221*10167291SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
222*10167291SKenneth E. Jansen          iorder = lcblkb(4,iblk)
223*10167291SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
224*10167291SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
225*10167291SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
226*10167291SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
227*10167291SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
228*10167291SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
229*10167291SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
230*10167291SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
231*10167291SKenneth E. Jansen          ngaussb = nintb(lcsyst)
232*10167291SKenneth E. Jansen
233*10167291SKenneth E. Jansenc
234*10167291SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
235*10167291SKenneth E. Jansenc     boundary integral
236*10167291SKenneth E. Jansenc
237*10167291SKenneth E. Jansen
238*10167291SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
239*10167291SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
240*10167291SKenneth E. Jansen
241*10167291SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
242*10167291SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
243*10167291SKenneth E. Jansen
244*10167291SKenneth E. Jansen          call AsBMFG (y,                       x,
245*10167291SKenneth E. Jansen     &                 tmpshpb,                 tmpshglb,
246*10167291SKenneth E. Jansen     &                 mienb(iblk)%p,           mmatb(iblk)%p,
247*10167291SKenneth E. Jansen     &                 miBCB(iblk)%p,           mBCB(iblk)%p,
248*10167291SKenneth E. Jansen     &                 res,                     rmes)
249*10167291SKenneth E. Jansen
250*10167291SKenneth E. Jansen          deallocate (tmpshpb)
251*10167291SKenneth E. Jansen          deallocate (tmpshglb)
252*10167291SKenneth E. Jansenc
253*10167291SKenneth E. Jansenc.... end of boundary element loop
254*10167291SKenneth E. Jansenc
255*10167291SKenneth E. Jansen        enddo
256*10167291SKenneth E. Jansenc
257*10167291SKenneth E. Jansen      ttim(80) = ttim(80) + secs(0.0)
258*10167291SKenneth E. Jansenc
259*10167291SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric
260*10167291SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead
261*10167291SKenneth E. Jansenc of a dof combination).  Take care of all nodes now so periodicity, like
262*10167291SKenneth E. Jansenc commu is a simple dof add.
263*10167291SKenneth E. Jansenc
264*10167291SKenneth E. Jansen      if(iabc==1) then               !are there any axisym bc's
265*10167291SKenneth E. Jansen          call rotabc(res(1,2), iBC,  'in ')
266*10167291SKenneth E. Jansen       endif
267*10167291SKenneth E. Jansen
268*10167291SKenneth E. Jansenc.... -------------------->   communications <-------------------------
269*10167291SKenneth E. Jansenc
270*10167291SKenneth E. Jansen
271*10167291SKenneth E. Jansen      if (numpe > 1) then
272*10167291SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'in ')
273*10167291SKenneth E. Jansen
274*10167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
275*10167291SKenneth E. Jansen      endif
276*10167291SKenneth E. Jansen
277*10167291SKenneth E. Jansenc
278*10167291SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
279*10167291SKenneth E. Jansenc
280*10167291SKenneth E. Jansenc.... satisfy the BCs on the residual
281*10167291SKenneth E. Jansenc
282*10167291SKenneth E. Jansen      call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
283*10167291SKenneth E. Jansenc
284*10167291SKenneth E. Jansenc
285*10167291SKenneth E. Jansenc.... return
286*10167291SKenneth E. Jansenc
287*10167291SKenneth E. Jansen      if (numpe > 1) then
288*10167291SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'out')
289*10167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
290*10167291SKenneth E. Jansen      endif
291*10167291SKenneth E. Jansen      call timer ('Back    ')
292*10167291SKenneth E. Jansen      return
293*10167291SKenneth E. Jansen      end
294*10167291SKenneth E. Jansenc
295*10167291SKenneth E. Jansenc
296*10167291SKenneth E. Jansen
297*10167291SKenneth E. Jansenc
298*10167291SKenneth E. Jansen
299*10167291SKenneth E. Jansen        subroutine ElmGMRPETScSclr(y,      ac,
300*10167291SKenneth E. Jansen     &                        x,      elDw,
301*10167291SKenneth E. Jansen     &                        shp,    shgl,   iBC,
302*10167291SKenneth E. Jansen     &                        BC,     shpb,   shglb,
303*10167291SKenneth E. Jansen     &                        rest,   rmest,
304*10167291SKenneth E. Jansen     &                        iper,   ilwork, lhsPs)
305*10167291SKenneth E. Jansenc
306*10167291SKenneth E. Jansenc----------------------------------------------------------------------
307*10167291SKenneth E. Jansenc
308*10167291SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
309*10167291SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
310*10167291SKenneth E. Jansenc solver.
311*10167291SKenneth E. Jansenc
312*10167291SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
313*10167291SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
314*10167291SKenneth E. Jansenc----------------------------------------------------------------------
315*10167291SKenneth E. Jansenc
316*10167291SKenneth E. Jansen        use pointer_data
317*10167291SKenneth E. Jansenc
318*10167291SKenneth E. Jansen        include "common.h"
319*10167291SKenneth E. Jansen        include "mpif.h"
320*10167291SKenneth E. Jansenc
321*10167291SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
322*10167291SKenneth E. Jansen     &            x(numnp,nsd),
323*10167291SKenneth E. Jansen     &            iBC(nshg),
324*10167291SKenneth E. Jansen     &            BC(nshg,ndofBC),
325*10167291SKenneth E. Jansen     &            rest(nshg),           Diag(1),
326*10167291SKenneth E. Jansen     &            rmest(nshg),
327*10167291SKenneth E. Jansen     &            iper(nshg)
328*10167291SKenneth E. Jansenc
329*10167291SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
330*10167291SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
331*10167291SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
332*10167291SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
333*10167291SKenneth E. Jansenc
334*10167291SKenneth E. Jansen        dimension qrest(nshg),          rmasst(nshg)
335*10167291SKenneth E. Jansen        real*8 elDw(numel)
336*10167291SKenneth E. Jansenc
337*10167291SKenneth E. Jansen        dimension ilwork(nlwork)
338*10167291SKenneth E. Jansenc
339*10167291SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
340*10167291SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
341*10167291SKenneth E. Jansen        real*8, allocatable :: EGMasst(:,:,:)
342*10167291SKenneth E. Jansen        real*8, allocatable :: ElDwl(:)
343*10167291SKenneth E. Jansenc
344*10167291SKenneth E. Jansen	ttim(80) = ttim(80) - tmr()
345*10167291SKenneth E. Jansen        iprec=0
346*10167291SKenneth E. Jansenc
347*10167291SKenneth E. Jansenc.... set up the timer
348*10167291SKenneth E. Jansenc
349*10167291SKenneth E. Jansen
350*10167291SKenneth E. Jansen        call timer ('Elm_Form')
351*10167291SKenneth E. Jansenc
352*10167291SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
353*10167291SKenneth E. Jansenc
354*10167291SKenneth E. Jansenc.... set up parameters
355*10167291SKenneth E. Jansenc
356*10167291SKenneth E. Jansen        intrul = intg  (1,itseq)
357*10167291SKenneth E. Jansen        intind = intpt (intrul)
358*10167291SKenneth E. Jansenc
359*10167291SKenneth E. Jansen        ires   = 1
360*10167291SKenneth E. Jansen
361*10167291SKenneth E. Jansenc
362*10167291SKenneth E. Jansenc.... initialize the arrays
363*10167291SKenneth E. Jansenc
364*10167291SKenneth E. Jansen        rest    = zero
365*10167291SKenneth E. Jansen        rmest   = zero ! to avoid trap_uninitialized
366*10167291SKenneth E. Jansenc
367*10167291SKenneth E. Jansenc.... loop over the element-blocks
368*10167291SKenneth E. Jansenc
369*10167291SKenneth E. Jansen        do iblk = 1, nelblk
370*10167291SKenneth E. Jansenc
371*10167291SKenneth E. Jansenc
372*10167291SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
373*10167291SKenneth E. Jansen          iel    = lcblk(1,iblk)
374*10167291SKenneth E. Jansen          lelCat = lcblk(2,iblk)
375*10167291SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
376*10167291SKenneth E. Jansen          iorder = lcblk(4,iblk)
377*10167291SKenneth E. Jansen          nshl   = lcblk(10,iblk)
378*10167291SKenneth E. Jansen          mattyp = lcblk(7,iblk)
379*10167291SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
380*10167291SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
381*10167291SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
382*10167291SKenneth E. Jansen          inum   = iel + npro - 1
383*10167291SKenneth E. Jansen          ngauss = nint(lcsyst)
384*10167291SKenneth E. Jansenc
385*10167291SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
386*10167291SKenneth E. Jansenc
387*10167291SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
388*10167291SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
389*10167291SKenneth E. Jansen          if(lhs.eq.1) then
390*10167291SKenneth E. Jansen             allocate (EGMasst(npro,nshl,nshl))
391*10167291SKenneth E. Jansen             EGMasst=zero
392*10167291SKenneth E. Jansen          endif
393*10167291SKenneth E. Jansen
394*10167291SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
395*10167291SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
396*10167291SKenneth E. Jansen
397*10167291SKenneth E. Jansen          allocate (elDwl(npro))
398*10167291SKenneth E. Jansenc
399*10167291SKenneth E. Jansen          call AsIGMRSclr(y,
400*10167291SKenneth E. Jansen     &                    ac,
401*10167291SKenneth E. Jansen     &                    x,               elDwl,
402*10167291SKenneth E. Jansen     &                    tmpshp,          tmpshgl,
403*10167291SKenneth E. Jansen     &                    mien(iblk)%p,
404*10167291SKenneth E. Jansen     &                    mmat(iblk)%p,    rest,
405*10167291SKenneth E. Jansen     &                    rmest,
406*10167291SKenneth E. Jansen     &                    qrest,           EGmasst,
407*10167291SKenneth E. Jansen     &                    Diag )
408*10167291SKenneth E. Jansenc
409*10167291SKenneth E. Jansen           elDw(iel:inum) = elDwl(1:npro)
410*10167291SKenneth E. Jansen          deallocate ( elDwl )
411*10167291SKenneth E. Jansen
412*10167291SKenneth E. Jansen           if(lhs.eq.1) then
413*10167291SKenneth E. Jansenc.... satisfy the BCs on the implicit LHS
414*10167291SKenneth E. Jansenc
415*10167291SKenneth E. Jansen          call bc3LHSSclr (iBC, mien(iblk)%p, EGmasst )
416*10167291SKenneth E. Jansenc
417*10167291SKenneth E. Jansenc
418*10167291SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix
419*10167291SKenneth E. Jansenc
420*10167291SKenneth E. Jansen             call fillsparsecpetscs( mieng(iblk)%p, EGmasst, lhsPs)
421*10167291SKenneth E. Jansen          endif
422*10167291SKenneth E. Jansen          if(lhs.eq.1) deallocate ( EGmasst )
423*10167291SKenneth E. Jansen          deallocate ( tmpshp )
424*10167291SKenneth E. Jansen          deallocate ( tmpshgl )
425*10167291SKenneth E. Jansenc.... end of interior element loop
426*10167291SKenneth E. Jansenc
427*10167291SKenneth E. Jansen       enddo
428*10167291SKenneth E. Jansenc
429*10167291SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
430*10167291SKenneth E. Jansenc
431*10167291SKenneth E. Jansenc.... set up parameters
432*10167291SKenneth E. Jansenc
433*10167291SKenneth E. Jansen        intrul = intg   (2,itseq)
434*10167291SKenneth E. Jansen        intind = intptb (intrul)
435*10167291SKenneth E. Jansenc
436*10167291SKenneth E. Jansenc.... loop over the boundary elements
437*10167291SKenneth E. Jansenc
438*10167291SKenneth E. Jansen        do iblk = 1, nelblb
439*10167291SKenneth E. Jansenc
440*10167291SKenneth E. Jansenc.... set up the parameters
441*10167291SKenneth E. Jansenc
442*10167291SKenneth E. Jansen          iel    = lcblkb(1,iblk)
443*10167291SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
444*10167291SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
445*10167291SKenneth E. Jansen          iorder = lcblkb(4,iblk)
446*10167291SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
447*10167291SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
448*10167291SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
449*10167291SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
450*10167291SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
451*10167291SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
452*10167291SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
453*10167291SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
454*10167291SKenneth E. Jansen          ngaussb = nintb(lcsyst)
455*10167291SKenneth E. Jansenc
456*10167291SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
457*10167291SKenneth E. Jansenc     boundary integral
458*10167291SKenneth E. Jansenc
459*10167291SKenneth E. Jansen
460*10167291SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
461*10167291SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
462*10167291SKenneth E. Jansen
463*10167291SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
464*10167291SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
465*10167291SKenneth E. Jansenc
466*10167291SKenneth E. Jansen          call AsBMFGSclr (y,                  x,
467*10167291SKenneth E. Jansen     &                     tmpshpb,
468*10167291SKenneth E. Jansen     &                     tmpshglb,
469*10167291SKenneth E. Jansen     &                     mienb(iblk)%p,      mmatb(iblk)%p,
470*10167291SKenneth E. Jansen     &                     miBCB(iblk)%p,      mBCB(iblk)%p,
471*10167291SKenneth E. Jansen     &                     rest,               rmest)
472*10167291SKenneth E. Jansenc
473*10167291SKenneth E. Jansen          deallocate ( tmpshpb )
474*10167291SKenneth E. Jansen          deallocate ( tmpshglb )
475*10167291SKenneth E. Jansen
476*10167291SKenneth E. Jansenc.... end of boundary element loop
477*10167291SKenneth E. Jansenc
478*10167291SKenneth E. Jansen        enddo
479*10167291SKenneth E. Jansen
480*10167291SKenneth E. Jansen
481*10167291SKenneth E. Jansen      ttim(80) = ttim(80) + tmr()
482*10167291SKenneth E. Jansenc
483*10167291SKenneth E. Jansenc.... -------------------->   communications <-------------------------
484*10167291SKenneth E. Jansenc
485*10167291SKenneth E. Jansen
486*10167291SKenneth E. Jansen      if (numpe > 1) then
487*10167291SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'in ')
488*10167291SKenneth E. Jansen
489*10167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
490*10167291SKenneth E. Jansen
491*10167291SKenneth E. Jansen      endif
492*10167291SKenneth E. Jansen
493*10167291SKenneth E. Jansenc
494*10167291SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
495*10167291SKenneth E. Jansenc
496*10167291SKenneth E. Jansenc.... satisfy the BCs on the residual
497*10167291SKenneth E. Jansenc
498*10167291SKenneth E. Jansen      call bc3ResSclr (y,  iBC,  BC,  rest,  iper, ilwork)
499*10167291SKenneth E. Jansen      if (numpe > 1) then
500*10167291SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'out')
501*10167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
502*10167291SKenneth E. Jansen      endif
503*10167291SKenneth E. Jansenc
504*10167291SKenneth E. Jansenc.... return
505*10167291SKenneth E. Jansenc
506*10167291SKenneth E. Jansen      call timer ('Back    ')
507*10167291SKenneth E. Jansen      return
508*10167291SKenneth E. Jansen      end
509