xref: /phasta/phSolver/compressible/elmgmrpetsc.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08) !
110167291SKenneth E. Jansenc
210167291SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
310167291SKenneth E. Jansenccccccccccccc       SPARSE
410167291SKenneth E. Jansenc_______________________________________________________________
510167291SKenneth E. Jansen
610167291SKenneth E. Jansen        subroutine ElmGMRPETSc (y,         ac,        x,
710167291SKenneth E. Jansen     &                     shp,       shgl,      iBC,
810167291SKenneth E. Jansen     &                     BC,        shpb,      shglb,
910167291SKenneth E. Jansen     &                     res,       rmes,
1010167291SKenneth E. Jansen     &                     iper,      ilwork,
1110167291SKenneth E. Jansen     &                     rerr, lhsP)
1210167291SKenneth E. Jansenc
1310167291SKenneth E. Jansenc----------------------------------------------------------------------
1410167291SKenneth E. Jansenc
1510167291SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
1610167291SKenneth E. Jansenc vector, for use with the GMRES
1710167291SKenneth E. Jansenc solver.
1810167291SKenneth E. Jansenc
1910167291SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
2010167291SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
2110167291SKenneth E. Jansenc----------------------------------------------------------------------
2210167291SKenneth E. Jansenc
2310167291SKenneth E. Jansen        use pointer_data
240d32f9a8SKenneth E. Jansen        use timedataC
2510167291SKenneth E. Jansenc
2610167291SKenneth E. Jansen        include "common.h"
2710167291SKenneth E. Jansen        include "mpif.h"
2810167291SKenneth E. Jansenc
2910167291SKenneth E. Jansen!        integer col(nshg+1), row(nnz*nshg)
3010167291SKenneth E. Jansen!        real*8 lhsK(nflow*nflow,nnz_tot)
3110167291SKenneth E. Jansen        real*8 BDiag(1,1,1)
3210167291SKenneth E. Jansen
3310167291SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
3410167291SKenneth E. Jansen     &            x(numnp,nsd),
3510167291SKenneth E. Jansen     &            iBC(nshg),
3610167291SKenneth E. Jansen     &            BC(nshg,ndofBC),
3710167291SKenneth E. Jansen     &            res(nshg,nflow),
3810167291SKenneth E. Jansen     &            rmes(nshg,nflow),
3910167291SKenneth E. Jansen     &            iper(nshg)
4010167291SKenneth E. Jansenc
4110167291SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
4210167291SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
4310167291SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
4410167291SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
4510167291SKenneth E. Jansenc
4610167291SKenneth E. Jansen        dimension qres(nshg, idflx),     rmass(nshg)
4710167291SKenneth E. Jansenc
4810167291SKenneth E. Jansen        dimension ilwork(nlwork)
4910167291SKenneth E. Jansen
5010167291SKenneth E. Jansen        real*8 Bdiagvec(nshg,nflow), rerr(nshg,10)
5110167291SKenneth E. Jansen
5210167291SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
5310167291SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
5410167291SKenneth E. Jansen        real*8, allocatable :: EGmass(:,:,:)
5510167291SKenneth E. Jansen        integer gnode(numnp)
5610167291SKenneth E. Jansen	ttim(80) = ttim(80) - secs(0.0)
5710167291SKenneth E. Jansen        iprec=0
5810167291SKenneth E. Jansenc
5910167291SKenneth E. Jansenc.... set up the timer
6010167291SKenneth E. Jansenc
6110167291SKenneth E. Jansen!        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
6210167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'top of elmgmrpetsc '
6310167291SKenneth E. Jansen
6410167291SKenneth E. Jansen         call timer ('Elm_Form')
6510167291SKenneth E. Jansenc
6610167291SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
6710167291SKenneth E. Jansenc
6810167291SKenneth E. Jansenc.... set up parameters
6910167291SKenneth E. Jansenc
7010167291SKenneth E. Jansen        ires   = 1
7110167291SKenneth E. Jansenc
7210167291SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
7310167291SKenneth E. Jansen                                                       ! of qdiff
7410167291SKenneth E. Jansenc
7510167291SKenneth E. Jansenc loop over element blocks for the global reconstruction
7610167291SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
7710167291SKenneth E. Jansenc
7810167291SKenneth E. Jansen        qres = zero
7910167291SKenneth E. Jansen        rmass = zero
8010167291SKenneth E. Jansen
8110167291SKenneth E. Jansen        do iblk = 1, nelblk
8210167291SKenneth E. Jansenc
8310167291SKenneth E. Jansenc.... set up the parameters
8410167291SKenneth E. Jansenc
8510167291SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
8610167291SKenneth E. Jansen          iel    = lcblk(1,iblk)
8710167291SKenneth E. Jansen          lelCat = lcblk(2,iblk)
8810167291SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
8910167291SKenneth E. Jansen          iorder = lcblk(4,iblk)
9010167291SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
9110167291SKenneth E. Jansen          nshl   = lcblk(10,iblk)
9210167291SKenneth E. Jansen          mattyp = lcblk(7,iblk)
9310167291SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
9410167291SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
9510167291SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
9610167291SKenneth E. Jansen          ngauss = nint(lcsyst)
9710167291SKenneth E. Jansenc
9810167291SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
9910167291SKenneth E. Jansenc     and lumped mass matrix, rmass
10010167291SKenneth E. Jansen
10110167291SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
10210167291SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
10310167291SKenneth E. Jansen
10410167291SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
10510167291SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
10610167291SKenneth E. Jansen
10710167291SKenneth E. Jansen          call AsIq (y,                x,
10810167291SKenneth E. Jansen     &               tmpshp,
10910167291SKenneth E. Jansen     &               tmpshgl,
11010167291SKenneth E. Jansen     &               mien(iblk)%p,     mxmudmi(iblk)%p,
11110167291SKenneth E. Jansen     &               qres,
11210167291SKenneth E. Jansen     &               rmass)
11310167291SKenneth E. Jansen
11410167291SKenneth E. Jansen          deallocate ( tmpshp )
11510167291SKenneth E. Jansen          deallocate ( tmpshgl )
11610167291SKenneth E. Jansen       enddo
11710167291SKenneth E. Jansen
11810167291SKenneth E. Jansenc
11910167291SKenneth E. Jansenc.... take care of periodic boundary conditions
12010167291SKenneth E. Jansenc
12110167291SKenneth E. Jansen
12210167291SKenneth E. Jansen       call qpbc( rmass, qres, iBC, iper, ilwork )
12310167291SKenneth E. Jansenc
12410167291SKenneth E. Jansen      endif                     ! computation of global diffusive flux
12510167291SKenneth E. Jansenc
12610167291SKenneth E. Jansenc.... loop over element blocks to compute element residuals
12710167291SKenneth E. Jansenc
12810167291SKenneth E. Jansenc
12910167291SKenneth E. Jansenc.... initialize the arrays
13010167291SKenneth E. Jansenc
13110167291SKenneth E. Jansen        res    = zero
13210167291SKenneth E. Jansen        rmes   = zero ! to avoid trap_uninitialized
13310167291SKenneth E. Jansen        !if (lhs. eq. 1)   lhsK = zero
13410167291SKenneth E. Jansen        flxID = zero
13510167291SKenneth E. Jansenc
13610167291SKenneth E. Jansenc.... loop over the element-blocks
13710167291SKenneth E. Jansenc
13810167291SKenneth E. Jansen!        call commu (res  , ilwork, nflow  , 'in ') !FOR TEST
13910167291SKenneth E. Jansen!        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
14010167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'after res zeroed '
14110167291SKenneth E. Jansen        do iblk = 1, nelblk
14210167291SKenneth E. Jansenc
14310167291SKenneth E. Jansenc.... set up the parameters
14410167291SKenneth E. Jansenc
14510167291SKenneth E. Jansen          iblkts = iblk          ! used in timeseries
14610167291SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
14710167291SKenneth E. Jansen          iel    = lcblk(1,iblk)
14810167291SKenneth E. Jansen          lelCat = lcblk(2,iblk)
14910167291SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
15010167291SKenneth E. Jansen          iorder = lcblk(4,iblk)
15110167291SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
15210167291SKenneth E. Jansen          nshl   = lcblk(10,iblk)
15310167291SKenneth E. Jansen          mattyp = lcblk(7,iblk)
15410167291SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
15510167291SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
15610167291SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
15710167291SKenneth E. Jansen          inum   = iel + npro - 1
15810167291SKenneth E. Jansen          ngauss = nint(lcsyst)
15910167291SKenneth E. Jansenc
16010167291SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
16110167291SKenneth E. Jansenc
16210167291SKenneth E. Jansen
16310167291SKenneth E. Jansen          if(lhs.eq.1) then
16410167291SKenneth E. Jansen             allocate (EGmass(npro,nedof,nedof))
16510167291SKenneth E. Jansen             EGmass = zero
16610167291SKenneth E. Jansen          else
16710167291SKenneth E. Jansen             allocate (EGmass(1,1,1))
16810167291SKenneth E. Jansen          endif
16910167291SKenneth E. Jansen
17010167291SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
17110167291SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
17210167291SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
17310167291SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
17410167291SKenneth E. Jansen
17510167291SKenneth E. Jansen          call AsIGMR (y,                   ac,
17610167291SKenneth E. Jansen     &                 x,                   mxmudmi(iblk)%p,
17710167291SKenneth E. Jansen     &                 tmpshp,
17810167291SKenneth E. Jansen     &                 tmpshgl,             mien(iblk)%p,
17910167291SKenneth E. Jansen     &                 mmat(iblk)%p,        res,
18010167291SKenneth E. Jansen     &                 rmes,                BDiag,
18110167291SKenneth E. Jansen     &                 qres,                EGmass,
18210167291SKenneth E. Jansen     &                 rerr )
18310167291SKenneth E. Jansen          if(lhs.eq.1) then
18410167291SKenneth E. Jansenc
18510167291SKenneth E. Jansenc.... satisfy the BCs on the implicit LHS
18610167291SKenneth E. Jansenc
18710167291SKenneth E. Jansen             call bc3LHS (iBC,                  BC,  mien(iblk)%p,
18810167291SKenneth E. Jansen     &                    EGmass  )
18910167291SKenneth E. Jansen
19010167291SKenneth E. Jansenc
19110167291SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix
19210167291SKenneth E. Jansenc
19310167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'before fillsparsepetscc ',iblk
19410167291SKenneth E. Jansen             call cycle_count_start()
19510167291SKenneth E. Jansen             call fillsparsecpetscc( mieng(iblk)%p, EGmass, lhsP)
19610167291SKenneth E. Jansen             call cycle_count_stop()
19710167291SKenneth E. Jansen          endif
19810167291SKenneth E. Jansenc
19910167291SKenneth E. Jansen          deallocate ( EGmass )
20010167291SKenneth E. Jansen          deallocate ( tmpshp )
20110167291SKenneth E. Jansen          deallocate ( tmpshgl )
20210167291SKenneth E. Jansenc
20310167291SKenneth E. Jansenc.... end of interior element loop
20410167291SKenneth E. Jansenc
20510167291SKenneth E. Jansen       enddo
20610167291SKenneth E. Jansen       if(lhs.eq.1)   call cycle_count_print()
20710167291SKenneth E. Jansen!        call commu (res  , ilwork, nflow  , 'in ') !FOR TEST
20810167291SKenneth E. Jansen!        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
20910167291SKenneth E. Jansen!        if(myrank.eq.0) write (*,*) 'after fillsparsepetscc '
21010167291SKenneth E. Jansenc
21110167291SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
21210167291SKenneth E. Jansenc
21310167291SKenneth E. Jansenc.... loop over the boundary elements
21410167291SKenneth E. Jansenc
21510167291SKenneth E. Jansen        do iblk = 1, nelblb
21610167291SKenneth E. Jansenc
21710167291SKenneth E. Jansenc.... set up the parameters
21810167291SKenneth E. Jansenc
21910167291SKenneth E. Jansen          iel    = lcblkb(1,iblk)
22010167291SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
22110167291SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
22210167291SKenneth E. Jansen          iorder = lcblkb(4,iblk)
22310167291SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
22410167291SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
22510167291SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
22610167291SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
22710167291SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
22810167291SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
22910167291SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
23010167291SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
23110167291SKenneth E. Jansen          ngaussb = nintb(lcsyst)
23210167291SKenneth E. Jansen
23310167291SKenneth E. Jansenc
23410167291SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
23510167291SKenneth E. Jansenc     boundary integral
23610167291SKenneth E. Jansenc
23710167291SKenneth E. Jansen
23810167291SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
23910167291SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
24010167291SKenneth E. Jansen
24110167291SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
24210167291SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
24310167291SKenneth E. Jansen
24410167291SKenneth E. Jansen          call AsBMFG (y,                       x,
24510167291SKenneth E. Jansen     &                 tmpshpb,                 tmpshglb,
24610167291SKenneth E. Jansen     &                 mienb(iblk)%p,           mmatb(iblk)%p,
24710167291SKenneth E. Jansen     &                 miBCB(iblk)%p,           mBCB(iblk)%p,
24810167291SKenneth E. Jansen     &                 res,                     rmes)
24910167291SKenneth E. Jansen
25010167291SKenneth E. Jansen          deallocate (tmpshpb)
25110167291SKenneth E. Jansen          deallocate (tmpshglb)
25210167291SKenneth E. Jansenc
25310167291SKenneth E. Jansenc.... end of boundary element loop
25410167291SKenneth E. Jansenc
25510167291SKenneth E. Jansen        enddo
25610167291SKenneth E. Jansenc
25710167291SKenneth E. Jansen      ttim(80) = ttim(80) + secs(0.0)
25810167291SKenneth E. Jansenc
25910167291SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric
26010167291SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead
26110167291SKenneth E. Jansenc of a dof combination).  Take care of all nodes now so periodicity, like
26210167291SKenneth E. Jansenc commu is a simple dof add.
26310167291SKenneth E. Jansenc
26410167291SKenneth E. Jansen      if(iabc==1) then               !are there any axisym bc's
26510167291SKenneth E. Jansen          call rotabc(res(1,2), iBC,  'in ')
26610167291SKenneth E. Jansen       endif
26710167291SKenneth E. Jansen
26810167291SKenneth E. Jansenc.... -------------------->   communications <-------------------------
26910167291SKenneth E. Jansenc
27010167291SKenneth E. Jansen
271*2801f607SKenneth E. Jansen!      if (numpe > 1) then
272*2801f607SKenneth E. Jansen      if (numpe < 1) then
27310167291SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'in ')
27410167291SKenneth E. Jansen
27510167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
27610167291SKenneth E. Jansen      endif
27710167291SKenneth E. Jansen
27810167291SKenneth E. Jansenc
27910167291SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
28010167291SKenneth E. Jansenc
28110167291SKenneth E. Jansenc.... satisfy the BCs on the residual
28210167291SKenneth E. Jansenc
28310167291SKenneth E. Jansen      call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
28410167291SKenneth E. Jansenc
28510167291SKenneth E. Jansenc
28610167291SKenneth E. Jansenc.... return
28710167291SKenneth E. Jansenc
288*2801f607SKenneth E. Jansen!      if (numpe > 1) then
289*2801f607SKenneth E. Jansen      if (numpe < 1) then
29010167291SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'out')
29110167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
29210167291SKenneth E. Jansen      endif
29310167291SKenneth E. Jansen      call timer ('Back    ')
29410167291SKenneth E. Jansen      return
29510167291SKenneth E. Jansen      end
29610167291SKenneth E. Jansenc
29710167291SKenneth E. Jansenc
29810167291SKenneth E. Jansen
29910167291SKenneth E. Jansenc
30010167291SKenneth E. Jansen
30110167291SKenneth E. Jansen        subroutine ElmGMRPETScSclr(y,      ac,
30210167291SKenneth E. Jansen     &                        x,      elDw,
30310167291SKenneth E. Jansen     &                        shp,    shgl,   iBC,
30410167291SKenneth E. Jansen     &                        BC,     shpb,   shglb,
30510167291SKenneth E. Jansen     &                        rest,   rmest,
30610167291SKenneth E. Jansen     &                        iper,   ilwork, lhsPs)
30710167291SKenneth E. Jansenc
30810167291SKenneth E. Jansenc----------------------------------------------------------------------
30910167291SKenneth E. Jansenc
31010167291SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
31110167291SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
31210167291SKenneth E. Jansenc solver.
31310167291SKenneth E. Jansenc
31410167291SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
31510167291SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
31610167291SKenneth E. Jansenc----------------------------------------------------------------------
31710167291SKenneth E. Jansenc
31810167291SKenneth E. Jansen        use pointer_data
31910167291SKenneth E. Jansenc
32010167291SKenneth E. Jansen        include "common.h"
32110167291SKenneth E. Jansen        include "mpif.h"
32210167291SKenneth E. Jansenc
32310167291SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
32410167291SKenneth E. Jansen     &            x(numnp,nsd),
32510167291SKenneth E. Jansen     &            iBC(nshg),
32610167291SKenneth E. Jansen     &            BC(nshg,ndofBC),
32710167291SKenneth E. Jansen     &            rest(nshg),           Diag(1),
32810167291SKenneth E. Jansen     &            rmest(nshg),
32910167291SKenneth E. Jansen     &            iper(nshg)
33010167291SKenneth E. Jansenc
33110167291SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
33210167291SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
33310167291SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
33410167291SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
33510167291SKenneth E. Jansenc
33610167291SKenneth E. Jansen        dimension qrest(nshg),          rmasst(nshg)
33710167291SKenneth E. Jansen        real*8 elDw(numel)
33810167291SKenneth E. Jansenc
33910167291SKenneth E. Jansen        dimension ilwork(nlwork)
34010167291SKenneth E. Jansenc
34110167291SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
34210167291SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
34310167291SKenneth E. Jansen        real*8, allocatable :: EGMasst(:,:,:)
34410167291SKenneth E. Jansen        real*8, allocatable :: ElDwl(:)
34510167291SKenneth E. Jansenc
34610167291SKenneth E. Jansen	ttim(80) = ttim(80) - tmr()
34710167291SKenneth E. Jansen        iprec=0
34810167291SKenneth E. Jansenc
34910167291SKenneth E. Jansenc.... set up the timer
35010167291SKenneth E. Jansenc
35110167291SKenneth E. Jansen
35210167291SKenneth E. Jansen        call timer ('Elm_Form')
35310167291SKenneth E. Jansenc
35410167291SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
35510167291SKenneth E. Jansenc
35610167291SKenneth E. Jansenc.... set up parameters
35710167291SKenneth E. Jansenc
35810167291SKenneth E. Jansen        intrul = intg  (1,itseq)
35910167291SKenneth E. Jansen        intind = intpt (intrul)
36010167291SKenneth E. Jansenc
36110167291SKenneth E. Jansen        ires   = 1
36210167291SKenneth E. Jansen
36310167291SKenneth E. Jansenc
36410167291SKenneth E. Jansenc.... initialize the arrays
36510167291SKenneth E. Jansenc
36610167291SKenneth E. Jansen        rest    = zero
36710167291SKenneth E. Jansen        rmest   = zero ! to avoid trap_uninitialized
36810167291SKenneth E. Jansenc
36910167291SKenneth E. Jansenc.... loop over the element-blocks
37010167291SKenneth E. Jansenc
37110167291SKenneth E. Jansen        do iblk = 1, nelblk
37210167291SKenneth E. Jansenc
37310167291SKenneth E. Jansenc
37410167291SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
37510167291SKenneth E. Jansen          iel    = lcblk(1,iblk)
37610167291SKenneth E. Jansen          lelCat = lcblk(2,iblk)
37710167291SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
37810167291SKenneth E. Jansen          iorder = lcblk(4,iblk)
37910167291SKenneth E. Jansen          nshl   = lcblk(10,iblk)
38010167291SKenneth E. Jansen          mattyp = lcblk(7,iblk)
38110167291SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
38210167291SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
38310167291SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
38410167291SKenneth E. Jansen          inum   = iel + npro - 1
38510167291SKenneth E. Jansen          ngauss = nint(lcsyst)
38610167291SKenneth E. Jansenc
38710167291SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
38810167291SKenneth E. Jansenc
38910167291SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
39010167291SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
39110167291SKenneth E. Jansen          if(lhs.eq.1) then
39210167291SKenneth E. Jansen             allocate (EGMasst(npro,nshl,nshl))
39310167291SKenneth E. Jansen             EGMasst=zero
39410167291SKenneth E. Jansen          endif
39510167291SKenneth E. Jansen
39610167291SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
39710167291SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
39810167291SKenneth E. Jansen
39910167291SKenneth E. Jansen          allocate (elDwl(npro))
40010167291SKenneth E. Jansenc
40110167291SKenneth E. Jansen          call AsIGMRSclr(y,
40210167291SKenneth E. Jansen     &                    ac,
40310167291SKenneth E. Jansen     &                    x,               elDwl,
40410167291SKenneth E. Jansen     &                    tmpshp,          tmpshgl,
40510167291SKenneth E. Jansen     &                    mien(iblk)%p,
40610167291SKenneth E. Jansen     &                    mmat(iblk)%p,    rest,
40710167291SKenneth E. Jansen     &                    rmest,
40810167291SKenneth E. Jansen     &                    qrest,           EGmasst,
40910167291SKenneth E. Jansen     &                    Diag )
41010167291SKenneth E. Jansenc
41110167291SKenneth E. Jansen           elDw(iel:inum) = elDwl(1:npro)
41210167291SKenneth E. Jansen          deallocate ( elDwl )
41310167291SKenneth E. Jansen
41410167291SKenneth E. Jansen           if(lhs.eq.1) then
41510167291SKenneth E. Jansenc.... satisfy the BCs on the implicit LHS
41610167291SKenneth E. Jansenc
41710167291SKenneth E. Jansen          call bc3LHSSclr (iBC, mien(iblk)%p, EGmasst )
41810167291SKenneth E. Jansenc
41910167291SKenneth E. Jansenc
42010167291SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix
42110167291SKenneth E. Jansenc
42210167291SKenneth E. Jansen             call fillsparsecpetscs( mieng(iblk)%p, EGmasst, lhsPs)
42310167291SKenneth E. Jansen          endif
42410167291SKenneth E. Jansen          if(lhs.eq.1) deallocate ( EGmasst )
42510167291SKenneth E. Jansen          deallocate ( tmpshp )
42610167291SKenneth E. Jansen          deallocate ( tmpshgl )
42710167291SKenneth E. Jansenc.... end of interior element loop
42810167291SKenneth E. Jansenc
42910167291SKenneth E. Jansen       enddo
43010167291SKenneth E. Jansenc
43110167291SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
43210167291SKenneth E. Jansenc
43310167291SKenneth E. Jansenc.... set up parameters
43410167291SKenneth E. Jansenc
43510167291SKenneth E. Jansen        intrul = intg   (2,itseq)
43610167291SKenneth E. Jansen        intind = intptb (intrul)
43710167291SKenneth E. Jansenc
43810167291SKenneth E. Jansenc.... loop over the boundary elements
43910167291SKenneth E. Jansenc
44010167291SKenneth E. Jansen        do iblk = 1, nelblb
44110167291SKenneth E. Jansenc
44210167291SKenneth E. Jansenc.... set up the parameters
44310167291SKenneth E. Jansenc
44410167291SKenneth E. Jansen          iel    = lcblkb(1,iblk)
44510167291SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
44610167291SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
44710167291SKenneth E. Jansen          iorder = lcblkb(4,iblk)
44810167291SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
44910167291SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
45010167291SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
45110167291SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
45210167291SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
45310167291SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
45410167291SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
45510167291SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
45610167291SKenneth E. Jansen          ngaussb = nintb(lcsyst)
45710167291SKenneth E. Jansenc
45810167291SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
45910167291SKenneth E. Jansenc     boundary integral
46010167291SKenneth E. Jansenc
46110167291SKenneth E. Jansen
46210167291SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
46310167291SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
46410167291SKenneth E. Jansen
46510167291SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
46610167291SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
46710167291SKenneth E. Jansenc
46810167291SKenneth E. Jansen          call AsBMFGSclr (y,                  x,
46910167291SKenneth E. Jansen     &                     tmpshpb,
47010167291SKenneth E. Jansen     &                     tmpshglb,
47110167291SKenneth E. Jansen     &                     mienb(iblk)%p,      mmatb(iblk)%p,
47210167291SKenneth E. Jansen     &                     miBCB(iblk)%p,      mBCB(iblk)%p,
47310167291SKenneth E. Jansen     &                     rest,               rmest)
47410167291SKenneth E. Jansenc
47510167291SKenneth E. Jansen          deallocate ( tmpshpb )
47610167291SKenneth E. Jansen          deallocate ( tmpshglb )
47710167291SKenneth E. Jansen
47810167291SKenneth E. Jansenc.... end of boundary element loop
47910167291SKenneth E. Jansenc
48010167291SKenneth E. Jansen        enddo
48110167291SKenneth E. Jansen
48210167291SKenneth E. Jansen
48310167291SKenneth E. Jansen      ttim(80) = ttim(80) + tmr()
48410167291SKenneth E. Jansenc
48510167291SKenneth E. Jansenc.... -------------------->   communications <-------------------------
48610167291SKenneth E. Jansenc
48710167291SKenneth E. Jansen
488*2801f607SKenneth E. Jansen      if (numpe < 1) then
48910167291SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'in ')
49010167291SKenneth E. Jansen
49110167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
49210167291SKenneth E. Jansen
49310167291SKenneth E. Jansen      endif
49410167291SKenneth E. Jansen
49510167291SKenneth E. Jansenc
49610167291SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
49710167291SKenneth E. Jansenc
49810167291SKenneth E. Jansenc.... satisfy the BCs on the residual
49910167291SKenneth E. Jansenc
50010167291SKenneth E. Jansen      call bc3ResSclr (y,  iBC,  BC,  rest,  iper, ilwork)
501*2801f607SKenneth E. Jansen      if (numpe < 1) then
50210167291SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'out')
50310167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
50410167291SKenneth E. Jansen      endif
50510167291SKenneth E. Jansenc
50610167291SKenneth E. Jansenc.... return
50710167291SKenneth E. Jansenc
50810167291SKenneth E. Jansen      call timer ('Back    ')
50910167291SKenneth E. Jansen      return
51010167291SKenneth E. Jansen      end
511