58. Kirchhoff plate equation#
\(\DeclareMathOperator{\operatorname{div}}{div}\) Find vertical deflection \(w\) such that
Reduce to second order system with bending moments \(\sigma\):
Variational formulation with \(\sigma \in H(\operatorname{div})^{SYM}\) and \(w \in H^1\):
\(H(\operatorname{div})^{SYM}\) requires finite elements which are symmetric, and the normal vector \(\sigma n\) is continuous. This is non-trivial, but possible [Arnold-Winther, …]
58.1. Hellan Herrmann Johnson Method#
Hellan 67, Herrmann 67, Johnson 73, Brezzi-Raviart 77, Arnold+Brezzi 85, Comodi 89, Krendl+Rafetseder+Zulehner 16, Chen+Hu+Huang 16, Braess+Pechstein+JS 20
Is an arbitrary order (\(k \geq 0\)) mixed discretization method on possibly curved, mapped triangular elements.
Allows hybridization to obtain a positive definite system matrix, lowest order case corresponds to the Morley element.
Function space $\( H(\operatorname{div} \operatorname{div}) = \{ \sigma \in L_2^{2\times 2, SYM} : \operatorname{div} \operatorname{div} \sigma \in H^{-1} \} \)$
HHJ finite element space: symmetric matrices, piecewise polynomial, continuous nn-component
Find \(\sigma_h \in \Sigma_h \subset H(\operatorname{div} \operatorname{div})\) and \(w_h \in W_h \subset H^1\) such that
This mixed method satisfies the magic discrete kernel inclusion
leading to the best-approximation property of the bending moments \(\sigma\):
58.1.1. Distributional derivatives:#
for continuous, piece-wise smooth \(w\), and smooth \(\tau\):
for \(nn\)-continuous, piece-wise smooth \(\sigma\), and smooth \(v\):
from ngsolve import *
from ngsolve.webgui import Draw
mesh = Mesh (unit_square.GenerateMesh(maxh=0.1))
Define product finite element space for \(H(\text{div div}) \times H^1\)
order = 2
Sigma = HDivDiv(mesh, order=order) # dirichlet="left|right|top")
W = H1(mesh, order=order+1, dirichlet=".*") # "bottom|left|right")
X = Sigma * W
print ("ndof-Sigma:", Sigma.ndof, ", ndof-W:", W.ndof, ", ndof-X:", X.ndof)
ndof-Sigma: 3192 , ndof-W: 1105 , ndof-X: 4297
with
sigma, w = X.TrialFunction()
tau, v = X.TestFunction()
n = specialcf.normal(2)
def tang(u): return u-(u*n)*n
def DivDiv(sigma,v):
return div(sigma)*grad(v)*dx - (sigma*n)*tang(grad(v))*dx(element_boundary=True)
a = BilinearForm(InnerProduct(sigma,tau)*dx \
+ DivDiv(sigma,v) + DivDiv(tau,w) \
- 1e-10*w*v*dx).Assemble()
f = LinearForm(200*v*dx).Assemble()
gfu = GridFunction(X)
gfu.vec.data = a.mat.Inverse(X.FreeDofs(), inverse="sparsecholesky") * f.vec
the vertical deflection:
gfsigma, gfw = gfu.components
Draw (gfw, mesh, deformation=True);
the bending moments \(\sigma_{xx}\):
Draw (gfsigma[0,0], mesh);
58.2. Hybridization:#
Lagrange-parameter $\( \widehat{w_n} \approx \partial_n w \)\( enforces continuity of \)\sigma_{nn}$.
order = 2
Sigma = Discontinuous(HDivDiv(mesh, order=order))
W = H1(mesh, order=order+1, dirichlet=".*") # "bottom|left|right")
What = NormalFacetFESpace (mesh, order=order, dirichlet=".*")
X = Sigma * W * What
print (X.ndof)
6385
sigma, w, what = X.TrialFunction()
tau, v, vhat = X.TestFunction()
n = specialcf.normal(2)
def tang(u): return u-(u*n)*n
def normal(u): return (u*n)*n
def DivDiv(sigma,v,vhat):
return div(sigma)*grad(v)*dx - (sigma*n)*(tang(grad(v))-normal(vhat))*dx(element_boundary=True)
a = BilinearForm(InnerProduct(sigma,tau)*dx + DivDiv(sigma,v,vhat) + DivDiv(tau,w,what), \
condense=True).Assemble()
f = LinearForm(200*v*dx).Assemble()
# inverse from static conensation
invSchur = a.mat.Inverse(X.FreeDofs(True), inverse="sparsecholesky")
ext = IdentityMatrix()+a.harmonic_extension
inv = ext @ invSchur @ ext.T + a.inner_solve
gfu = GridFunction(X)
gfu.vec.data = inv * f.vec
gfsigma, gfw, gfwhat = gfu.components
Draw (gfu.components[1], mesh, deformation=True)
Draw (gfu.components[0][0,0], mesh);