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