xref: /phasta/phSolver/compressible/elmgmr.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansen        subroutine ElmGMRe (y,         ac,        x,
259599516SKenneth E. Jansen     &                     shp,       shgl,      iBC,
359599516SKenneth E. Jansen     &                     BC,        shpb,      shglb,
459599516SKenneth E. Jansen     &                     res,       rmes,      BDiag,
559599516SKenneth E. Jansen     &                     iper,      ilwork,    EGmass, rerr)
659599516SKenneth E. Jansenc
759599516SKenneth E. Jansenc----------------------------------------------------------------------
859599516SKenneth E. Jansenc
959599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
1059599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
1159599516SKenneth E. Jansenc solver.
1259599516SKenneth E. Jansenc
1359599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
1459599516SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
1559599516SKenneth E. Jansenc----------------------------------------------------------------------
1659599516SKenneth E. Jansenc
1759599516SKenneth E. Jansen        use pointer_data
18*0d32f9a8SKenneth E. Jansen        use timedataC
1959599516SKenneth E. Jansenc
2059599516SKenneth E. Jansen        include "common.h"
2159599516SKenneth E. Jansen        include "mpif.h"
2259599516SKenneth E. Jansenc
2359599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
2459599516SKenneth E. Jansen     &            x(numnp,nsd),
2559599516SKenneth E. Jansen     &            iBC(nshg),
2659599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
2759599516SKenneth E. Jansen     &            res(nshg,nflow),
2859599516SKenneth E. Jansen     &            rmes(nshg,nflow),      BDiag(nshg,nflow,nflow),
2959599516SKenneth E. Jansen     &            iper(nshg),           EGmass(numel,nedof,nedof)
3059599516SKenneth E. Jansenc
3159599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
3259599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
3359599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
3459599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
3559599516SKenneth E. Jansenc
3659599516SKenneth E. Jansen        dimension qres(nshg, idflx),     rmass(nshg)
3759599516SKenneth E. Jansenc
3859599516SKenneth E. Jansen        dimension ilwork(nlwork)
3959599516SKenneth E. Jansen
4059599516SKenneth E. Jansen        real*8 Bdiagvec(nshg,nflow), rerr(nshg,10)
4159599516SKenneth E. Jansen
4259599516SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
4359599516SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
4459599516SKenneth E. Jansen
4559599516SKenneth E. Jansen	ttim(80) = ttim(80) - secs(0.0)
4659599516SKenneth E. Jansenc
4759599516SKenneth E. Jansenc.... set up the timer
4859599516SKenneth E. Jansenc
4959599516SKenneth E. Jansen
5059599516SKenneth E. Jansen        call timer ('Elm_Form')
5159599516SKenneth E. Jansenc
5259599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
5359599516SKenneth E. Jansenc
5459599516SKenneth E. Jansenc.... set up parameters
5559599516SKenneth E. Jansenc
5659599516SKenneth E. Jansen        ires   = 1
5759599516SKenneth E. Jansenc
5859599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
5959599516SKenneth E. Jansen                                                       ! of qdiff
6059599516SKenneth E. Jansenc
6159599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
6259599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
6359599516SKenneth E. Jansenc
6459599516SKenneth E. Jansen        qres = zero
6559599516SKenneth E. Jansen        rmass = zero
6659599516SKenneth E. Jansen
6759599516SKenneth E. Jansen        do iblk = 1, nelblk
6859599516SKenneth E. Jansenc
6959599516SKenneth E. Jansenc.... set up the parameters
7059599516SKenneth E. Jansenc
7159599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
7259599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
7359599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
7459599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
7559599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
7659599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
7759599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
7859599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
7959599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
8059599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
8159599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
8259599516SKenneth E. Jansen          ngauss = nint(lcsyst)
8359599516SKenneth E. Jansenc
8459599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
8559599516SKenneth E. Jansenc     and lumped mass matrix, rmass
8659599516SKenneth E. Jansen
8759599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
8859599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
8959599516SKenneth E. Jansen
9059599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
9159599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
9259599516SKenneth E. Jansen
9359599516SKenneth E. Jansen          call AsIq (y,                x,
9459599516SKenneth E. Jansen     &               tmpshp,
9559599516SKenneth E. Jansen     &               tmpshgl,
9659599516SKenneth E. Jansen     &               mien(iblk)%p,     mxmudmi(iblk)%p,
9759599516SKenneth E. Jansen     &               qres,
9859599516SKenneth E. Jansen     &               rmass)
9959599516SKenneth E. Jansen
10059599516SKenneth E. Jansen          deallocate ( tmpshp )
10159599516SKenneth E. Jansen          deallocate ( tmpshgl )
10259599516SKenneth E. Jansen       enddo
10359599516SKenneth E. Jansen
10459599516SKenneth E. Jansenc
10559599516SKenneth E. Jansenc.... take care of periodic boundary conditions
10659599516SKenneth E. Jansenc
10759599516SKenneth E. Jansen
10859599516SKenneth E. Jansen       call qpbc( rmass, qres, iBC,  iper, ilwork )
10959599516SKenneth E. Jansenc
11059599516SKenneth E. Jansen      endif                     ! computation of global diffusive flux
11159599516SKenneth E. Jansenc
11259599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals
11359599516SKenneth E. Jansenc
11459599516SKenneth E. Jansenc
11559599516SKenneth E. Jansenc.... initialize the arrays
11659599516SKenneth E. Jansenc
11759599516SKenneth E. Jansen        res    = zero
11859599516SKenneth E. Jansen        rmes   = zero ! to avoid trap_uninitialized
11959599516SKenneth E. Jansen        if (lhs. eq. 1)   EGmass = zero
12059599516SKenneth E. Jansen        if (iprec .ne. 0) BDiag = zero
12159599516SKenneth E. Jansen        flxID = zero
12259599516SKenneth E. Jansen
12359599516SKenneth E. Jansenc
12459599516SKenneth E. Jansenc.... loop over the element-blocks
12559599516SKenneth E. Jansenc
12659599516SKenneth E. Jansen        do iblk = 1, nelblk
12759599516SKenneth E. Jansenc
12859599516SKenneth E. Jansenc.... set up the parameters
12959599516SKenneth E. Jansenc
13059599516SKenneth E. Jansen          iblkts = iblk          ! used in timeseries
13159599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
13259599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
13359599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
13459599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
13559599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
13659599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
13759599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
13859599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
13959599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
14059599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
14159599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
14259599516SKenneth E. Jansen          inum   = iel + npro - 1
14359599516SKenneth E. Jansen          ngauss = nint(lcsyst)
14459599516SKenneth E. Jansenc
14559599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
14659599516SKenneth E. Jansenc
14759599516SKenneth E. Jansen
14859599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
14959599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
15059599516SKenneth E. Jansen
15159599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
15259599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
15359599516SKenneth E. Jansen
15459599516SKenneth E. Jansen          call AsIGMR (y,                   ac,
15559599516SKenneth E. Jansen     &                 x,                   mxmudmi(iblk)%p,
15659599516SKenneth E. Jansen     &                 tmpshp,
15759599516SKenneth E. Jansen     &                 tmpshgl,             mien(iblk)%p,
15859599516SKenneth E. Jansen     &                 mmat(iblk)%p,        res,
15959599516SKenneth E. Jansen     &                 rmes,                BDiag,
16059599516SKenneth E. Jansen     &                 qres,                EGmass(iel:inum,:,:),
16159599516SKenneth E. Jansen     &                 rerr)
16259599516SKenneth E. Jansenc
16359599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
16459599516SKenneth E. Jansenc
16559599516SKenneth E. Jansen          call bc3LHS (iBC,                  BC,  mien(iblk)%p,
16659599516SKenneth E. Jansen     &                 EGmass(iel:inum,:,:)  )
16759599516SKenneth E. Jansen
16859599516SKenneth E. Jansen          deallocate ( tmpshp )
16959599516SKenneth E. Jansen          deallocate ( tmpshgl )
17059599516SKenneth E. Jansenc
17159599516SKenneth E. Jansenc.... end of interior element loop
17259599516SKenneth E. Jansenc
17359599516SKenneth E. Jansen       enddo
17459599516SKenneth E. Jansenc
17559599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
17659599516SKenneth E. Jansenc
17759599516SKenneth E. Jansenc.... loop over the boundary elements
17859599516SKenneth E. Jansenc
17959599516SKenneth E. Jansen        do iblk = 1, nelblb
18059599516SKenneth E. Jansenc
18159599516SKenneth E. Jansenc.... set up the parameters
18259599516SKenneth E. Jansenc
18359599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
18459599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
18559599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
18659599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
18759599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
18859599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
18959599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
19059599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
19159599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
19259599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
19359599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
19459599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
19559599516SKenneth E. Jansen          ngaussb = nintb(lcsyst)
19659599516SKenneth E. Jansen
19759599516SKenneth E. Jansenc
19859599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
19959599516SKenneth E. Jansenc     boundary integral
20059599516SKenneth E. Jansenc
20159599516SKenneth E. Jansen
20259599516SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
20359599516SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
20459599516SKenneth E. Jansen
20559599516SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
20659599516SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
20759599516SKenneth E. Jansen
20859599516SKenneth E. Jansen          call AsBMFG (y,                       x,
20959599516SKenneth E. Jansen     &                 tmpshpb,                 tmpshglb,
21059599516SKenneth E. Jansen     &                 mienb(iblk)%p,           mmatb(iblk)%p,
21159599516SKenneth E. Jansen     &                 miBCB(iblk)%p,           mBCB(iblk)%p,
21259599516SKenneth E. Jansen     &                 res,                     rmes)
21359599516SKenneth E. Jansen
21459599516SKenneth E. Jansen          deallocate (tmpshpb)
21559599516SKenneth E. Jansen          deallocate (tmpshglb)
21659599516SKenneth E. Jansenc
21759599516SKenneth E. Jansenc.... end of boundary element loop
21859599516SKenneth E. Jansenc
21959599516SKenneth E. Jansen        enddo
22059599516SKenneth E. Jansenc
22159599516SKenneth E. Jansen      ttim(80) = ttim(80) + secs(0.0)
22259599516SKenneth E. Jansenc
22359599516SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric
22459599516SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead
22559599516SKenneth E. Jansenc of a dof combination).  Take care of all nodes now so periodicity, like
22659599516SKenneth E. Jansenc commu is a simple dof add.
22759599516SKenneth E. Jansenc
22859599516SKenneth E. Jansenc      if(iabc==1)               !are there any axisym bc's
22959599516SKenneth E. Jansenc     &     call rotabc(res(1,2), iBC, BC, nflow,  'in ')
23059599516SKenneth E. Jansen      if(iabc==1) then               !are there any axisym bc's
23159599516SKenneth E. Jansen          call rotabc(res(1,2), iBC,  'in ')
23259599516SKenneth E. Jansenc          Bdiagvec(:,1)=BDiag(:,1,1)
23359599516SKenneth E. Jansenc          Bdiagvec(:,2)=BDiag(:,2,2)
23459599516SKenneth E. Jansenc          Bdiagvec(:,3)=BDiag(:,3,3)
23559599516SKenneth E. Jansenc          Bdiagvec(:,4)=BDiag(:,4,4)
23659599516SKenneth E. Jansenc          Bdiagvec(:,5)=BDiag(:,5,5)
23759599516SKenneth E. Jansenc          call rotabc(Bdiagvec(1,2), iBC, BC, 2,  'in ')
23859599516SKenneth E. Jansenc          BDiag(:,:,:)=zero
23959599516SKenneth E. Jansenc          BDiag(:,1,1)=Bdiagvec(:,1)
24059599516SKenneth E. Jansenc          BDiag(:,2,2)=Bdiagvec(:,2)
24159599516SKenneth E. Jansenc          BDiag(:,3,3)=Bdiagvec(:,3)
24259599516SKenneth E. Jansenc          BDiag(:,4,4)=Bdiagvec(:,4)
24359599516SKenneth E. Jansenc          BDiag(:,5,5)=Bdiagvec(:,5)
24459599516SKenneth E. Jansen       endif
24559599516SKenneth E. Jansen
24659599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
24759599516SKenneth E. Jansenc
24859599516SKenneth E. Jansen
24959599516SKenneth E. Jansen      if (numpe > 1) then
25059599516SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'in ')
25159599516SKenneth E. Jansen
25259599516SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
25359599516SKenneth E. Jansen
25459599516SKenneth E. Jansen        if(iprec .ne. 0) call commu (BDiag, ilwork, nflow*nflow, 'in ')
25559599516SKenneth E. Jansen      endif
25659599516SKenneth E. Jansen
25759599516SKenneth E. Jansenc
25859599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
25959599516SKenneth E. Jansenc
26059599516SKenneth E. Jansenc.... satisfy the BCs on the residual
26159599516SKenneth E. Jansenc
26259599516SKenneth E. Jansen      call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
26359599516SKenneth E. Jansenc
26459599516SKenneth E. Jansenc.... satisfy the BCs on the block-diagonal preconditioner
26559599516SKenneth E. Jansenc
26659599516SKenneth E. Jansen      if (iprec .ne. 0) then
26759599516SKenneth E. Jansen         call bc3BDg (y,  iBC,  BC,  BDiag, iper, ilwork)
26859599516SKenneth E. Jansen      endif
26959599516SKenneth E. Jansenc
27059599516SKenneth E. Jansenc.... return
27159599516SKenneth E. Jansenc
27259599516SKenneth E. Jansen      call timer ('Back    ')
27359599516SKenneth E. Jansen      return
27459599516SKenneth E. Jansen      end
27559599516SKenneth E. Jansenc
27659599516SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
27759599516SKenneth E. Jansenccccccccccccc       SPARSE
27859599516SKenneth E. Jansenc_______________________________________________________________
27959599516SKenneth E. Jansen
28059599516SKenneth E. Jansen        subroutine ElmGMRs (y,         ac,        x,
28159599516SKenneth E. Jansen     &                     shp,       shgl,      iBC,
28259599516SKenneth E. Jansen     &                     BC,        shpb,      shglb,
28359599516SKenneth E. Jansen     &                     res,       rmes,      BDiag,
28459599516SKenneth E. Jansen     &                     iper,      ilwork,    lhsK,
28559599516SKenneth E. Jansen     &                     col,       row,       rerr)
28659599516SKenneth E. Jansenc
28759599516SKenneth E. Jansenc----------------------------------------------------------------------
28859599516SKenneth E. Jansenc
28959599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
29059599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
29159599516SKenneth E. Jansenc solver.
29259599516SKenneth E. Jansenc
29359599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
29459599516SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
29559599516SKenneth E. Jansenc----------------------------------------------------------------------
29659599516SKenneth E. Jansenc
29759599516SKenneth E. Jansen        use pointer_data
298*0d32f9a8SKenneth E. Jansen        use timedataC
29959599516SKenneth E. Jansenc
30059599516SKenneth E. Jansen        include "common.h"
30159599516SKenneth E. Jansen        include "mpif.h"
30259599516SKenneth E. Jansenc
30359599516SKenneth E. Jansen        integer col(nshg+1), row(nnz*nshg)
30459599516SKenneth E. Jansen        real*8 lhsK(nflow*nflow,nnz_tot)
30559599516SKenneth E. Jansen
30659599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
30759599516SKenneth E. Jansen     &            x(numnp,nsd),
30859599516SKenneth E. Jansen     &            iBC(nshg),
30959599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
31059599516SKenneth E. Jansen     &            res(nshg,nflow),
31159599516SKenneth E. Jansen     &            rmes(nshg,nflow),      BDiag(nshg,nflow,nflow),
31259599516SKenneth E. Jansen     &            iper(nshg)
31359599516SKenneth E. Jansenc
31459599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
31559599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
31659599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
31759599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
31859599516SKenneth E. Jansenc
31959599516SKenneth E. Jansen        dimension qres(nshg, idflx),     rmass(nshg)
32059599516SKenneth E. Jansenc
32159599516SKenneth E. Jansen        dimension ilwork(nlwork)
32259599516SKenneth E. Jansen
32359599516SKenneth E. Jansen        real*8 Bdiagvec(nshg,nflow), rerr(nshg,10)
32459599516SKenneth E. Jansen
32559599516SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
32659599516SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
32759599516SKenneth E. Jansen        real*8, allocatable :: EGmass(:,:,:)
32859599516SKenneth E. Jansen        ttim(80) = ttim(80) - secs(0.0)
32959599516SKenneth E. Jansenc
33059599516SKenneth E. Jansenc.... set up the timer
33159599516SKenneth E. Jansenc
33259599516SKenneth E. Jansen
33359599516SKenneth E. Jansen        call timer ('Elm_Form')
33459599516SKenneth E. Jansenc
33559599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
33659599516SKenneth E. Jansenc
33759599516SKenneth E. Jansenc.... set up parameters
33859599516SKenneth E. Jansenc
33959599516SKenneth E. Jansen        ires   = 1
34059599516SKenneth E. Jansenc
34159599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
34259599516SKenneth E. Jansen                                                       ! of qdiff
34359599516SKenneth E. Jansenc
34459599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
34559599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
34659599516SKenneth E. Jansenc
34759599516SKenneth E. Jansen        qres = zero
34859599516SKenneth E. Jansen        rmass = zero
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansen        do iblk = 1, nelblk
35159599516SKenneth E. Jansenc
35259599516SKenneth E. Jansenc.... set up the parameters
35359599516SKenneth E. Jansenc
35459599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
35559599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
35659599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
35759599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
35859599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
35959599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
36059599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
36159599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
36259599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
36359599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
36459599516SKenneth E. Jansen          ngauss = nint(lcsyst)
36559599516SKenneth E. Jansenc
36659599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
36759599516SKenneth E. Jansenc     and lumped mass matrix, rmass
36859599516SKenneth E. Jansen
36959599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
37059599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
37159599516SKenneth E. Jansen
37259599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
37359599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
37459599516SKenneth E. Jansen
37559599516SKenneth E. Jansen          call AsIq (y,                x,
37659599516SKenneth E. Jansen     &               tmpshp,
37759599516SKenneth E. Jansen     &               tmpshgl,
37859599516SKenneth E. Jansen     &               mien(iblk)%p,     mxmudmi(iblk)%p,
37959599516SKenneth E. Jansen     &               qres,
38059599516SKenneth E. Jansen     &               rmass)
38159599516SKenneth E. Jansen
38259599516SKenneth E. Jansen          deallocate ( tmpshp )
38359599516SKenneth E. Jansen          deallocate ( tmpshgl )
38459599516SKenneth E. Jansen       enddo
38559599516SKenneth E. Jansen
38659599516SKenneth E. Jansenc
38759599516SKenneth E. Jansenc.... take care of periodic boundary conditions
38859599516SKenneth E. Jansenc
38959599516SKenneth E. Jansen
39059599516SKenneth E. Jansen       call qpbc( rmass, qres, iBC, iper, ilwork )
39159599516SKenneth E. Jansenc
39259599516SKenneth E. Jansen      endif                     ! computation of global diffusive flux
39359599516SKenneth E. Jansenc
39459599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals
39559599516SKenneth E. Jansenc
39659599516SKenneth E. Jansenc
39759599516SKenneth E. Jansenc.... initialize the arrays
39859599516SKenneth E. Jansenc
39959599516SKenneth E. Jansen        res    = zero
40059599516SKenneth E. Jansen        rmes   = zero ! to avoid trap_uninitialized
40159599516SKenneth E. Jansen        if (lhs. eq. 1)   lhsK = zero
40259599516SKenneth E. Jansen        if (iprec .ne. 0) BDiag = zero
40359599516SKenneth E. Jansen        flxID = zero
40459599516SKenneth E. Jansenc
40559599516SKenneth E. Jansenc.... loop over the element-blocks
40659599516SKenneth E. Jansenc
40759599516SKenneth E. Jansen        do iblk = 1, nelblk
40859599516SKenneth E. Jansenc
40959599516SKenneth E. Jansenc.... set up the parameters
41059599516SKenneth E. Jansenc
41159599516SKenneth E. Jansen          iblkts = iblk          ! used in timeseries
41259599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
41359599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
41459599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
41559599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
41659599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
41759599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
41859599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
41959599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
42059599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
42159599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
42259599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
42359599516SKenneth E. Jansen          inum   = iel + npro - 1
42459599516SKenneth E. Jansen          ngauss = nint(lcsyst)
42559599516SKenneth E. Jansenc
42659599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
42759599516SKenneth E. Jansenc
42859599516SKenneth E. Jansen
42959599516SKenneth E. Jansen          if(lhs.eq.1) then
43059599516SKenneth E. Jansen             allocate (EGmass(npro,nedof,nedof))
43159599516SKenneth E. Jansen             EGmass = zero
43259599516SKenneth E. Jansen          else
43359599516SKenneth E. Jansen             allocate (EGmass(1,1,1))
43459599516SKenneth E. Jansen          endif
43559599516SKenneth E. Jansen
43659599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
43759599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
43859599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
43959599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
44059599516SKenneth E. Jansen
44159599516SKenneth E. Jansen          call AsIGMR (y,                   ac,
44259599516SKenneth E. Jansen     &                 x,                   mxmudmi(iblk)%p,
44359599516SKenneth E. Jansen     &                 tmpshp,
44459599516SKenneth E. Jansen     &                 tmpshgl,             mien(iblk)%p,
44559599516SKenneth E. Jansen     &                 mmat(iblk)%p,        res,
44659599516SKenneth E. Jansen     &                 rmes,                BDiag,
44759599516SKenneth E. Jansen     &                 qres,                EGmass,
44859599516SKenneth E. Jansen     &                 rerr )
44959599516SKenneth E. Jansen          if(lhs.eq.1) then
45059599516SKenneth E. Jansenc
45159599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
45259599516SKenneth E. Jansenc
45359599516SKenneth E. Jansen             call bc3LHS (iBC,                  BC,  mien(iblk)%p,
45459599516SKenneth E. Jansen     &                    EGmass  )
45559599516SKenneth E. Jansen
45659599516SKenneth E. Jansenc
45759599516SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix
45859599516SKenneth E. Jansenc
45959599516SKenneth E. Jansen             call fillsparseC( mien(iblk)%p, EGmass,
46059599516SKenneth E. Jansen     1                        lhsK, row, col)
46159599516SKenneth E. Jansen          endif
46259599516SKenneth E. Jansenc
46359599516SKenneth E. Jansen          deallocate ( EGmass )
46459599516SKenneth E. Jansen          deallocate ( tmpshp )
46559599516SKenneth E. Jansen          deallocate ( tmpshgl )
46659599516SKenneth E. Jansenc
46759599516SKenneth E. Jansenc.... end of interior element loop
46859599516SKenneth E. Jansenc
46959599516SKenneth E. Jansen       enddo
470513954efSKenneth E. Jansen!ifdef DEBUG !Nicholas Mati
471513954efSKenneth E. Jansen!        call write_debug(myrank, 'res-afterAsIGMR'//char(0),
472513954efSKenneth E. Jansen!     &                           'res'//char(0), res,
473513954efSKenneth E. Jansen!     &                           'd'//char(0), nshg, nflow, lstep)
474513954efSKenneth E. Jansen!        call write_debug(myrank, 'y-afterAsIGMR'//char(0),
475513954efSKenneth E. Jansen!     &                           'y'//char(0), y,
476513954efSKenneth E. Jansen!     &                           'd'//char(0), nshg, ndof, lstep)
477513954efSKenneth E. Jansen!endif //DEBUG
47859599516SKenneth E. Jansenc
47959599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
48059599516SKenneth E. Jansenc
48159599516SKenneth E. Jansenc.... loop over the boundary elements
48259599516SKenneth E. Jansenc
48359599516SKenneth E. Jansen        do iblk = 1, nelblb
48459599516SKenneth E. Jansenc
48559599516SKenneth E. Jansenc.... set up the parameters
48659599516SKenneth E. Jansenc
48759599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
48859599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
48959599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
49059599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
49159599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
49259599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
49359599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
49459599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
49559599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
49659599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
49759599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
49859599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
49959599516SKenneth E. Jansen          ngaussb = nintb(lcsyst)
50059599516SKenneth E. Jansen
50159599516SKenneth E. Jansenc
50259599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
50359599516SKenneth E. Jansenc     boundary integral
50459599516SKenneth E. Jansenc
50559599516SKenneth E. Jansen
50659599516SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
50759599516SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
508513954efSKenneth E. Jansen          if(lhs.eq.1 .and. iLHScond >= 1) then
509513954efSKenneth E. Jansen             allocate (EGmass(npro,nshl,nshl))
510513954efSKenneth E. Jansen             EGmass = zero
511513954efSKenneth E. Jansen          else
512513954efSKenneth E. Jansen             allocate (EGmass(1,1,1))
513513954efSKenneth E. Jansen          endif
51459599516SKenneth E. Jansen
51559599516SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
51659599516SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
51759599516SKenneth E. Jansen
51859599516SKenneth E. Jansen          call AsBMFG (y,                       x,
51959599516SKenneth E. Jansen     &                 tmpshpb,                 tmpshglb,
52059599516SKenneth E. Jansen     &                 mienb(iblk)%p,           mmatb(iblk)%p,
52159599516SKenneth E. Jansen     &                 miBCB(iblk)%p,           mBCB(iblk)%p,
522513954efSKenneth E. Jansen     &                 res,                     rmes,
523513954efSKenneth E. Jansen     &                 EGmass)
524513954efSKenneth E. Jansen          if(lhs == 1 .and. iLHScond > 0) then
525513954efSKenneth E. Jansen            call fillSparseC_BC(mienb(iblk)%p, EGmass,
526513954efSKenneth E. Jansen     &                   lhsk, row, col)
527513954efSKenneth E. Jansen          endif
52859599516SKenneth E. Jansen
529513954efSKenneth E. Jansen          deallocate (EGmass)
53059599516SKenneth E. Jansen          deallocate (tmpshpb)
53159599516SKenneth E. Jansen          deallocate (tmpshglb)
532513954efSKenneth E. Jansen        enddo   !end of boundary element loop
533513954efSKenneth E. Jansen
534513954efSKenneth E. Jansen!ifdef DEBUG !Nicholas Mati
535513954efSKenneth E. Jansen!        call write_debug(myrank, 'res-afterAsBMFG'//char(0),
536513954efSKenneth E. Jansen!     &                           'res'//char(0), res,
537513954efSKenneth E. Jansen!     &                           'd'//char(0), nshg, nflow, lstep)
538513954efSKenneth E. Jansen!        call MPI_ABORT(MPI_COMM_WORLD)
539513954efSKenneth E. Jansen!endif //DEBUG
540513954efSKenneth E. Jansen
541513954efSKenneth E. Jansen
54259599516SKenneth E. Jansenc
54359599516SKenneth E. Jansen      ttim(80) = ttim(80) + secs(0.0)
54459599516SKenneth E. Jansenc
54559599516SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric
54659599516SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead
54759599516SKenneth E. Jansenc of a dof combination).  Take care of all nodes now so periodicity, like
54859599516SKenneth E. Jansenc commu is a simple dof add.
54959599516SKenneth E. Jansenc
55059599516SKenneth E. Jansen      if(iabc==1) then               !are there any axisym bc's
55159599516SKenneth E. Jansen          call rotabc(res(1,2), iBC,  'in ')
55259599516SKenneth E. Jansenc          Bdiagvec(:,1)=BDiag(:,1,1)
55359599516SKenneth E. Jansenc          Bdiagvec(:,2)=BDiag(:,2,2)
55459599516SKenneth E. Jansenc          Bdiagvec(:,3)=BDiag(:,3,3)
55559599516SKenneth E. Jansenc          Bdiagvec(:,4)=BDiag(:,4,4)
55659599516SKenneth E. Jansenc          Bdiagvec(:,5)=BDiag(:,5,5)
55759599516SKenneth E. Jansenc          call rotabc(Bdiagvec(1,2), iBC,  'in ')
55859599516SKenneth E. Jansenc          BDiag(:,:,:)=zero
55959599516SKenneth E. Jansenc          BDiag(:,1,1)=Bdiagvec(:,1)
56059599516SKenneth E. Jansenc          BDiag(:,2,2)=Bdiagvec(:,2)
56159599516SKenneth E. Jansenc          BDiag(:,3,3)=Bdiagvec(:,3)
56259599516SKenneth E. Jansenc          BDiag(:,4,4)=Bdiagvec(:,4)
56359599516SKenneth E. Jansenc          BDiag(:,5,5)=Bdiagvec(:,5)
56459599516SKenneth E. Jansen       endif
56559599516SKenneth E. Jansen
56659599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
56759599516SKenneth E. Jansenc
56859599516SKenneth E. Jansen
56959599516SKenneth E. Jansen      if (numpe > 1) then
57059599516SKenneth E. Jansen        call commu (res  , ilwork, nflow  , 'in ')
57159599516SKenneth E. Jansen
57259599516SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
57359599516SKenneth E. Jansen
57459599516SKenneth E. Jansen        if(iprec .ne. 0) call commu (BDiag, ilwork, nflow*nflow, 'in ')
57559599516SKenneth E. Jansen      endif
57659599516SKenneth E. Jansen
57759599516SKenneth E. Jansenc
57859599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
57959599516SKenneth E. Jansenc
58059599516SKenneth E. Jansenc.... satisfy the BCs on the residual
58159599516SKenneth E. Jansenc
58259599516SKenneth E. Jansen      call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
58359599516SKenneth E. Jansenc
58459599516SKenneth E. Jansenc.... satisfy the BCs on the block-diagonal preconditioner
58559599516SKenneth E. Jansenc
58659599516SKenneth E. Jansenc  This code fragment would extract the "on processor diagonal
58759599516SKenneth E. Jansenc      blocks". lhsK alread has the BC's applied to it (using BC3lhs),
58859599516SKenneth E. Jansenc      though it was on an ebe basis. For now, we forgo this and still
58959599516SKenneth E. Jansenc      form BDiag before BC3lhs, leaving the need to still apply BC's
59059599516SKenneth E. Jansenc      below.  Keep in mind that if we used the code fragment below we
59159599516SKenneth E. Jansenc      would still need to make BDiag periodic since BC3lhs did not do
59259599516SKenneth E. Jansenc      that part.
59359599516SKenneth E. Jansenc
59459599516SKenneth E. Jansen      if (iprec .ne. 0) then
59559599516SKenneth E. Jansenc$$$         do iaa=1,nshg
59659599516SKenneth E. Jansenc$$$            k = sparseloc( row(col(iaa)), col(iaa+1)-colm(iaa), iaa )
59759599516SKenneth E. Jansenc$$$     &       + colm(iaa)-1
59859599516SKenneth E. Jansenc$$$            do idof=1,nflow
59959599516SKenneth E. Jansenc$$$               do jdof=1,nflow
60059599516SKenneth E. Jansenc$$$                  idx=idof+(jdof-1)*nflow
60159599516SKenneth E. Jansenc$$$                  BDiag(iaa,idof,jdof)=lhsK(idx,k)
60259599516SKenneth E. Jansenc$$$               enddo
60359599516SKenneth E. Jansenc$$$            enddo
60459599516SKenneth E. Jansenc$$$         enddo
60559599516SKenneth E. Jansen         call bc3BDg (y,  iBC,  BC,  BDiag, iper, ilwork)
60659599516SKenneth E. Jansen      endif
60759599516SKenneth E. Jansenc
60859599516SKenneth E. Jansenc.... return
60959599516SKenneth E. Jansenc
61059599516SKenneth E. Jansen      call timer ('Back    ')
61159599516SKenneth E. Jansen      return
61259599516SKenneth E. Jansen      end
61359599516SKenneth E. Jansenc
61459599516SKenneth E. Jansenc
61559599516SKenneth E. Jansen
61659599516SKenneth E. Jansenc
61759599516SKenneth E. Jansen        subroutine ElmGMRSclr(y,      ac,
61859599516SKenneth E. Jansen     &                        x,      elDw,
61959599516SKenneth E. Jansen     &                        shp,    shgl,   iBC,
62059599516SKenneth E. Jansen     &                        BC,     shpb,   shglb,
62159599516SKenneth E. Jansen     &                        rest,   rmest,  Diag,
62259599516SKenneth E. Jansen     &                        iper,   ilwork, EGmasst)
62359599516SKenneth E. Jansenc
62459599516SKenneth E. Jansenc----------------------------------------------------------------------
62559599516SKenneth E. Jansenc
62659599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
62759599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
62859599516SKenneth E. Jansenc solver.
62959599516SKenneth E. Jansenc
63059599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
63159599516SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
63259599516SKenneth E. Jansenc----------------------------------------------------------------------
63359599516SKenneth E. Jansenc
63459599516SKenneth E. Jansen        use pointer_data
63559599516SKenneth E. Jansenc
63659599516SKenneth E. Jansen        include "common.h"
63759599516SKenneth E. Jansen        include "mpif.h"
63859599516SKenneth E. Jansenc
63959599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
64059599516SKenneth E. Jansen     &            x(numnp,nsd),
64159599516SKenneth E. Jansen     &            iBC(nshg),
64259599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
64359599516SKenneth E. Jansen     &            rest(nshg),           Diag(nshg),
64459599516SKenneth E. Jansen     &            rmest(nshg),          BDiag(nshg,nflow,nflow),
64559599516SKenneth E. Jansen     &            iper(nshg),           EGmasst(numel,nshape,nshape)
64659599516SKenneth E. Jansenc
64759599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
64859599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
64959599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
65059599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
65159599516SKenneth E. Jansenc
65259599516SKenneth E. Jansen        dimension qrest(nshg),          rmasst(nshg)
65359599516SKenneth E. Jansenc
65459599516SKenneth E. Jansen        dimension ilwork(nlwork)
65559599516SKenneth E. Jansen        dimension elDw(numel)
65659599516SKenneth E. Jansenc
65759599516SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
65859599516SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
65959599516SKenneth E. Jansen        real*8, allocatable :: elDwl(:)
66059599516SKenneth E. Jansenc
66159599516SKenneth E. Jansen	ttim(80) = ttim(80) - tmr()
66259599516SKenneth E. Jansenc
66359599516SKenneth E. Jansenc.... set up the timer
66459599516SKenneth E. Jansenc
66559599516SKenneth E. Jansen
66659599516SKenneth E. Jansen        call timer ('Elm_Form')
66759599516SKenneth E. Jansenc
66859599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
66959599516SKenneth E. Jansenc
67059599516SKenneth E. Jansenc.... set up parameters
67159599516SKenneth E. Jansenc
67259599516SKenneth E. Jansen        intrul = intg  (1,itseq)
67359599516SKenneth E. Jansen        intind = intpt (intrul)
67459599516SKenneth E. Jansenc
67559599516SKenneth E. Jansen        ires   = 1
67659599516SKenneth E. Jansen
67759599516SKenneth E. Jansenc       if (idiff>=1) then  ! global reconstruction of qdiff
67859599516SKenneth E. Jansenc
67959599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
68059599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
68159599516SKenneth E. Jansenc
68259599516SKenneth E. Jansenc        qrest = zero
68359599516SKenneth E. Jansenc        rmasst = zero
68459599516SKenneth E. Jansenc
68559599516SKenneth E. Jansenc        do iblk = 1, nelblk
68659599516SKenneth E. Jansenc
68759599516SKenneth E. Jansenc.... set up the parameters
68859599516SKenneth E. Jansenc
68959599516SKenneth E. Jansenc          iel    = lcblk(1,iblk)
69059599516SKenneth E. Jansenc          lelCat = lcblk(2,iblk)
69159599516SKenneth E. Jansenc          lcsyst = lcblk(3,iblk)
69259599516SKenneth E. Jansenc          iorder = lcblk(4,iblk)
69359599516SKenneth E. Jansenc          nenl   = lcblk(5,iblk)   ! no. of vertices per element
69459599516SKenneth E. Jansenc          mattyp = lcblk(7,iblk)
69559599516SKenneth E. Jansenc          ndofl  = lcblk(8,iblk)
69659599516SKenneth E. Jansenc          nsymdl = lcblk(9,iblk)
69759599516SKenneth E. Jansenc          npro   = lcblk(1,iblk+1) - iel
69859599516SKenneth E. Jansenc
69959599516SKenneth E. Jansenc          nintg  = numQpt (nsd,intrul,lcsyst)
70059599516SKenneth E. Jansenc
70159599516SKenneth E. Jansenc
70259599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
70359599516SKenneth E. Jansenc     and lumped mass matrix, rmass
70459599516SKenneth E. Jansenc
70559599516SKenneth E. Jansenc          call AsIq (y,                x,
70659599516SKenneth E. Jansenc     &               shp(1,intind,lelCat),
70759599516SKenneth E. Jansenc     &               shgl(1,intind,lelCat),
70859599516SKenneth E. Jansenc     &               mien(iblk)%p,    mxmudmi(iblk)%p,
70959599516SKenneth E. Jansenc     &               qres,           rmass )
71059599516SKenneth E. Jansenc
71159599516SKenneth E. Jansenc       enddo
71259599516SKenneth E. Jansenc
71359599516SKenneth E. Jansenc
71459599516SKenneth E. Jansenc.... compute qi for node A, i.e., qres <-- qres/rmass
71559599516SKenneth E. Jansenc
71659599516SKenneth E. Jansenc       if (numpe > 1) then
71759599516SKenneth E. Jansenc          call commu (qres  , ilwork, (ndof-1)*nsd  , 'in ')
71859599516SKenneth E. Jansenc          call commu (rmass , ilwork,  1            , 'in ')
71959599516SKenneth E. Jansenc       endif
72059599516SKenneth E. Jansenc
72159599516SKenneth E. Jansenc.... take care of periodic boundary conditions
72259599516SKenneth E. Jansenc
72359599516SKenneth E. Jansenc       call qpbc( rmass, qres, iBC, iper )
72459599516SKenneth E. Jansenc
72559599516SKenneth E. Jansenc       rmass = one/rmass
72659599516SKenneth E. Jansenc
72759599516SKenneth E. Jansenc       do i=1, (nflow-1)*nsd
72859599516SKenneth E. Jansenc          qres(:,i) = rmass*qres(:,i)
72959599516SKenneth E. Jansenc       enddo
73059599516SKenneth E. Jansenc
73159599516SKenneth E. Jansenc       if(numpe > 1) then
73259599516SKenneth E. Jansenc          call commu (qres, ilwork, (nflow-1)*nsd, 'out')
73359599516SKenneth E. Jansenc       endif
73459599516SKenneth E. Jansenc
73559599516SKenneth E. Jansenc      endif                     ! computation of global diffusive flux
73659599516SKenneth E. Jansenc
73759599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals
73859599516SKenneth E. Jansenc
73959599516SKenneth E. Jansenc
74059599516SKenneth E. Jansenc.... initialize the arrays
74159599516SKenneth E. Jansenc
74259599516SKenneth E. Jansen        rest    = zero
74359599516SKenneth E. Jansen        rmest   = zero ! to avoid trap_uninitialized
74459599516SKenneth E. Jansen        if (lhs .eq. 1)   EGmasst = zero
74559599516SKenneth E. Jansen        if (iprec. ne. 0)   Diag  = zero
74659599516SKenneth E. Jansenc
74759599516SKenneth E. Jansenc.... loop over the element-blocks
74859599516SKenneth E. Jansenc
74959599516SKenneth E. Jansen        do iblk = 1, nelblk
75059599516SKenneth E. Jansenc
75159599516SKenneth E. Jansenc
75259599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
75359599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
75459599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
75559599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
75659599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
75759599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
75859599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
75959599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
76059599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
76159599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
76259599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
76359599516SKenneth E. Jansen          inum   = iel + npro - 1
76459599516SKenneth E. Jansen          ngauss = nint(lcsyst)
76559599516SKenneth E. Jansenc
76659599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
76759599516SKenneth E. Jansenc
76859599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
76959599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
77059599516SKenneth E. Jansen
77159599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
77259599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
77359599516SKenneth E. Jansen
77459599516SKenneth E. Jansen          allocate (elDwl(npro))
77559599516SKenneth E. Jansenc
77659599516SKenneth E. Jansen          call AsIGMRSclr(y,
77759599516SKenneth E. Jansen     &                    ac,
77859599516SKenneth E. Jansen     &                    x,               elDwl,
77959599516SKenneth E. Jansen     &                    tmpshp,          tmpshgl,
78059599516SKenneth E. Jansen     &                    mien(iblk)%p,
78159599516SKenneth E. Jansen     &                    mmat(iblk)%p,    rest,
78259599516SKenneth E. Jansen     &                    rmest,
78359599516SKenneth E. Jansen     &                    qrest,           EGmasst(iel:inum,:,:),
78459599516SKenneth E. Jansen     &                    Diag )
78559599516SKenneth E. Jansenc
78659599516SKenneth E. Jansen
78759599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
78859599516SKenneth E. Jansenc
78959599516SKenneth E. Jansen          call bc3LHSSclr (iBC, mien(iblk)%p, EGmasst(iel:inum,:,:) )
79059599516SKenneth E. Jansenc
791513954efSKenneth E. Jansen          elDw(iel:inum)=elDwl(1:npro)
79259599516SKenneth E. Jansen          deallocate ( elDwl )
79359599516SKenneth E. Jansen          deallocate ( tmpshp )
79459599516SKenneth E. Jansen          deallocate ( tmpshgl )
79559599516SKenneth E. Jansenc.... end of interior element loop
79659599516SKenneth E. Jansenc
79759599516SKenneth E. Jansen       enddo
79859599516SKenneth E. Jansenc
79959599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
80059599516SKenneth E. Jansenc
80159599516SKenneth E. Jansenc.... set up parameters
80259599516SKenneth E. Jansenc
80359599516SKenneth E. Jansen        intrul = intg   (2,itseq)
80459599516SKenneth E. Jansen        intind = intptb (intrul)
80559599516SKenneth E. Jansenc
80659599516SKenneth E. Jansenc.... loop over the boundary elements
80759599516SKenneth E. Jansenc
80859599516SKenneth E. Jansen        do iblk = 1, nelblb
80959599516SKenneth E. Jansenc
81059599516SKenneth E. Jansenc.... set up the parameters
81159599516SKenneth E. Jansenc
81259599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
81359599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
81459599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
81559599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
81659599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
81759599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
81859599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
81959599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
82059599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
82159599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
82259599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
82359599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
82459599516SKenneth E. Jansen          ngaussb = nintb(lcsyst)
82559599516SKenneth E. Jansenc
82659599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
82759599516SKenneth E. Jansenc     boundary integral
82859599516SKenneth E. Jansenc
82959599516SKenneth E. Jansen
83059599516SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
83159599516SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
83259599516SKenneth E. Jansen
83359599516SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
83459599516SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
83559599516SKenneth E. Jansenc
83659599516SKenneth E. Jansen          call AsBMFGSclr (y,                  x,
83759599516SKenneth E. Jansen     &                     tmpshpb,
83859599516SKenneth E. Jansen     &                     tmpshglb,
83959599516SKenneth E. Jansen     &                     mienb(iblk)%p,      mmatb(iblk)%p,
84059599516SKenneth E. Jansen     &                     miBCB(iblk)%p,      mBCB(iblk)%p,
84159599516SKenneth E. Jansen     &                     rest,               rmest)
84259599516SKenneth E. Jansenc
84359599516SKenneth E. Jansen          deallocate ( tmpshpb )
84459599516SKenneth E. Jansen          deallocate ( tmpshglb )
84559599516SKenneth E. Jansen
84659599516SKenneth E. Jansenc.... end of boundary element loop
84759599516SKenneth E. Jansenc
84859599516SKenneth E. Jansen        enddo
84959599516SKenneth E. Jansen
85059599516SKenneth E. Jansen
85159599516SKenneth E. Jansen      ttim(80) = ttim(80) + tmr()
85259599516SKenneth E. Jansenc
85359599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
85459599516SKenneth E. Jansenc
85559599516SKenneth E. Jansen
85659599516SKenneth E. Jansen      if (numpe > 1) then
85759599516SKenneth E. Jansen        call commu (rest  , ilwork, 1  , 'in ')
85859599516SKenneth E. Jansen
85959599516SKenneth E. Jansen        call MPI_BARRIER (MPI_COMM_WORLD,ierr)
86059599516SKenneth E. Jansen
86159599516SKenneth E. Jansen        if(iprec .ne. 0) call commu (Diag, ilwork, 1, 'in ')
86259599516SKenneth E. Jansen      endif
86359599516SKenneth E. Jansen
86459599516SKenneth E. Jansenc
86559599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
86659599516SKenneth E. Jansenc
86759599516SKenneth E. Jansenc.... satisfy the BCs on the residual
86859599516SKenneth E. Jansenc
86959599516SKenneth E. Jansen      call bc3ResSclr (y,  iBC,  BC,  rest,  iper, ilwork)
87059599516SKenneth E. Jansenc
87159599516SKenneth E. Jansenc.... satisfy the BCs on the preconditioner
87259599516SKenneth E. Jansenc
87359599516SKenneth E. Jansen      call bc3BDgSclr (iBC, Diag, iper, ilwork)
87459599516SKenneth E. Jansenc
87559599516SKenneth E. Jansenc.... return
87659599516SKenneth E. Jansenc
87759599516SKenneth E. Jansen      call timer ('Back    ')
87859599516SKenneth E. Jansen      return
87959599516SKenneth E. Jansen      end
88059599516SKenneth E. Jansen
881