xref: /phasta/phSolver/compressible/elmgmrpetsc.f (revision 0d32f9a804c0a2b00cb17c1df80aafdb299b28cb)
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
24*0d32f9a8SKenneth 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
27110167291SKenneth E. Jansen      if (numpe > 1) then
27210167291SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'in ')
27310167291SKenneth E. Jansen
27410167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
27510167291SKenneth E. Jansen      endif
27610167291SKenneth E. Jansen
27710167291SKenneth E. Jansenc
27810167291SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
27910167291SKenneth E. Jansenc
28010167291SKenneth E. Jansenc.... satisfy the BCs on the residual
28110167291SKenneth E. Jansenc
28210167291SKenneth E. Jansen      call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
28310167291SKenneth E. Jansenc
28410167291SKenneth E. Jansenc
28510167291SKenneth E. Jansenc.... return
28610167291SKenneth E. Jansenc
28710167291SKenneth E. Jansen      if (numpe > 1) then
28810167291SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'out')
28910167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
29010167291SKenneth E. Jansen      endif
29110167291SKenneth E. Jansen      call timer ('Back    ')
29210167291SKenneth E. Jansen      return
29310167291SKenneth E. Jansen      end
29410167291SKenneth E. Jansenc
29510167291SKenneth E. Jansenc
29610167291SKenneth E. Jansen
29710167291SKenneth E. Jansenc
29810167291SKenneth E. Jansen
29910167291SKenneth E. Jansen        subroutine ElmGMRPETScSclr(y,      ac,
30010167291SKenneth E. Jansen     &                        x,      elDw,
30110167291SKenneth E. Jansen     &                        shp,    shgl,   iBC,
30210167291SKenneth E. Jansen     &                        BC,     shpb,   shglb,
30310167291SKenneth E. Jansen     &                        rest,   rmest,
30410167291SKenneth E. Jansen     &                        iper,   ilwork, lhsPs)
30510167291SKenneth E. Jansenc
30610167291SKenneth E. Jansenc----------------------------------------------------------------------
30710167291SKenneth E. Jansenc
30810167291SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
30910167291SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
31010167291SKenneth E. Jansenc solver.
31110167291SKenneth E. Jansenc
31210167291SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
31310167291SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
31410167291SKenneth E. Jansenc----------------------------------------------------------------------
31510167291SKenneth E. Jansenc
31610167291SKenneth E. Jansen        use pointer_data
31710167291SKenneth E. Jansenc
31810167291SKenneth E. Jansen        include "common.h"
31910167291SKenneth E. Jansen        include "mpif.h"
32010167291SKenneth E. Jansenc
32110167291SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
32210167291SKenneth E. Jansen     &            x(numnp,nsd),
32310167291SKenneth E. Jansen     &            iBC(nshg),
32410167291SKenneth E. Jansen     &            BC(nshg,ndofBC),
32510167291SKenneth E. Jansen     &            rest(nshg),           Diag(1),
32610167291SKenneth E. Jansen     &            rmest(nshg),
32710167291SKenneth E. Jansen     &            iper(nshg)
32810167291SKenneth E. Jansenc
32910167291SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
33010167291SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
33110167291SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
33210167291SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
33310167291SKenneth E. Jansenc
33410167291SKenneth E. Jansen        dimension qrest(nshg),          rmasst(nshg)
33510167291SKenneth E. Jansen        real*8 elDw(numel)
33610167291SKenneth E. Jansenc
33710167291SKenneth E. Jansen        dimension ilwork(nlwork)
33810167291SKenneth E. Jansenc
33910167291SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
34010167291SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
34110167291SKenneth E. Jansen        real*8, allocatable :: EGMasst(:,:,:)
34210167291SKenneth E. Jansen        real*8, allocatable :: ElDwl(:)
34310167291SKenneth E. Jansenc
34410167291SKenneth E. Jansen	ttim(80) = ttim(80) - tmr()
34510167291SKenneth E. Jansen        iprec=0
34610167291SKenneth E. Jansenc
34710167291SKenneth E. Jansenc.... set up the timer
34810167291SKenneth E. Jansenc
34910167291SKenneth E. Jansen
35010167291SKenneth E. Jansen        call timer ('Elm_Form')
35110167291SKenneth E. Jansenc
35210167291SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
35310167291SKenneth E. Jansenc
35410167291SKenneth E. Jansenc.... set up parameters
35510167291SKenneth E. Jansenc
35610167291SKenneth E. Jansen        intrul = intg  (1,itseq)
35710167291SKenneth E. Jansen        intind = intpt (intrul)
35810167291SKenneth E. Jansenc
35910167291SKenneth E. Jansen        ires   = 1
36010167291SKenneth E. Jansen
36110167291SKenneth E. Jansenc
36210167291SKenneth E. Jansenc.... initialize the arrays
36310167291SKenneth E. Jansenc
36410167291SKenneth E. Jansen        rest    = zero
36510167291SKenneth E. Jansen        rmest   = zero ! to avoid trap_uninitialized
36610167291SKenneth E. Jansenc
36710167291SKenneth E. Jansenc.... loop over the element-blocks
36810167291SKenneth E. Jansenc
36910167291SKenneth E. Jansen        do iblk = 1, nelblk
37010167291SKenneth E. Jansenc
37110167291SKenneth E. Jansenc
37210167291SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
37310167291SKenneth E. Jansen          iel    = lcblk(1,iblk)
37410167291SKenneth E. Jansen          lelCat = lcblk(2,iblk)
37510167291SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
37610167291SKenneth E. Jansen          iorder = lcblk(4,iblk)
37710167291SKenneth E. Jansen          nshl   = lcblk(10,iblk)
37810167291SKenneth E. Jansen          mattyp = lcblk(7,iblk)
37910167291SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
38010167291SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
38110167291SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
38210167291SKenneth E. Jansen          inum   = iel + npro - 1
38310167291SKenneth E. Jansen          ngauss = nint(lcsyst)
38410167291SKenneth E. Jansenc
38510167291SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
38610167291SKenneth E. Jansenc
38710167291SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
38810167291SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
38910167291SKenneth E. Jansen          if(lhs.eq.1) then
39010167291SKenneth E. Jansen             allocate (EGMasst(npro,nshl,nshl))
39110167291SKenneth E. Jansen             EGMasst=zero
39210167291SKenneth E. Jansen          endif
39310167291SKenneth E. Jansen
39410167291SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
39510167291SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
39610167291SKenneth E. Jansen
39710167291SKenneth E. Jansen          allocate (elDwl(npro))
39810167291SKenneth E. Jansenc
39910167291SKenneth E. Jansen          call AsIGMRSclr(y,
40010167291SKenneth E. Jansen     &                    ac,
40110167291SKenneth E. Jansen     &                    x,               elDwl,
40210167291SKenneth E. Jansen     &                    tmpshp,          tmpshgl,
40310167291SKenneth E. Jansen     &                    mien(iblk)%p,
40410167291SKenneth E. Jansen     &                    mmat(iblk)%p,    rest,
40510167291SKenneth E. Jansen     &                    rmest,
40610167291SKenneth E. Jansen     &                    qrest,           EGmasst,
40710167291SKenneth E. Jansen     &                    Diag )
40810167291SKenneth E. Jansenc
40910167291SKenneth E. Jansen           elDw(iel:inum) = elDwl(1:npro)
41010167291SKenneth E. Jansen          deallocate ( elDwl )
41110167291SKenneth E. Jansen
41210167291SKenneth E. Jansen           if(lhs.eq.1) then
41310167291SKenneth E. Jansenc.... satisfy the BCs on the implicit LHS
41410167291SKenneth E. Jansenc
41510167291SKenneth E. Jansen          call bc3LHSSclr (iBC, mien(iblk)%p, EGmasst )
41610167291SKenneth E. Jansenc
41710167291SKenneth E. Jansenc
41810167291SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix
41910167291SKenneth E. Jansenc
42010167291SKenneth E. Jansen             call fillsparsecpetscs( mieng(iblk)%p, EGmasst, lhsPs)
42110167291SKenneth E. Jansen          endif
42210167291SKenneth E. Jansen          if(lhs.eq.1) deallocate ( EGmasst )
42310167291SKenneth E. Jansen          deallocate ( tmpshp )
42410167291SKenneth E. Jansen          deallocate ( tmpshgl )
42510167291SKenneth E. Jansenc.... end of interior element loop
42610167291SKenneth E. Jansenc
42710167291SKenneth E. Jansen       enddo
42810167291SKenneth E. Jansenc
42910167291SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
43010167291SKenneth E. Jansenc
43110167291SKenneth E. Jansenc.... set up parameters
43210167291SKenneth E. Jansenc
43310167291SKenneth E. Jansen        intrul = intg   (2,itseq)
43410167291SKenneth E. Jansen        intind = intptb (intrul)
43510167291SKenneth E. Jansenc
43610167291SKenneth E. Jansenc.... loop over the boundary elements
43710167291SKenneth E. Jansenc
43810167291SKenneth E. Jansen        do iblk = 1, nelblb
43910167291SKenneth E. Jansenc
44010167291SKenneth E. Jansenc.... set up the parameters
44110167291SKenneth E. Jansenc
44210167291SKenneth E. Jansen          iel    = lcblkb(1,iblk)
44310167291SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
44410167291SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
44510167291SKenneth E. Jansen          iorder = lcblkb(4,iblk)
44610167291SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
44710167291SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
44810167291SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
44910167291SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
45010167291SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
45110167291SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
45210167291SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
45310167291SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
45410167291SKenneth E. Jansen          ngaussb = nintb(lcsyst)
45510167291SKenneth E. Jansenc
45610167291SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
45710167291SKenneth E. Jansenc     boundary integral
45810167291SKenneth E. Jansenc
45910167291SKenneth E. Jansen
46010167291SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
46110167291SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
46210167291SKenneth E. Jansen
46310167291SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
46410167291SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
46510167291SKenneth E. Jansenc
46610167291SKenneth E. Jansen          call AsBMFGSclr (y,                  x,
46710167291SKenneth E. Jansen     &                     tmpshpb,
46810167291SKenneth E. Jansen     &                     tmpshglb,
46910167291SKenneth E. Jansen     &                     mienb(iblk)%p,      mmatb(iblk)%p,
47010167291SKenneth E. Jansen     &                     miBCB(iblk)%p,      mBCB(iblk)%p,
47110167291SKenneth E. Jansen     &                     rest,               rmest)
47210167291SKenneth E. Jansenc
47310167291SKenneth E. Jansen          deallocate ( tmpshpb )
47410167291SKenneth E. Jansen          deallocate ( tmpshglb )
47510167291SKenneth E. Jansen
47610167291SKenneth E. Jansenc.... end of boundary element loop
47710167291SKenneth E. Jansenc
47810167291SKenneth E. Jansen        enddo
47910167291SKenneth E. Jansen
48010167291SKenneth E. Jansen
48110167291SKenneth E. Jansen      ttim(80) = ttim(80) + tmr()
48210167291SKenneth E. Jansenc
48310167291SKenneth E. Jansenc.... -------------------->   communications <-------------------------
48410167291SKenneth E. Jansenc
48510167291SKenneth E. Jansen
48610167291SKenneth E. Jansen      if (numpe > 1) then
48710167291SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'in ')
48810167291SKenneth E. Jansen
48910167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
49010167291SKenneth E. Jansen
49110167291SKenneth E. Jansen      endif
49210167291SKenneth E. Jansen
49310167291SKenneth E. Jansenc
49410167291SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
49510167291SKenneth E. Jansenc
49610167291SKenneth E. Jansenc.... satisfy the BCs on the residual
49710167291SKenneth E. Jansenc
49810167291SKenneth E. Jansen      call bc3ResSclr (y,  iBC,  BC,  rest,  iper, ilwork)
49910167291SKenneth E. Jansen      if (numpe > 1) then
50010167291SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'out')
50110167291SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
50210167291SKenneth E. Jansen      endif
50310167291SKenneth E. Jansenc
50410167291SKenneth E. Jansenc.... return
50510167291SKenneth E. Jansenc
50610167291SKenneth E. Jansen      call timer ('Back    ')
50710167291SKenneth E. Jansen      return
50810167291SKenneth E. Jansen      end
509