1*59599516SKenneth E. Jansen subroutine errsmooth(rerr, x, iper, ilwork, 2*59599516SKenneth E. Jansen & shp, shgl, iBC) 3*59599516SKenneth E. Jansenc 4*59599516SKenneth E. Jansen use pointer_data 5*59599516SKenneth E. Jansenc 6*59599516SKenneth E. Jansen include "common.h" 7*59599516SKenneth E. Jansen include "mpif.h" 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 10*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 11*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 12*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 13*59599516SKenneth E. Jansenc 14*59599516SKenneth E. Jansen dimension rerrsm(nshg, 10), rerr(nshg,10), rmass(nshg) 15*59599516SKenneth E. Jansenc 16*59599516SKenneth E. Jansen dimension ilwork(nlwork), iBC(nshg), iper(nshg) 17*59599516SKenneth E. Jansen 18*59599516SKenneth E. Jansen real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:) 19*59599516SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:) 20*59599516SKenneth E. Jansen 21*59599516SKenneth E. Jansenc 22*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction 23*59599516SKenneth E. Jansenc of the smoothed error and lumped mass matrix, rmass 24*59599516SKenneth E. Jansenc 25*59599516SKenneth E. Jansen rerrsm = zero 26*59599516SKenneth E. Jansen rmass = zero 27*59599516SKenneth E. Jansen 28*59599516SKenneth E. Jansen do iblk = 1, nelblk 29*59599516SKenneth E. Jansenc 30*59599516SKenneth E. Jansenc.... set up the parameters 31*59599516SKenneth E. Jansenc 32*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 33*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 34*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 35*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 36*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 37*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 38*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 39*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 40*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 41*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 42*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 43*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 44*59599516SKenneth E. Jansenc 45*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 46*59599516SKenneth E. Jansenc and lumped mass matrix, rmass 47*59599516SKenneth E. Jansen 48*59599516SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 49*59599516SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 50*59599516SKenneth E. Jansen 51*59599516SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 52*59599516SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 53*59599516SKenneth E. Jansen 54*59599516SKenneth E. Jansen call smooth (rerr, x, 55*59599516SKenneth E. Jansen & tmpshp, 56*59599516SKenneth E. Jansen & tmpshgl, 57*59599516SKenneth E. Jansen & mien(iblk)%p, 58*59599516SKenneth E. Jansen & rerrsm, 59*59599516SKenneth E. Jansen & rmass) 60*59599516SKenneth E. Jansen 61*59599516SKenneth E. Jansen deallocate ( tmpshp ) 62*59599516SKenneth E. Jansen deallocate ( tmpshgl ) 63*59599516SKenneth E. Jansen enddo 64*59599516SKenneth E. Jansenc 65*59599516SKenneth E. Jansen if (numpe > 1) then 66*59599516SKenneth E. Jansen call commu (rerrsm , ilwork, 10 , 'in ') 67*59599516SKenneth E. Jansen call commu (rmass , ilwork, 1 , 'in ') 68*59599516SKenneth E. Jansen endif 69*59599516SKenneth E. Jansenc 70*59599516SKenneth E. Jansenc.... take care of periodic boundary conditions 71*59599516SKenneth E. Jansenc 72*59599516SKenneth E. Jansen do j= 1,nshg 73*59599516SKenneth E. Jansen if ((btest(iBC(j),10))) then 74*59599516SKenneth E. Jansen i = iper(j) 75*59599516SKenneth E. Jansen rmass(i) = rmass(i) + rmass(j) 76*59599516SKenneth E. Jansen rerrsm(i,:) = rerrsm(i,:) + rerrsm(j,:) 77*59599516SKenneth E. Jansen endif 78*59599516SKenneth E. Jansen enddo 79*59599516SKenneth E. Jansen 80*59599516SKenneth E. Jansen do j= 1,nshg 81*59599516SKenneth E. Jansen if ((btest(iBC(j),10))) then 82*59599516SKenneth E. Jansen i = iper(j) 83*59599516SKenneth E. Jansen rmass(j) = rmass(i) 84*59599516SKenneth E. Jansen rerrsm(j,:) = rerrsm(i,:) 85*59599516SKenneth E. Jansen endif 86*59599516SKenneth E. Jansen enddo 87*59599516SKenneth E. Jansenc 88*59599516SKenneth E. Jansenc.... invert the diagonal mass matrix and find q 89*59599516SKenneth E. Jansenc 90*59599516SKenneth E. Jansen rmass = one/rmass 91*59599516SKenneth E. Jansen 92*59599516SKenneth E. Jansen do i=1, 10 93*59599516SKenneth E. Jansen rerrsm(:,i) = rmass*rerrsm(:,i) 94*59599516SKenneth E. Jansen enddo 95*59599516SKenneth E. Jansen if(numpe > 1) then 96*59599516SKenneth E. Jansen call commu (rerrsm, ilwork, 10, 'out') 97*59599516SKenneth E. Jansen endif 98*59599516SKenneth E. Jansenc 99*59599516SKenneth E. Jansenc copy the smoothed error overwriting the original error. 100*59599516SKenneth E. Jansenc 101*59599516SKenneth E. Jansen 102*59599516SKenneth E. Jansen rerr = rerrsm 103*59599516SKenneth E. Jansen 104*59599516SKenneth E. Jansen return 105*59599516SKenneth E. Jansen end 106*59599516SKenneth E. Jansen 107*59599516SKenneth E. Jansen subroutine smooth (rerr, x, shp, 108*59599516SKenneth E. Jansen & shgl, ien, 109*59599516SKenneth E. Jansen & rerrsm, rmass ) 110*59599516SKenneth E. Jansenc 111*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 112*59599516SKenneth E. Jansenc 113*59599516SKenneth E. Jansenc This routine computes and assembles the data corresponding to the 114*59599516SKenneth E. Jansenc interior elements for the global reconstruction of the diffusive 115*59599516SKenneth E. Jansenc flux vector. 116*59599516SKenneth E. Jansenc 117*59599516SKenneth E. Jansenc input: 118*59599516SKenneth E. Jansenc y (nshg,ndof) : Y variables 119*59599516SKenneth E. Jansenc x (numnp,nsd) : nodal coordinates 120*59599516SKenneth E. Jansenc shp (nshape,ngauss) : element shape-functions 121*59599516SKenneth E. Jansenc shgl (nsd,nshape,ngauss) : element local shape-function gradients 122*59599516SKenneth E. Jansenc ien (npro) : nodal connectivity array 123*59599516SKenneth E. Jansenc 124*59599516SKenneth E. Jansenc output: 125*59599516SKenneth E. Jansenc qres (nshg,nflow-1,nsd) : residual vector for diffusive flux 126*59599516SKenneth E. Jansenc rmass (nshg) : lumped mass matrix 127*59599516SKenneth E. Jansenc 128*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 129*59599516SKenneth E. Jansenc 130*59599516SKenneth E. Jansen include "common.h" 131*59599516SKenneth E. Jansenc 132*59599516SKenneth E. Jansen dimension rerr(nshg,10), x(numnp,nsd), 133*59599516SKenneth E. Jansen & shp(nshl,maxsh), 134*59599516SKenneth E. Jansen & shgl(nsd,nshl,maxsh), 135*59599516SKenneth E. Jansen & ien(npro,nshl), 136*59599516SKenneth E. Jansen & rerrsm(nshg,10), rmass(nshg) 137*59599516SKenneth E. Jansenc 138*59599516SKenneth E. Jansenc.... element level declarations 139*59599516SKenneth E. Jansenc 140*59599516SKenneth E. Jansen dimension rerrl(npro,nshl,10), xl(npro,nenl,nsd), 141*59599516SKenneth E. Jansen & rerrsml(npro,nshl,10), rmassl(npro,nshl) 142*59599516SKenneth E. Jansenc 143*59599516SKenneth E. Jansen dimension sgn(npro,nshl), shape(npro,nshl), 144*59599516SKenneth E. Jansen & shdrv(npro,nsd,nshl), WdetJ(npro), 145*59599516SKenneth E. Jansen & dxidx(npro,nsd,nsd), shg(npro,nshl,nsd) 146*59599516SKenneth E. Jansenc 147*59599516SKenneth E. Jansen dimension error(npro,10) 148*59599516SKenneth E. Jansenc 149*59599516SKenneth E. Jansenc.... create the matrix of mode signs for the hierarchic basis 150*59599516SKenneth E. Jansenc functions. 151*59599516SKenneth E. Jansenc 152*59599516SKenneth E. Jansen if (ipord .gt. 1) then 153*59599516SKenneth E. Jansen call getsgn(ien,sgn) 154*59599516SKenneth E. Jansen endif 155*59599516SKenneth E. Jansenc 156*59599516SKenneth E. Jansenc.... gather the variables 157*59599516SKenneth E. Jansenc 158*59599516SKenneth E. Jansen 159*59599516SKenneth E. Jansen call local(rerr, rerrl, ien, 10, 'gather ') 160*59599516SKenneth E. Jansen call localx(x, xl, ien, nsd, 'gather ') 161*59599516SKenneth E. Jansenc 162*59599516SKenneth E. Jansenc.... get the element residuals 163*59599516SKenneth E. Jansenc 164*59599516SKenneth E. Jansen rerrsml = zero 165*59599516SKenneth E. Jansen rmassl = zero 166*59599516SKenneth E. Jansen 167*59599516SKenneth E. Jansenc 168*59599516SKenneth E. Jansenc.... loop through the integration points 169*59599516SKenneth E. Jansenc 170*59599516SKenneth E. Jansen 171*59599516SKenneth E. Jansen 172*59599516SKenneth E. Jansen do intp = 1, ngauss 173*59599516SKenneth E. Jansen if (Qwt(lcsyst,intp) .eq. zero) cycle ! precaution 174*59599516SKenneth E. Jansenc 175*59599516SKenneth E. Jansenc.... create a matrix of shape functions (and derivatives) for each 176*59599516SKenneth E. Jansenc element at this quadrature point. These arrays will contain 177*59599516SKenneth E. Jansenc the correct signs for the hierarchic basis 178*59599516SKenneth E. Jansenc 179*59599516SKenneth E. Jansen call getshp(shp, shgl, sgn, 180*59599516SKenneth E. Jansen & shape, shdrv) 181*59599516SKenneth E. Jansenc 182*59599516SKenneth E. Jansen call e3metric( xl, shdrv, dxidx, 183*59599516SKenneth E. Jansen & shg, WdetJ) 184*59599516SKenneth E. Jansen error=zero 185*59599516SKenneth E. Jansen do n = 1, nshl 186*59599516SKenneth E. Jansen do i=1,10 187*59599516SKenneth E. Jansen error(:,i)=error(:,i) + shape(:,n) * rerrl(:,n,i) 188*59599516SKenneth E. Jansen enddo 189*59599516SKenneth E. Jansen enddo 190*59599516SKenneth E. Jansen do i=1,nshl 191*59599516SKenneth E. Jansen do j=1,10 192*59599516SKenneth E. Jansen rerrsml(:,i,j) = rerrsml(:,i,j) 193*59599516SKenneth E. Jansen & + shape(:,i)*WdetJ*error(:,j) 194*59599516SKenneth E. Jansen enddo 195*59599516SKenneth E. Jansen 196*59599516SKenneth E. Jansen rmassl(:,i) = rmassl(:,i) + shape(:,i)*WdetJ 197*59599516SKenneth E. Jansen enddo 198*59599516SKenneth E. Jansen 199*59599516SKenneth E. Jansenc.... end of the loop over integration points 200*59599516SKenneth E. Jansenc 201*59599516SKenneth E. Jansen enddo 202*59599516SKenneth E. Jansenc 203*59599516SKenneth E. Jansenc.... assemble the diffusive flux residual 204*59599516SKenneth E. Jansenc 205*59599516SKenneth E. Jansen call local (rerrsm, rerrsml, ien, 10,'scatter ') 206*59599516SKenneth E. Jansen call local (rmass, rmassl, ien, 1, 'scatter ') 207*59599516SKenneth E. Jansenc 208*59599516SKenneth E. Jansen 209*59599516SKenneth E. Jansen return 210*59599516SKenneth E. Jansen end 211