$
\newcommand{\rowsum}{\mathop{\rm rowsum}\nolimits}
\newcommand{\nnode}{n}
\newcommand{\suml}[2]{\sum\limits_{#1}^{#2}}
$
When utilizing Galerkin-type solutions for
IBVPs, we often
have to compute integrals using numerical methods such as
Gauss quadrature. In
such a solution, we solve for the values of a function at mesh nodes, whereas
the integration takes place at the quadrature points. Depending on the case,
we may need to compute the values of a function at mesh nodes, given their
values at quadrature points, e.g. stress recovery for mechanical problems.
There are many ways of achieving this, such as
superconvergent patch recovery.
In this post, I wanted to document a widely used solution which is easy to
implement, and which is used in research oriented codebases such as
FEAP.
L2 Projection
Given a function u∈L2(Ω), its projection into a finite element space
Vh⊂L2(Ω) is defined through the following optimization
problem:
Find uh∈Vh such that
Π(uh):=21∥uh−u∥L2(Ω)2→min(1)
There is a unique solution to the problem since Π(⋅) is convex. Taking
its variation, we have
$DΠ(uh)⋅vh=⟨uh−u,vh⟩=0(2)$
for all vh∈Vh. Thus we have the following variational formulation
Find uh∈Vh such that
⟨uh,vh⟩=⟨u,vh⟩(3)
for all vh∈Vh.
Here,
m(uh,vh)b(vh)=⟨uh,vh⟩=⟨u,vh⟩=∫Ωuhvhdxand=∫Ωuvhdx(4)
are our bilinear and linear forms respectively. Substituting FE
discretizations uh=∑J=1nuJNJ and
vh=∑I=1nvINI, we have
J=1∑nMIJuJ=bI(5)
for I=1,…,n,
where the FE matrix and vector are defined as
MIJbI=m(NJ,NI)=b(NI)=∫ΩNJNIdxand=∫ΩuNIdx(6)
Thus L2 projection requires the solution of a linear system
Mu=b
which depending on the algorithm used, can have a complexity of at least
O(n2) and at most O(n3).
Lumped L2 Projection
The L2 projection requires the solution of a system which can be
computationally expensive. It is possible to convert the
matrix—called the mass matrix in literature—to a diagonal
form through a procedure called lumping.
The operator for row summation is defined as
rowsum(⋅)i:=j=1∑n(⋅)ij(7)
For the mass matrix, we have
rowsumMI=J=1∑n∫ΩNJNIdx=∫ΩNIdx=:mI(8)
since ∑J=1nNJ=1.
Substituting the lumped mass matrix allows us to decouple the linear system of
equations in (5) and instead write
mIuI=bI(9)
for I=1,…,n. The lumped L2 projection is then as simple as
uI=mIbI=∫ΩNIdx∫ΩuNIdx(10)
This results in a very efficient algorithm with O(n) complexity.
Conclusion
Lumped L2 projection is a faster working approximation to L2 projection that is
easy to implement for quick results. You can use it when developing a solution
for an IBVP, and don’t want to wait too long when debugging, while not
forgetting that it introduces some error.