159599516SKenneth E. Jansen subroutine errsmooth(rerr, x, iper, ilwork, 259599516SKenneth E. Jansen & shp, shgl, iBC) 359599516SKenneth E. Jansenc 459599516SKenneth E. Jansen use pointer_data 559599516SKenneth E. Jansenc 659599516SKenneth E. Jansen include "common.h" 759599516SKenneth E. Jansen include "mpif.h" 859599516SKenneth E. Jansenc 959599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 1059599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 1159599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 12*3dbc338dSCameron Smith & shglb(MAXTOP,nsd,maxsh,MAXQPT), 13*3dbc338dSCameron Smith & x(numnp,nsd) 14*3dbc338dSCameron Smith 1559599516SKenneth E. Jansenc 1659599516SKenneth E. Jansen dimension rerrsm(nshg, 10), rerr(nshg,10), rmass(nshg) 1759599516SKenneth E. Jansenc 1859599516SKenneth E. Jansen dimension ilwork(nlwork), iBC(nshg), iper(nshg) 1959599516SKenneth E. Jansen 2059599516SKenneth E. Jansen real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:) 2159599516SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:) 2259599516SKenneth E. Jansen 2359599516SKenneth E. Jansenc 2459599516SKenneth E. Jansenc loop over element blocks for the global reconstruction 2559599516SKenneth E. Jansenc of the smoothed error and lumped mass matrix, rmass 2659599516SKenneth E. Jansenc 2759599516SKenneth E. Jansen rerrsm = zero 2859599516SKenneth E. Jansen rmass = zero 2959599516SKenneth E. Jansen 3059599516SKenneth E. Jansen do iblk = 1, nelblk 3159599516SKenneth E. Jansenc 3259599516SKenneth E. Jansenc.... set up the parameters 3359599516SKenneth E. Jansenc 3459599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 3559599516SKenneth E. Jansen iel = lcblk(1,iblk) 3659599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 3759599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 3859599516SKenneth E. Jansen iorder = lcblk(4,iblk) 3959599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 4059599516SKenneth E. Jansen nshl = lcblk(10,iblk) 4159599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 4259599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 4359599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 4459599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 4559599516SKenneth E. Jansen ngauss = nint(lcsyst) 4659599516SKenneth E. Jansenc 4759599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 4859599516SKenneth E. Jansenc and lumped mass matrix, rmass 4959599516SKenneth E. Jansen 5059599516SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 5159599516SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 5259599516SKenneth E. Jansen 5359599516SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 5459599516SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 5559599516SKenneth E. Jansen 5659599516SKenneth E. Jansen call smooth (rerr, x, 5759599516SKenneth E. Jansen & tmpshp, 5859599516SKenneth E. Jansen & tmpshgl, 5959599516SKenneth E. Jansen & mien(iblk)%p, 6059599516SKenneth E. Jansen & rerrsm, 6159599516SKenneth E. Jansen & rmass) 6259599516SKenneth E. Jansen 6359599516SKenneth E. Jansen deallocate ( tmpshp ) 6459599516SKenneth E. Jansen deallocate ( tmpshgl ) 6559599516SKenneth E. Jansen enddo 6659599516SKenneth E. Jansenc 6759599516SKenneth E. Jansen if (numpe > 1) then 6859599516SKenneth E. Jansen call commu (rerrsm , ilwork, 10 , 'in ') 6959599516SKenneth E. Jansen call commu (rmass , ilwork, 1 , 'in ') 7059599516SKenneth E. Jansen endif 7159599516SKenneth E. Jansenc 7259599516SKenneth E. Jansenc.... take care of periodic boundary conditions 7359599516SKenneth E. Jansenc 7459599516SKenneth E. Jansen do j= 1,nshg 7559599516SKenneth E. Jansen if ((btest(iBC(j),10))) then 7659599516SKenneth E. Jansen i = iper(j) 7759599516SKenneth E. Jansen rmass(i) = rmass(i) + rmass(j) 7859599516SKenneth E. Jansen rerrsm(i,:) = rerrsm(i,:) + rerrsm(j,:) 7959599516SKenneth E. Jansen endif 8059599516SKenneth E. Jansen enddo 8159599516SKenneth E. Jansen 8259599516SKenneth E. Jansen do j= 1,nshg 8359599516SKenneth E. Jansen if ((btest(iBC(j),10))) then 8459599516SKenneth E. Jansen i = iper(j) 8559599516SKenneth E. Jansen rmass(j) = rmass(i) 8659599516SKenneth E. Jansen rerrsm(j,:) = rerrsm(i,:) 8759599516SKenneth E. Jansen endif 8859599516SKenneth E. Jansen enddo 8959599516SKenneth E. Jansenc 9059599516SKenneth E. Jansenc.... invert the diagonal mass matrix and find q 9159599516SKenneth E. Jansenc 9259599516SKenneth E. Jansen rmass = one/rmass 9359599516SKenneth E. Jansen 9459599516SKenneth E. Jansen do i=1, 10 9559599516SKenneth E. Jansen rerrsm(:,i) = rmass*rerrsm(:,i) 9659599516SKenneth E. Jansen enddo 9759599516SKenneth E. Jansen if(numpe > 1) then 9859599516SKenneth E. Jansen call commu (rerrsm, ilwork, 10, 'out') 9959599516SKenneth E. Jansen endif 10059599516SKenneth E. Jansenc 10159599516SKenneth E. Jansenc copy the smoothed error overwriting the original error. 10259599516SKenneth E. Jansenc 10359599516SKenneth E. Jansen 10459599516SKenneth E. Jansen rerr = rerrsm 10559599516SKenneth E. Jansen 10659599516SKenneth E. Jansen return 10759599516SKenneth E. Jansen end 10859599516SKenneth E. Jansen 10959599516SKenneth E. Jansen subroutine smooth (rerr, x, shp, 11059599516SKenneth E. Jansen & shgl, ien, 11159599516SKenneth E. Jansen & rerrsm, rmass ) 11259599516SKenneth E. Jansenc 11359599516SKenneth E. Jansenc---------------------------------------------------------------------- 11459599516SKenneth E. Jansenc 11559599516SKenneth E. Jansenc This routine computes and assembles the data corresponding to the 11659599516SKenneth E. Jansenc interior elements for the global reconstruction of the diffusive 11759599516SKenneth E. Jansenc flux vector. 11859599516SKenneth E. Jansenc 11959599516SKenneth E. Jansenc input: 12059599516SKenneth E. Jansenc y (nshg,ndof) : Y variables 12159599516SKenneth E. Jansenc x (numnp,nsd) : nodal coordinates 12259599516SKenneth E. Jansenc shp (nshape,ngauss) : element shape-functions 12359599516SKenneth E. Jansenc shgl (nsd,nshape,ngauss) : element local shape-function gradients 12459599516SKenneth E. Jansenc ien (npro) : nodal connectivity array 12559599516SKenneth E. Jansenc 12659599516SKenneth E. Jansenc output: 12759599516SKenneth E. Jansenc qres (nshg,nflow-1,nsd) : residual vector for diffusive flux 12859599516SKenneth E. Jansenc rmass (nshg) : lumped mass matrix 12959599516SKenneth E. Jansenc 13059599516SKenneth E. Jansenc---------------------------------------------------------------------- 13159599516SKenneth E. Jansenc 13259599516SKenneth E. Jansen include "common.h" 13359599516SKenneth E. Jansenc 13459599516SKenneth E. Jansen dimension rerr(nshg,10), x(numnp,nsd), 13559599516SKenneth E. Jansen & shp(nshl,maxsh), 13659599516SKenneth E. Jansen & shgl(nsd,nshl,maxsh), 13759599516SKenneth E. Jansen & ien(npro,nshl), 13859599516SKenneth E. Jansen & rerrsm(nshg,10), rmass(nshg) 13959599516SKenneth E. Jansenc 14059599516SKenneth E. Jansenc.... element level declarations 14159599516SKenneth E. Jansenc 14259599516SKenneth E. Jansen dimension rerrl(npro,nshl,10), xl(npro,nenl,nsd), 14359599516SKenneth E. Jansen & rerrsml(npro,nshl,10), rmassl(npro,nshl) 14459599516SKenneth E. Jansenc 14559599516SKenneth E. Jansen dimension sgn(npro,nshl), shape(npro,nshl), 14659599516SKenneth E. Jansen & shdrv(npro,nsd,nshl), WdetJ(npro), 14759599516SKenneth E. Jansen & dxidx(npro,nsd,nsd), shg(npro,nshl,nsd) 14859599516SKenneth E. Jansenc 14959599516SKenneth E. Jansen dimension error(npro,10) 15059599516SKenneth E. Jansenc 15159599516SKenneth E. Jansenc.... create the matrix of mode signs for the hierarchic basis 15259599516SKenneth E. Jansenc functions. 15359599516SKenneth E. Jansenc 15459599516SKenneth E. Jansen if (ipord .gt. 1) then 15559599516SKenneth E. Jansen call getsgn(ien,sgn) 15659599516SKenneth E. Jansen endif 15759599516SKenneth E. Jansenc 15859599516SKenneth E. Jansenc.... gather the variables 15959599516SKenneth E. Jansenc 16059599516SKenneth E. Jansen 16159599516SKenneth E. Jansen call local(rerr, rerrl, ien, 10, 'gather ') 16259599516SKenneth E. Jansen call localx(x, xl, ien, nsd, 'gather ') 16359599516SKenneth E. Jansenc 16459599516SKenneth E. Jansenc.... get the element residuals 16559599516SKenneth E. Jansenc 16659599516SKenneth E. Jansen rerrsml = zero 16759599516SKenneth E. Jansen rmassl = zero 16859599516SKenneth E. Jansen 16959599516SKenneth E. Jansenc 17059599516SKenneth E. Jansenc.... loop through the integration points 17159599516SKenneth E. Jansenc 17259599516SKenneth E. Jansen 17359599516SKenneth E. Jansen 17459599516SKenneth E. Jansen do intp = 1, ngauss 17559599516SKenneth E. Jansen if (Qwt(lcsyst,intp) .eq. zero) cycle ! precaution 17659599516SKenneth E. Jansenc 17759599516SKenneth E. Jansenc.... create a matrix of shape functions (and derivatives) for each 17859599516SKenneth E. Jansenc element at this quadrature point. These arrays will contain 17959599516SKenneth E. Jansenc the correct signs for the hierarchic basis 18059599516SKenneth E. Jansenc 18159599516SKenneth E. Jansen call getshp(shp, shgl, sgn, 18259599516SKenneth E. Jansen & shape, shdrv) 18359599516SKenneth E. Jansenc 18459599516SKenneth E. Jansen call e3metric( xl, shdrv, dxidx, 18559599516SKenneth E. Jansen & shg, WdetJ) 18659599516SKenneth E. Jansen error=zero 18759599516SKenneth E. Jansen do n = 1, nshl 18859599516SKenneth E. Jansen do i=1,10 18959599516SKenneth E. Jansen error(:,i)=error(:,i) + shape(:,n) * rerrl(:,n,i) 19059599516SKenneth E. Jansen enddo 19159599516SKenneth E. Jansen enddo 19259599516SKenneth E. Jansen do i=1,nshl 19359599516SKenneth E. Jansen do j=1,10 19459599516SKenneth E. Jansen rerrsml(:,i,j) = rerrsml(:,i,j) 19559599516SKenneth E. Jansen & + shape(:,i)*WdetJ*error(:,j) 19659599516SKenneth E. Jansen enddo 19759599516SKenneth E. Jansen 19859599516SKenneth E. Jansen rmassl(:,i) = rmassl(:,i) + shape(:,i)*WdetJ 19959599516SKenneth E. Jansen enddo 20059599516SKenneth E. Jansen 20159599516SKenneth E. Jansenc.... end of the loop over integration points 20259599516SKenneth E. Jansenc 20359599516SKenneth E. Jansen enddo 20459599516SKenneth E. Jansenc 20559599516SKenneth E. Jansenc.... assemble the diffusive flux residual 20659599516SKenneth E. Jansenc 20759599516SKenneth E. Jansen call local (rerrsm, rerrsml, ien, 10,'scatter ') 20859599516SKenneth E. Jansen call local (rmass, rmassl, ien, 1, 'scatter ') 20959599516SKenneth E. Jansenc 21059599516SKenneth E. Jansen 21159599516SKenneth E. Jansen return 21259599516SKenneth E. Jansen end 213