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