Solving an elasto-plastic model using DOLFIN - FEniCS Project
Solving an elasto-plastic model using DOLFIN - FEniCS Project Solving an elasto-plastic model using DOLFIN - FEniCS Project
Solving an elasto-plastic model using DOLFIN TTI 2005 Johan Jansson johanjan@math.chalmers.se Chalmers University of Technology Solving an elasto-plastic model using DOLFIN – p. 1
- Page 2 and 3: Overview Motivation Previous work S
- Page 4 and 5: Motivation - examples State of the
- Page 6 and 7: Previous work - simulations Can we
- Page 8 and 9: Simple derivation of model u depend
- Page 10 and 11: Examples Elastic bar (Updated Lagra
- Page 12 and 13: Plasticity ˙σ = E(ɛ(v) − 1 ν
- Page 14 and 15: Discretization of model Finite elem
- Page 16 and 17: Discretization of model ˙σ K i h
- Page 18 and 19: The FEniCS project A free software
- Page 20 and 21: Solving a PDE with DOLFIN Solving a
- Page 22 and 23: Automatic assembling class Poisson
- Page 24 and 25: Abstract assembly algorithm ∫ (A
- Page 26 and 27: Solving a PDE with FFC/DOLFIN Solvi
- Page 28 and 29: Example: Classical Elasticity The f
- Page 30 and 31: Example: Classical Elasticity FFC o
- Page 32 and 33: Benchmark results Mesh 1 24576 (25k
- Page 34: Future work Solve elasto-plastic mo
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong><br />
<strong>DOLFIN</strong><br />
TTI 2005<br />
Joh<strong>an</strong> J<strong>an</strong>sson<br />
joh<strong>an</strong>j<strong>an</strong>@math.chalmers.se<br />
Chalmers University of Technology<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 1
Overview<br />
Motivation<br />
Previous work<br />
Simple derivation of <strong>model</strong><br />
Plasticity<br />
Discretization<br />
<strong>FEniCS</strong><br />
Implementation <strong>using</strong> FFC/<strong>DOLFIN</strong><br />
Perform<strong>an</strong>ce results<br />
Future work<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 2
Motivation<br />
Computational elasticity useful in m<strong>an</strong>y fields:<br />
Computer <strong>an</strong>imation<br />
Computer games<br />
CAD<br />
...<br />
BUT, established <strong>model</strong>s are crude, ad hoc (outside of<br />
CAD).<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 3
Motivation - examples<br />
State of the art computer games use rigid body motion with<br />
joints (Half Life 2).<br />
Motion pictures primarily use <strong>an</strong>imation by h<strong>an</strong>d, some<br />
cases of mass-spring simulation (hair).<br />
Why don’t these applications use more adv<strong>an</strong>ced/general<br />
<strong>model</strong>s?<br />
Traditional elasticity <strong>model</strong>s are difficult to underst<strong>an</strong>d ⇒<br />
difficult to apply, use effectively.<br />
Attempt to find a simple <strong>model</strong>, attempt to automatize<br />
discretization of <strong>model</strong>.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 4
Previous work - mass-spring <strong>model</strong><br />
Point-masses connected by “springs”.<br />
The springs represent forces between the masses - Hooke<br />
elasticity (F = −k(e(x))), damping (F = −bė(x)) (e -<br />
elongation of spring).<br />
Newton’s second law: (F = mẍ).<br />
Collision/contact h<strong>an</strong>dled by each mass having a radius -<br />
add a spring when two masses intersect.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 5
Previous work - simulations<br />
C<strong>an</strong> we find <strong>an</strong> <strong>an</strong>alogous PDE-<strong>model</strong>?<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 6
Simple derivation of <strong>model</strong><br />
Classical linear elasticity:<br />
u = x − X,<br />
˙u − v = 0 in Ω 0 ,<br />
˙v − ∇ · σ = f in Ω 0 ,<br />
σ = Eɛ(u) = E(∇u ⊤ + ∇u)<br />
Eɛ = λ ∑ k<br />
ɛ kk δ ij + 2µɛ,<br />
v(0, ·) = v 0 , u(0, ·) = u 0 in Ω 0 .<br />
Only works for small displacements. Computations carried out on fixed<br />
geometry Ω 0 . Why not use the deformed geometry Ω(t)?<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 7
Simple derivation of <strong>model</strong><br />
u depends on Ω 0 (X is defined on Ω 0 ). Let’s compute in v<br />
instead.<br />
Differentiate σ wrt. t:<br />
σ = Eɛ(u) = E(∇u ⊤ + ∇u) ⇒<br />
˙σ = Eɛ(v) = E(∇v ⊤ + ∇v)<br />
Rest of the <strong>model</strong> remains the same.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 8
The elastic <strong>model</strong><br />
Now formulate the <strong>model</strong> in the deformed geometry Ω(t):<br />
˙u − v = 0<br />
˙v − ∇ · σ = f<br />
in Ω(t),<br />
in Ω(t),<br />
˙σ = Eɛ(v) = E(∇v ⊤ + ∇v)<br />
v(0, ·) = v 0 , u(0, ·) = u 0 in Ω 0 .<br />
The <strong>model</strong> is a piecewise linear elastic <strong>model</strong>. Given some<br />
geometry Ω i we compute <strong>using</strong> the linear <strong>model</strong> (small<br />
displacements) for a small time step <strong>an</strong>d produce the<br />
geometry Ω i+1 . The process is then repeated.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 9
Examples<br />
Elastic bar (Updated Lagr<strong>an</strong>ge)<br />
Elastic bar (Mass-spring)<br />
Elastic cube (Classical elasticity)<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 10
Viscosity<br />
˙v − ∇ · σ − νɛ(v) = f<br />
in Ω(t)<br />
We add a simple viscous term to <strong>model</strong> viscosity in<br />
materials.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 11
Plasticity<br />
˙σ = E(ɛ(v) − 1 ν p<br />
(σ − πσ))<br />
πσ = σ<br />
‖σ‖ , ‖σ‖ > Y s<br />
πσ = σ, ‖σ‖ ≤ Y s<br />
in Ω(t),<br />
Visco-<strong>plastic</strong> <strong>model</strong>. πσ is the projection on to the set of<br />
admissible stresses. Y s is the yield stress of the material.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 12
Examples (Plasticity)<br />
Elastic diamond<br />
Plastic diamond<br />
Plastic bar (no gravity)<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 13
Discretization of <strong>model</strong><br />
Finite element discretization (elastic <strong>model</strong>):<br />
Ansatz:<br />
∫<br />
Ω<br />
˙vq dx −<br />
∫<br />
Ω<br />
˙v − ∇ · σ = f ⇒<br />
∫<br />
∇ · σq dx = fq dx<br />
Ω<br />
v h = ∑ j<br />
ξ v j φ j<br />
σ h = ∑ j<br />
ξ σ j ψ j<br />
φ piecewise linear. ψ piecewise const<strong>an</strong>t.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 14
Discretization of <strong>model</strong><br />
Insert <strong>an</strong>satz <strong>an</strong>d choose test space as piecewise linear:<br />
∫<br />
Ω<br />
∑<br />
j<br />
˙ξ v j φ j φ i dx −<br />
∫<br />
Ω<br />
∑<br />
j<br />
∫<br />
ξj σ ψ j ∇φ i dx =<br />
Mξ v − Aξ σ = b<br />
Ω<br />
fφ i dx, ∀i ⇒<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 15
Discretization of <strong>model</strong><br />
˙σ K i<br />
h<br />
= E(∇v⊤ + ∇v) K i<br />
, ∀K i ∈ T Ω (t)<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 16
General examples<br />
Elastic cow<br />
Visco-elastic cow<br />
Plastic cow<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 17
The <strong>FEniCS</strong> project<br />
A free software project for the Automation of Computational<br />
Mathematical Modeling (ACMM), developed at<br />
The Toyota Technological Institute at Chicago<br />
The University of Chicago<br />
Chalmers University of Technology (Göteborg, Sweden)<br />
Argonne National Laboratory (Chicago)<br />
More information at http://www.fenics.org/<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 18
<strong>Project</strong>s<br />
<strong>DOLFIN</strong>, the C++ interface of <strong>FEniCS</strong><br />
Hoffm<strong>an</strong>, J<strong>an</strong>sson, Logg, et al.<br />
FErari, optimized form evaluation<br />
Kirby, Knepley, Scott<br />
FFC, the <strong>FEniCS</strong> Form Compiler<br />
Logg<br />
FIAT, automatic generation of finite elements<br />
Kirby, Knepley<br />
Ko, simulation of mech<strong>an</strong>ical systems<br />
J<strong>an</strong>sson<br />
Puffin, light-weight version for Octave/MATLAB<br />
Hoffm<strong>an</strong>, Logg<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 19
<strong>Solving</strong> a PDE with <strong>DOLFIN</strong><br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 20
Implementing a solver<br />
void PoissonSolver::solve()<br />
{<br />
Galerkin fem;<br />
Matrix A;<br />
Vector x, b;<br />
Function u(mesh, x);<br />
Function f(mesh, "source");<br />
Poisson poisson(f);<br />
KrylovSolver solver;<br />
File<br />
file("poisson.m");<br />
fem.assemble(poisson, mesh, A, b);<br />
solver.solve(A, x, b);<br />
}<br />
u.rename("u", "temperature");<br />
file
Automatic assembling<br />
class Poisson : public PDE {<br />
...<br />
real lhs(const ShapeFunction& u, const ShapeFunction& v)<br />
{<br />
return (grad(u),grad(v)) * dK;<br />
}<br />
real rhs(const ShapeFunction& v)<br />
{<br />
return f*v * dK;<br />
}<br />
...<br />
};<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 22
Automatic assembling<br />
class ConvDiff : public PDE {<br />
...<br />
real lhs(const ShapeFunction& u, const ShapeFunction& v)<br />
{<br />
return (u*v + k*((b,grad(u))*v + a*(grad(u),grad(v))))*dK;<br />
}<br />
real rhs(const ShapeFunction& v)<br />
{<br />
return (up*v + k*f*v) * dK;<br />
}<br />
...<br />
};<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 23
Abstract assembly algorithm<br />
∫<br />
(A h ) ij = a(ϕ j , ˆϕ i ) = A(ϕ j )ˆϕ i dx<br />
Ω<br />
= ∑ ∫<br />
A(ϕ j )ˆϕ i dx = ∑<br />
K∈T<br />
K<br />
K∈T<br />
a(ϕ j , ˆϕ i ) K .<br />
Iterate over all elements K <strong>an</strong>d for each element K<br />
compute the contributions to all (A h ) ij , for which ϕ j <strong>an</strong>d ˆϕ i<br />
are supported within K.<br />
Assemble on reference element <strong>an</strong>d map values to real<br />
element.<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 24
The <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> in <strong>DOLFIN</strong><br />
class ElasticityUpdated : public PDE {<br />
...<br />
real rhs(ShapeFunction::Vector& v)<br />
{<br />
... Compute sigma ...<br />
}<br />
};<br />
return (k * (f(0) * v(0) + f(1) * v(1) + f(2) * v(2)) -<br />
k * (sigma(0, 0) * v(0).ddx() +<br />
sigma(0, 1) * v(0).ddy() +<br />
sigma(0, 2) * v(0).ddz() +<br />
sigma(1, 0) * v(1).ddx() +<br />
sigma(1, 1) * v(1).ddy() +<br />
sigma(1, 2) * v(1).ddz() +<br />
sigma(2, 0) * v(2).ddx() +<br />
sigma(2, 1) * v(2).ddy() +<br />
sigma(2, 2) * v(2).ddz())) * dx;<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 25
<strong>Solving</strong> a PDE with FFC/<strong>DOLFIN</strong><br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 26
FFC: the <strong>FEniCS</strong> Form Compiler<br />
Automates a key step in the implementation of finite<br />
element methods for partial differential equations<br />
Input: a variational form <strong>an</strong>d a finite element<br />
Output: optimal C/C++<br />
a(v,u) = ∫ Ω<br />
∇v(x) · ∇u(x)dx<br />
FFC<br />
Poisson.h<br />
>> ffc [-l l<strong>an</strong>guage] poisson.form<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 27
Example: Classical Elasticity<br />
The form:<br />
where (as before):<br />
a(u,v) =<br />
l(v) =<br />
∫<br />
∫<br />
Ω<br />
Ω<br />
σ(u)ɛ(v)<br />
fv<br />
ɛ(u) = ∇u ⊤ + ∇u<br />
σ(u) = Eɛ(u)<br />
Eɛ = λ ∑ k<br />
ɛ kk δ ij + 2µɛ,<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 28
Example: Classical Elasticity<br />
FFC representation (Elasticity.form):<br />
# The bilinear form for classical linear elasticity<br />
# Compile this form with FFC: ffc Elasticity.form.<br />
name = "Elasticity"<br />
element = FiniteElement("Lagr<strong>an</strong>ge", "tetrahedron", 1, 3)<br />
c1 = Const<strong>an</strong>t() # Lame coefficient<br />
c2 = Const<strong>an</strong>t() # Lame coefficient<br />
f = Function(element) # Source<br />
v = BasisFunction(element)<br />
u = BasisFunction(element)<br />
a = (2.0 * c1 * u[i].dx(i) * v[j].dx(j) +<br />
c2 * (u[i].dx(j) + u[j].dx(i)) * (v[i].dx(j) + v[j].dx(i))) * dx<br />
L = f[i] * v[i] * dx<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 29
Example: Classical Elasticity<br />
FFC output (Elasticity.h):<br />
BilinearForm(const real& c0, const real& c1) : ...<br />
bool interior(real* block) const<br />
{<br />
// Compute geometry tensors<br />
real G0_0_0_0_0 = det*c0*g00*g00;<br />
real G0_0_0_0_1 = det*c0*g00*g10;<br />
...<br />
// Compute element tensor<br />
block[0] =<br />
3.333333333333329e-01*G0_0_0_0_0 + 3.333333333333329e-01*G0_0_0_0_1 +<br />
3.333333333333329e-01*G0_0_0_0_2 + 3.333333333333329e-01*G0_0_0_1_0 +<br />
3.333333333333329e-01*G0_0_0_1_1 + 3.333333333333329e-01*G0_0_0_1_2 +<br />
3.333333333333329e-01*G0_0_0_2_0 + 3.333333333333329e-01*G0_0_0_2_1 +<br />
3.333333333333329e-01*G0_0_0_2_2 + 1.666666666666664e-01*G1_0_0 +<br />
1.666666666666664e-01*G1_0_1 + 1.666666666666664e-01*G1_0_2 +<br />
1.666666666666664e-01*G1_1_0 + 1.666666666666664e-01*G1_1_1 +<br />
...<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 30
Benchmark<br />
Beam example<br />
Task: assemble global matrix <strong>an</strong>d load vector<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 31
Benchmark results<br />
Mesh 1<br />
24576 (25k) cells<br />
old:<br />
matrix - 19.2s<br />
vector - 5.21s<br />
ffc:<br />
matrix - 0.770s<br />
vector - 0.0900s<br />
speedup:<br />
matrix - 25<br />
vector - 58<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 32
Benchmark results<br />
Mesh 2<br />
162000 (162k) cells<br />
old:<br />
matrix - 119s<br />
vector - 33.2s<br />
ffc:<br />
matrix - 9.12s<br />
vector - 0.560s<br />
speedup:<br />
matrix - 13<br />
vector - 60<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 33
Future work<br />
Solve <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> FFC<br />
Multi-adaptive time stepping<br />
Space adaptivity<br />
Interface to fluid mech<strong>an</strong>ics (Navier-Stokes).<br />
<strong>Solving</strong> <strong>an</strong> <strong>elasto</strong>-<strong>plastic</strong> <strong>model</strong> <strong>using</strong> <strong>DOLFIN</strong> – p. 34