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