29. Equilibrated Residual Error Estimates#
29.1. General framework#
Equilibrated residual error estimators provide upper bounds for the discretization error in energy norm without any generic constant.
We consider the standard problem: find
The left hand side defines the bilinear-form
We assume that
The residual
Since
we aim in estimating
where
The element-residual
The residual error estimator estimates the residual in terms of weighted
Here,
The equilibrated residual error estimator
The lower bound depends on the shape of elements and the coefficient
The main idea is the following: Instead of calculating the
Then, the residual can be estimated without envolving any generic constant:
The norm
Remark: The flux-postprocessing
29.2. Computation of the lifting #
The residual is a functional of the form
where
Thus
for all elements
We minimize the weighted-
We want to localize the construction of the flux. Local problems are associated with vertex-patches
localization of the residual:
local liftings: find
such that on the vertex patch. Then, for there holds
The localization is given by multiplication of the
Since
with
The local residual vanishes on constants on the patch:
The last equality follows from the Galerkin-orthogonality.
We give an explicit construction of the lifting
with a basis for with a basis for with a basis for
Exercise: Show that these dofs are unisolvent. Count dimensions, and prove that
Now, we give an explicit construction of equilibrated fluxes on a vertex patch. Label elements
Start on
. We set on edge . On the edge on the patch-boundary we set , and on we set such that . We use the dofs of type (ii) to specify . Together with get . Dofs of type (iii) are not needed, and set 0. There holds $ $Continue with element
. On edge common with set such that . Otherwise, proceed as on . Thus $ $Continue to element
. Observe that on : $ r^V(1) = 0 [\sigma \cdot n]{E_1} = r{E_1}^V$ is satisfied.
This explicit construction proves the existence of an equilibrated flux. Instead of this explicit construction, one may solve a local constrained optimization problem
This applies also for 3D. Furthoer notes
mixed boundary conditions are possible
the efficiency for the h-FEM is shown by scaling arguments, and equivalence to the residual error estimator
efficiency is also proven to be robust with respect to polynomial order
, examples show overestimation less than 1.5
Literature:
D. Braess and J. Schöberl: Equilibrated Residual Error Estimator for Maxwell’s Equations. Mathematics of Computation, Vol 77(262), 651-672, 2008
D. Braess, V. Pillwein and J. Schöberl: Equilibrated Residual Error Estimates are p-Robust. Computer Methods in Applied Mechanics and Engineering. Vol 198, 1189-1197, 2009
29.3. Equilibration in NGSolve#
from ngsolve import *
from ngsolve.webgui import Draw
from netgen.occ import *
r1 = Rectangle(1,1).Face()
r1.edges.Max(X).name='right'
r1.edges.Min(X).name='left'
r1.edges.Max(Y).name='top'
r1.edges.Min(Y).name='bottom'
r1.faces.name='air'
r2 = MoveTo(0.6,0.6).Rectangle(0.2,0.2).Face()
r2.faces.name='source'
r1 -= r2
shape = Glue( [r1,r2] )
mesh = Mesh(OCCGeometry(shape,dim=2).GenerateMesh(maxh=0.1))
Draw (mesh);
order = 3
order_equ = 3
dirichlet="left|bottom"
fes = H1(mesh, order=order, dirichlet=dirichlet)
u,v = fes.TnT()
a = BilinearForm(grad(u)*grad(v)*dx).Assemble()
source = mesh.MaterialCF( { "source" : x*y }, default=0 )
f = LinearForm(source*v*dx).Assemble()
gfu = GridFunction(fes, name="solution")
gfu.vec.data = a.mat.Inverse(fes.FreeDofs()) * f.vec
Draw (gfu);
construct
where
# variational formulation for patch correction problems
Xsigma = Discontinuous (HDiv(mesh, order=order_equ))
Xw = L2(mesh,order=order_equ-1)
Xwf = FacetFESpace(mesh, order=order_equ)
Xlam = NumberSpace(mesh)
X = Xsigma*Xw*Xwf*Xlam
sigma, w, wf, lam = X.TrialFunction()
tau, v, vf, mu = X.TestFunction()
n = specialcf.normal(mesh.dim)
bfequ = (tau*sigma + w*div(tau) + v*div(sigma) + w*mu + lam*v) * dx
bfequ += (-sigma*n*vf-tau*n*wf)*dx(element_boundary=True)
bfequ += (-1e10*wf.Trace()*vf.Trace())*ds(definedon=mesh.Boundaries(dirichlet)) # penalty for Dirichlet
bfequ += (-1e10*mu*lam)*ds(definedon=mesh.Boundaries(dirichlet)) # no constraint at Dir bnd
# the residual: element-term + edge term:
lfequ = (source+Trace(gfu.Operator("hesse")))*v*dx
lfequ += (-grad(gfu)*n*vf)*dx(element_boundary=True)
gfequ = GridFunction(X)
with TaskManager():
PatchwiseSolve (bf=bfequ, lf=lfequ, gf=gfequ)
fesflux = HDiv(mesh, order=order_equ)
equflux = GridFunction(fesflux)
equflux.Set (grad(gfu)-gfequ.components[0])
Draw (equflux, mesh);
Check equilibrium:
Draw (div(equflux)+source, mesh, "residuum");