Beginning with this post, I’ll be publishing about the basics of finite element
formulations, from personal notes that accumulated over the years. This one is
about linear and scalar problems which came to be the “Hello World” for FE.
Details regarding spaces and discretization are omitted for the sake of brevity.
For those who want to delve into theory, I recommend “The Finite Element Method:
Theory, Implementation, and Applications”
by Larson and Bengzon.
The weak formulation of a canonical linear problem reads
Find u ∈ V u\in V u ∈ V such that
a ( u , v ) = b ( v ) \begin{equation}
a(u, v) = b(v)
\htmlId{eq:femlinear1}{}
\tag{1}\end{equation} a ( u , v ) = b ( v ) ( 1 )
for all v ∈ V v \in V v ∈ V where a ( ⋅ , ⋅ ) a(\cdot, \cdot) a ( ⋅ , ⋅ ) is a bilinear form and b ( ⋅ ) b(\cdot) b ( ⋅ ) is a linear form.
We define the discretization of u u u as
u h : = ∑ J = 1 n n u J N J , u h ∈ V h where V h ⊂ V \begin{equation}
u_h := \suml{J=1}{\nnode} u^J N^J
,\quad
u_h \in V_h
\quad\text{where}\quad
V_h\subset V
\tag{2}\end{equation} u h := J = 1 ∑ n n u J N J , u h ∈ V h where V h ⊂ V ( 2 )
The discretization u h u_h u h is a linear combination of basis functions
N J N^J N J and corresponding scalars u J u^J u J , J = 1 , … , n n J=1,\dots,\nnode J = 1 , … , n n so that V h V_h V h is a
subset of V V V .
The discretization of (1) then reads
a ( u h , v h ) = b ( v h ) ∀ v h ∈ V h . \begin{equation}
a(u_h, v_h) = b(v_h)
\quad
\forall v_h \in V_h
.
\tag{3}\end{equation} a ( u h , v h ) = b ( v h ) ∀ v h ∈ V h . ( 3 )
We then have
a ( ∑ J = 1 n n u J N J , ∑ I = 1 n n v I N I ) = b ( ∑ I = 1 n n v I N I ) \begin{equation}
a\rbr{\suml{J=1}{\nnode} u^J N^J, \suml{I=1}{\nnode} v^I N^I}
= b\rbr{\suml{I=1}{\nnode} v^I N^I}
\tag{4}\end{equation} a ( J = 1 ∑ n n u J N J , I = 1 ∑ n n v I N I ) = b ( I = 1 ∑ n n v I N I ) ( 4 )
Using the linearity properties,
a ( α u , β v ) = α β a ( u , v ) and b ( α v ) = α b ( v ) \begin{equation}
a(\alpha u, \beta v) = \alpha\beta\, a(u,v)
\eqand
b(\alpha v) = \alpha b(v)
\tag{5}\end{equation} a ( α u , β v ) = α β a ( u , v ) and b ( α v ) = α b ( v ) ( 5 )
we obtain
∑ I = 1 n n ∑ J = 1 n n u J v I a ( N J , N I ) = ∑ I = 1 n n v I b ( N I ) . \begin{equation}
\suml{I=1}{\nnode} \suml{J=1}{\nnode}
u^J v^I a(N^J, N^I)
= \suml{I=1}{\nnode} v^I b(N^I)
.
\htmlId{eq:femlinear2}{}
\tag{6}\end{equation} I = 1 ∑ n n J = 1 ∑ n n u J v I a ( N J , N I ) = I = 1 ∑ n n v I b ( N I ) . ( 6 )
For arbitrary test function values v I v^I v I , we can express (6)
as a system of n n \nnode n n equations
∑ J = 1 n n u J a ( N J , N I ) = b ( N I ) \begin{equation}
\suml{J=1}{\nnode}
u^J a(N^J, N^I) = b(N^I)
\htmlId{eq:femlinear3}{}
\tag{7}\end{equation} J = 1 ∑ n n u J a ( N J , N I ) = b ( N I ) ( 7 )
for I = 1 , 2 , … , n n I = 1,2,\dots,\nnode I = 1 , 2 , … , n n . If we expand the summations as
a ( N 1 , N 1 ) u 1 + a ( N 2 , N 1 ) u 2 + ⋯ + a ( N n n , N 1 ) u n n = b ( N 1 ) a ( N 1 , N 2 ) u 1 + a ( N 2 , N 2 ) u 2 + ⋯ + a ( N n n , N 2 ) u n n = b ( N 2 ) ⋮ ⋮ ⋮ ⋮ ⋮ a ( N 1 , N n n ) u 1 + a ( N 2 , N n n ) u 2 + ⋯ + a ( N n n , N n n ) u n n = b ( N n n ) \begin{alignat*}{6}
& a(N^1, N^1) u^1 &&+ a(N^2, N^1) u^2 &&+ \cdots &&+ a(N^{\nnode}, N^1) u^{\nnode} &&\quad=\quad b(N^1) \\
& a(N^1, N^2) u^1 &&+ a(N^2, N^2) u^2 &&+ \cdots &&+ a(N^{\nnode}, N^2) u^{\nnode} &&\quad=\quad b(N^2) \\
& \qquad\vdots && \qquad\quad\;\vdots && \quad\;\;\vdots && \qquad\qquad\vdots && \qquad\qquad\vdots \\
& a(N^1, N^{\nnode}) u^1 &&+ a(N^2, N^{\nnode}) u^2 &&+ \cdots &&+ a(N^{\nnode}, N^{\nnode}) u^{\nnode} &&\quad=\quad b(N^{\nnode})
\end{alignat*} a ( N 1 , N 1 ) u 1 a ( N 1 , N 2 ) u 1 ⋮ a ( N 1 , N n n ) u 1 + a ( N 2 , N 1 ) u 2 + a ( N 2 , N 2 ) u 2 ⋮ + a ( N 2 , N n n ) u 2 + ⋯ + ⋯ ⋮ + ⋯ + a ( N n n , N 1 ) u n n + a ( N n n , N 2 ) u n n ⋮ + a ( N n n , N n n ) u n n = b ( N 1 ) = b ( N 2 ) ⋮ = b ( N n n )
we can see that the terms with a a a constitute a matrix A \BA A and
the terms with b b b constitute a vector b \Bb b , allowing us to write
A u = b \begin{equation}
\BA\Bu = \Bb
\htmlId{eq:discrete9}{}
\tag{8}\end{equation} A u = b ( 8 )
where we chose to express the unknown coefficients u I u^I u I as a vector
u = [ u 1 , u 2 , … , u n n ] T \Bu = [u^1,u^2,\dots,u^{\nnode}]\tra u = [ u 1 , u 2 , … , u n n ] T .
\It can be seen that the components of the A \BA A and b \Bb b are defined as
A I J = a ( N J , N I ) and b I = b ( N I ) , \begin{equation}
\boxed{
\Aelid{I\!J}{} = a(N^J,N^I)
\eqand
b^I = b(N^I),
}
\tag{9}\end{equation} A I J = a ( N J , N I ) and b I = b ( N I ) , ( 9 )
we can express the linear system as
A 11 u 1 + A 12 u 2 + ⋯ + A 1 n n u n n = b 1 A 21 u 1 + A 22 u 2 + ⋯ + A 2 n n u n n = b 2 ⋮ ⋮ ⋮ ⋮ ⋮ A n n 1 u 1 + A n n 2 u 2 + ⋯ + A n n n n u n n = b n n \begin{alignat*}{6}
& \Aelid{11}{} u^1 &&+ \Aelid{12}{} u^2 &&+ \cdots &&+ \Aelid{1\nnode}{} u^{\nnode} &&\quad=\quad b^1 \\
& \Aelid{21}{} u^1 &&+ \Aelid{22}{} u^2 &&+ \cdots &&+ \Aelid{2\nnode}{} u^{\nnode} &&\quad=\quad b^2 \\
& \quad\vdots && \qquad\;\vdots && \quad\;\;\vdots && \qquad\;\vdots && \qquad\quad\;\;\vdots \\
& \Aelid{\nnode 1}{} u^1 &&+ \Aelid{\nnode 2}{} u^2 &&+ \cdots &&+ \Aelid{\nnode\nnode}{} u^{\nnode} &&\quad=\quad b^{\nnode}
\end{alignat*} A 11 u 1 A 21 u 1 ⋮ A n n 1 u 1 + A 12 u 2 + A 22 u 2 ⋮ + A n n 2 u 2 + ⋯ + ⋯ ⋮ + ⋯ + A 1 n n u n n + A 2 n n u n n ⋮ + A n n n n u n n = b 1 = b 2 ⋮ = b n n
Note that with the given definitions, (7) becomes
∑ J = 1 n n A I J u J = b I for I = 1 , 2 , … n n . \begin{equation}
\boxed{
\suml{J=1}{\nnode}
\Aelid{I\!J}{} \,u^J = b^I
\quad\text{for}\quad
I=1,2,\dots\nnode.
}
\htmlId{eq:discrete10}{}
\tag{10}\end{equation} J = 1 ∑ n n A I J u J = b I for I = 1 , 2 , … n n . ( 10 )
Example: Poisson’s Equation
In the weak form of Poisson’s equation
− Δ u = f in Ω u = 0 on ∂ Ω \begin{equation}
\begin{alignedat}{4}
- \Var u &= f \quad && \text{in} \quad && \Omega \\
u &= 0 \quad && \text{on} \quad && \del\Omega
\end{alignedat}
\tag{11}\end{equation} − Δ u u = f = 0 in on Ω ∂ Ω ( 11 )
The weak formulation reads
Find u ∈ V u\in V u ∈ V such that
− ∫ Ω Δ ( u ) v d v = ∫ Ω f v d v \begin{equation}
- \int_\Omega \Delta(u) v \dv= \int_\Omega f v \dv
\tag{12}\end{equation} − ∫ Ω Δ ( u ) v d v = ∫ Ω f v d v ( 12 )
for all v ∈ V v\in V v ∈ V where V = H 0 1 ( Ω ) V=H^1_0(\Omega) V = H 0 1 ( Ω ) .
Applying integration by parts and divergence theorem on the left-hand side
∫ Ω Δ ( u ) v d v = ∫ Ω ∇ ⋅ ( ∇ ( u ) v ) d v − ∫ Ω ∇ u ⋅ ∇ v d v = ∫ ∂ Ω v ( ∇ u ⋅ n ) d a ⏟ v = 0 on ∂ Ω − ∫ Ω ∇ u ⋅ ∇ v d v \begin{equation}
\begin{aligned}
\int_\Omega \Delta(u) v \dv
&= \int_\Omega \nabla \dtp (\nabla (u) v) \dv
- \int_\Omega \nabla u\dtp\nabla v \dv \\
&= \underbrace{\int_{\del\Omega} v (\nabla u\dtp\Bn) \da}_{v = 0
\text{ on } \del\Omega}
- \int_\Omega \nabla u\dtp\nabla v \dv \\
\end{aligned}
\tag{13}\end{equation} ∫ Ω Δ ( u ) v d v = ∫ Ω ∇ ⋅ ( ∇ ( u ) v ) d v − ∫ Ω ∇ u ⋅ ∇ v d v = v = 0 on ∂ Ω ∫ ∂ Ω v ( ∇ u ⋅ n ) d a − ∫ Ω ∇ u ⋅ ∇ v d v ( 13 )
We have the following variational forms:
a ( u , v ) = ∫ Ω ∇ u ⋅ ∇ v d v b ( v ) = ∫ Ω f v d v \begin{equation}
\begin{aligned}
a(u,v) &= \int_{\Omega} \nabla u \dtp \nabla v \dv\\
b(v) &= \int_{\Omega} f \, v \dv\\
\end{aligned}
\tag{14}\end{equation} a ( u , v ) b ( v ) = ∫ Ω ∇ u ⋅ ∇ v d v = ∫ Ω f v d v ( 14 )
Following (7) , we can calculate the stiffness matrix
A \BA A as
A I J = a ( N J , N I ) = ∫ Ω ∇ N J ⋅ ∇ N I d v = ∫ Ω B J ⋅ B I d v \begin{equation}
\begin{aligned}
\Aelid{I\!J}{} = a(N^J, N^I)
&= \int_{\Omega} \nabla N^J \dtp \nabla N^I \dv \\
&= \int_{\Omega} \BB^J \dtp \BB^I \dv
\end{aligned}
\tag{15}\end{equation} A I J = a ( N J , N I ) = ∫ Ω ∇ N J ⋅ ∇ N I d v = ∫ Ω B J ⋅ B I d v ( 15 )
where we have defined the gradient of the basis functions as
B I : = ∇ N I . \begin{equation}
\BB^I := \nabla N^I\,.
\tag{16}\end{equation} B I := ∇ N I . ( 16 )
Similarly, we integrate the force term into a vector b \Bb b as
b I = ∫ Ω f N I d v \begin{equation}
\begin{aligned}
b^I &= \int_{\Omega} f N^I \dv
\end{aligned}
\tag{17}\end{equation} b I = ∫ Ω f N I d v ( 17 )