xref: /phasta/phSolver/incompressible/errsmooth.f (revision 7acde132a6def0fe2daaec0d1a712dff0e5c6636)
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