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