Top Banner
Code Generation for High-Level Problem Specification and HPC Hans Petter Langtangen Center for Biomedical Computing Simula Research Laboratory Dept. of Informatics, University of Oslo Advances in Numerical Algorithms and HPC, April 14, 2014
54

Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Jun 04, 2018

Download

Documents

vodiep
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Code Generation forHigh-Level Problem Specification and HPC

Hans Petter Langtangen

Center for Biomedical ComputingSimula Research Laboratory

Dept. of Informatics, University of Oslo

Advances in Numerical Algorithms and HPC, April 14, 2014

Page 2: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS Mint

Page 3: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

1 FEniCS: HPC Finite Element Solution of PDEs

2 Mint: HPC Finite Difference Solution of PDEs

3 Algorthms and HPC

Page 4: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS solves PDEs by the finite element method

Input: finite element formulation of the PDE problem∫Ω∇u · ∇v dx +

∫Ω fv dx in Python

Output: C++ code loaded back in Python

Python module with C++ definition of element matrix/vector

Page 5: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS solves PDEs by the finite element method

Input: finite element formulation of the PDE problem∫Ω∇u · ∇v dx +

∫Ω fv dx in Python

Output: C++ code loaded back in Python

Python module with C++ definition of element matrix/vector

Page 6: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS solves PDEs by the finite element method

Input: finite element formulation of the PDE problem∫Ω∇u · ∇v dx +

∫Ω fv dx in Python

Output: C++ code loaded back in Python

Python module with C++ definition of element matrix/vector

Page 7: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Python + large-scale simulation + HPC = true

Some HPC projects in Python:

General FE PDE solution: FEniCS, www.fenics.org

General FV PDE solution: FiPy, www.ctcms.nist.gov/fipy

Hyperbolic PDEs w/finite volumes: PyClaw,kingkong.amath.washington.edu/clawpack/users/pyclaw/

Discontinuous Galerkin FE PDE solver: hedge

Andreas Klockner has many HPC tools for Python

Quantum mechanics: GPAW, wiki.fysik.dtu.dk/gpaw

N-body dynamics: pNbody, obswww.unige.ch/˜revaz/pNbody

Page 8: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS tries to combine four contradictory goals

Simplicity∫Ω a∇u · ∇v dx → dot(a*grad(u), grad(v))*dx

Generality

Linear a(u, v) = L(v) or nonlinear F (u; v) = 0 variational problem

Efficiency

Generated C++ code tailored to the problem + efficientthird-party libraries (PETSc, Trilinos, ...)

Reliability

Given a goal M(u) and tolerance ε, compute u such that

||M(ue)−M(u)|| ≤ ε (ue: exact sol.)

Generality Efficiency

Code Generation

Page 9: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS tries to combine four contradictory goals

Simplicity∫Ω a∇u · ∇v dx → dot(a*grad(u), grad(v))*dx

Generality

Linear a(u, v) = L(v) or nonlinear F (u; v) = 0 variational problem

Efficiency

Generated C++ code tailored to the problem + efficientthird-party libraries (PETSc, Trilinos, ...)

Reliability

Given a goal M(u) and tolerance ε, compute u such that

||M(ue)−M(u)|| ≤ ε (ue: exact sol.)

Generality Efficiency

Code Generation

Page 10: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS tries to combine four contradictory goals

Simplicity∫Ω a∇u · ∇v dx → dot(a*grad(u), grad(v))*dx

Generality

Linear a(u, v) = L(v) or nonlinear F (u; v) = 0 variational problem

Efficiency

Generated C++ code tailored to the problem + efficientthird-party libraries (PETSc, Trilinos, ...)

Reliability

Given a goal M(u) and tolerance ε, compute u such that

||M(ue)−M(u)|| ≤ ε (ue: exact sol.)

Generality Efficiency

Code Generation

Page 11: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS tries to combine four contradictory goals

Simplicity∫Ω a∇u · ∇v dx → dot(a*grad(u), grad(v))*dx

Generality

Linear a(u, v) = L(v) or nonlinear F (u; v) = 0 variational problem

Efficiency

Generated C++ code tailored to the problem + efficientthird-party libraries (PETSc, Trilinos, ...)

Reliability

Given a goal M(u) and tolerance ε, compute u such that

||M(ue)−M(u)|| ≤ ε (ue: exact sol.)

Generality Efficiency

Code Generation

Page 12: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS tries to combine four contradictory goals

Simplicity∫Ω a∇u · ∇v dx → dot(a*grad(u), grad(v))*dx

Generality

Linear a(u, v) = L(v) or nonlinear F (u; v) = 0 variational problem

Efficiency

Generated C++ code tailored to the problem + efficientthird-party libraries (PETSc, Trilinos, ...)

Reliability

Given a goal M(u) and tolerance ε, compute u such that

||M(ue)−M(u)|| ≤ ε (ue: exact sol.)

Generality Efficiency

Code Generation

Page 13: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

”Hello, world!” for PDEs: −∇ · (k∇u) = f

−∇ · (k∇u) = f in Ω

u = g on ∂ΩD

−k ∂u∂n

= α(u − u0) on ∂ΩR

Variational problem: find u ∈ V such that

F =

∫Ωk∇u · ∇vdx −

∫Ωfvdx +

∫∂ΩR

α(u − u0)vds = 0 ∀ v ∈ V

Implementation:

F = dot(k*grad(u), grad(v))*dx - f*v*dx + alpha*(u-u0)*v*ds

Page 14: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

”Hello, world!” for PDEs: −∇ · (k∇u) = f

−∇ · (k∇u) = f in Ω

u = g on ∂ΩD

−k ∂u∂n

= α(u − u0) on ∂ΩR

Variational problem: find u ∈ V such that

F =

∫Ωk∇u · ∇vdx −

∫Ωfvdx +

∫∂ΩR

α(u − u0)vds = 0 ∀ v ∈ V

Implementation:

F = dot(k*grad(u), grad(v))*dx - f*v*dx + alpha*(u-u0)*v*ds

Page 15: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

”Hello, world!” for PDEs: −∇ · (k∇u) = f

−∇ · (k∇u) = f in Ω

u = g on ∂ΩD

−k ∂u∂n

= α(u − u0) on ∂ΩR

Variational problem: find u ∈ V such that

F =

∫Ωk∇u · ∇vdx −

∫Ωfvdx +

∫∂ΩR

α(u − u0)vds = 0 ∀ v ∈ V

Implementation:

F = dot(k*grad(u), grad(v))*dx - f*v*dx + alpha*(u-u0)*v*ds

Page 16: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

”Hello, world!” for PDEs: −∇ · (k∇u) = f

−∇ · (k∇u) = f in Ω

u = g on ∂ΩD

−k ∂u∂n

= α(u − u0) on ∂ΩR

Variational problem: find u ∈ V such that

F =

∫Ωk∇u · ∇vdx −

∫Ωfvdx +

∫∂ΩR

α(u − u0)vds = 0 ∀ v ∈ V

Implementation:

F = dot(k*grad(u), grad(v))*dx - f*v*dx + alpha*(u-u0)*v*ds

Page 17: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

The complete ”Hello, world!” program

from dolfin import *

mesh = Mesh(’mydomain.xml.gz’)

V = FunctionSpace(mesh , ’Lagrange ’, degree=1)

dOmega_D = MeshFunction(’uint’, mesh , ’myboundary.xml.gz’)

g = Constant(0.0)

bc = DirichletBC(V, g, 1, dOmega_D)

u = TrialFunction(V)

v = TestFunction(V)

f = Constant(2.0)

k = Expression(’A*x[1]*sin(pi*q*x[0])’, A=4.5, q=1)

alpha = 10; u0 = 2

F = dot(k*grad(u), grad(v))*dx - f*v*dx + alpha*(u-u0)*v*ds

a = lhs(F); L = rhs(F)

u = Function(V) # finite element function to compute

solve(a == L, u, bc)

plot(u)

Page 18: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example of an autogenerated element matrix routine

Page 19: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Mixed formulation of −∇ · (k∇u) = f

PDE problem:

∇ · q = f in Ω

−k−1q = ∇u in Ω

Variational problem: find (u, q) ∈ V × Q such that

F =

∫Ω∇ · q v dx −

∫Ωfv dx +

∫Ωk−1q · p dx +

∫Ω∇ · p u dx

∀ (v , p) ∈ V × Q

Principal implementation line:

F = div(q)*v*dx - f*v*dx + (1./k)*dot(q,p)*dx + div(p)*u*dx

Page 20: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

The program

mesh = UnitCube(N, N, N)

Q = FunctionSpace(mesh , "BDM", 1)

V = FunctionSpace(mesh , "DG", 0)

W = Q * V

q, u = TrialFunctions(W)

p, v = TestFunctions(W)

f = Expression(’x[0] > L/2 ? a : 0’, L=1, a=2)

F = div(q)*v*dx - f*v*dx + (1./k)*dot(q,p)*dx + div(p)*u*dx

a = lhs(F); L = rhs(F)

A = assemble(a)

b = assemble(L)

qu = Function(W) # compound (q,u) field to be solved for

solve(A, uq.vector (), b, ’gmres ’, ’ilu’)

q, u = qu.split ()

Page 21: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Discontinuous Galerkin method for −∇ · (k∇u) = f

Variational problem:

F =

∫Ω∇u · ∇v dx −

∫Γ〈∇u〉 · [vn] dS

−∫

Γ[un] · 〈∇v〉 dS +

α

h

∫Γ

[un] · [vn] dS −∫

Ωfv dx = 0

Implementation:

F = dot(grad(u), grad(v))*dx \

- dot(jump(u, n), avg(grad(v)))*dS \

- dot(avg(grad(u)), jump(v, n))*dS \

+ alpha/h*dot(jump(u, n), jump(v, n))*dS \

- f*v*dx

a = lhs(F); L = rhs(F)

Page 22: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Fluid flow ”Hello, world!”: Stokes’ problem

Stokes’ problem for slow viscous flow:

−∇2u +∇p = f

∇ · u = 0

Variational problem: find (u, p) ∈ V × Q such that

F =

∫Ω

(∇v : ∇u −∇ · v p + v · f ) dx+∫Ωq∇ · u dx = 0 ∀ (v , q) ∈ V × Q

Page 23: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Fluid flow ”Hello, world!” code

V = VectorFunctionSpace(mesh , ’Lagrange ’, 2)

Q = FunctionSpace(mesh , ’Lagrange ’, 1)

W = V * Q # Taylor -Hood mixed finite element

v, q = TestFunctions(W)

u, p = TrialFunctions(W)

f = Constant ((0, 0))

F = (inner(grad(v), grad(u)) - div(v)*p + q*div(u))*dx + dot(v, f)*dx

a = lhs(F); L = rhs(F)

up = Function(W)

solve(a == L, up, bc) # solve variational problem

# or

A = assemble(a); b = assemble(L)

solve(A, up.vector (), b) # solve linear system

u, p = up.split ()

Page 24: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Again, code ≈ math

Key mathematical formula:

F =

∫Ω

(∇v : ∇u −∇ · v p + v · f ) dx +

∫Ωq∇ · u dx

Key code line:

F = (inner(grad(v), grad(u)) - div(v)*p + dot(f,v)*dx + q*div(u))*dx

Page 25: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS supports a rich set of finite elements

Lagrangeq (Pq), DGq, BDMq, BDFMq, RTq, Nedelec

1st/2nd kind, Crouzeix–Raviart, Arnold-Winther, PqΛk ,P−q Λk , Morley, Hermite, Argyris, Bell, ...

Page 26: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Hyperelasticity (Fung model for biological tissues)

Mathematical problem:

F = I +∇uuu uuu : unknown displacement

C = FT : F

E = (C − I )/2

ψ =λ

2(trE )2 + K exp((EA) : E ) material law

P =∂ψ

∂Estress tensor

F =

∫ΩP : ∇vvv dx nonlinear variational form

J =∂F

∂uJacobian (”tanget stiffness”)

Page 27: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Hyperelasticity implementation

V = VectorFunctionSpace(mesh , ’Lagrange ’, order)

v = TestFunction(V)

u = TrialFunction(V)

u_ = Function(V) # computed solution

I = Identity(u_.cell().d)

F = I + grad(u_)

J = det(F)

C = F.T * F

E = (C-I)/2

# Material law

lambda_ = Constant(1.0)

A = Expression ([[’1.0 + x[0]’, ’0.3’], [’0.3’, ’2.3’]])

K = Constant(1.0)

psi = lambda_/2 * tr(E)**2 + K*exp(inner(A*E,E))

P = F*diff(psi , E) # symbolic differentiation

F = inner(P, grad(v))*dx

J = derivative(F, u_, u) # symbolic differentiation

A = assemble(J)

Page 28: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

The generated code is order of magnitude faster thanstandard hand-written code

Mass matrix Poisson Navier-Stokes Elasticity10-8

10-7

10-6

10-5

10-4

Tim

e / s

Computing the element stiffness matrix with linear Lagrange elementsHand-writtenGenerated

Page 29: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

The generated code is order of magnitude faster thanstandard hand-written code

Speed-up vs standard quadrature

Form q = 1 q = 2 q = 3 q = 4 q = 5 q = 6 q = 7

Mass 2D 12 31 50 78 108 147 183Mass 3D 21 81 189 355 616 881 1442Poisson 2D 8 29 56 86 129 144 189Poisson 3D 9 56 143 259 427 341 285Navier–Stokes 2D 32 33 53 37 — — —Navier–Stokes 3D 77 100 61 42 — — —Elasticity 2D 10 43 67 97 — — —Elasticity 3D 14 87 103 134 — — —

Page 30: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Parallel computing

Distributed computing via MPI:

Terminal> mpirun -n 32 python myprog.py

Shared memory via OpenMP:

# In program

parameters[’num_threads ’] = Q

Page 31: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Some applications of FEniCS

Fluid flow Hyperelasticity Fluid-structure

Mantle flow Electrophysiology Block prec.

Page 32: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

1 FEniCS: HPC Finite Element Solution of PDEs

2 Mint: HPC Finite Difference Solution of PDEs

3 Algorthms and HPC

Page 33: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Automated error control

Input

a(u, v) = L(v) orF (u; v) = 0

Goal M(u)

ε > 0

Output

u such that

‖M(ue)−M(u)‖ ≤ ε

(ue: exact solution)

Page 34: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS automatatically generates a posteriori errorestimators and refinement indicators

Solve

Dual Estimate

uh

Indicate

Refine

ηTT∈Th

ηh < ε

Page 35: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Error control: just define the goal and the tolerance

# Define variational form as usual

F = ....

# Define goal functional

M = dot(mu*(grad(u) + grad(u).T), n)*ds(FLAP)

tol = 1E-3

solve(F == 0, u, bc, M=M, tol=tol)

Page 36: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example: compute shear stress in a bone implant

Polymer-fluid mixture

Nonlinear hyperelasticity

Complicated constitutive law

Novel mixeddisplacement-stressdiscretization viaArnold-Winther element

Page 37: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Adaptivity pays off – but would be really difficult toimplement by hand in this case

Page 38: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

1 FEniCS: HPC Finite Element Solution of PDEs

2 Mint: HPC Finite Difference Solution of PDEs

3 Algorthms and HPC

Page 39: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

FEniCS really pays off in computational turbulence

Scope:

The jungle of Reynolds-AveragedNavier-Stokes (RANS) models: k-ε,k-ω, v2-f , various tensor models, ...’

Should be easy to implement andcompare...

Various models

Various linearizations

Coupled vs. segregated solution

Picard vs. Newton iteration

Page 40: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example: k-ε model (unknowns: uuu, p, k , ε)

∂uuu

∂t+ uuu · ∇uuu = −1

%∇p + ν∇2uuu + fff −∇ · uuu′uuu′

∇ · uuu = 0

∇ · uuu′uuu′ = −2k2

ε

1

2(∇uuu +∇uuuT ) +

2

3kI

∂k

∂t+ uuu · ∇k = ∇ · (νk∇k) + Pk − ε− D,

∂ε

∂t+ uuu · ∇ε = ∇ · (νε∇ε) + (Cε1Pk − Cε2f2ε)

ε

k+ E

ε = 2νsss : sss, sss =1

2(∇uuu′ + (∇uuu′)T )

νk = ν +νTσk

...

Page 41: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Multi-physics problems with large systems of PDEs

Solve a system of PDEs, e.g.,

L(u1, u2, ..., u6) = 0

in some grouping into subsystems, e.g.,

L1(u1, u2) = 0

L2(u3) = 0

L3(u4, u5, u6) = 0

Segregated solve (iteration) between subsystems

One scalar/vector PDE solver is compact in FEniCS

Large PDE systems require tedious, repetitive code

Let’s automate!

Page 42: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Multi-physics problems with large systems of PDEs

Solve a system of PDEs, e.g.,

L(u1, u2, ..., u6) = 0

in some grouping into subsystems, e.g.,

L1(u1, u2) = 0

L2(u3) = 0

L3(u4, u5, u6) = 0

Segregated solve (iteration) between subsystems

One scalar/vector PDE solver is compact in FEniCS

Large PDE systems require tedious, repetitive code

Let’s automate!

Page 43: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Multi-physics problems with large systems of PDEs

Solve a system of PDEs, e.g.,

L(u1, u2, ..., u6) = 0

in some grouping into subsystems, e.g.,

L1(u1, u2) = 0

L2(u3) = 0

L3(u4, u5, u6) = 0

Segregated solve (iteration) between subsystems

One scalar/vector PDE solver is compact in FEniCS

Large PDE systems require tedious, repetitive code

Let’s automate!

Page 44: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Key issue: how to linearize nonlinear PDEs

PDE for turbulent kinetic energy k (unknowns: u, k, ε)

0 = −u · ∇k +∇ · (νk(u, k, ε)∇k) + Pk(u, k, ε)− ε

Typical linearization (underscore subscript: old value)

0 = −u− · ∇k +∇ · (νk−∇k) + Pk− − ε

Page 45: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Linearization, i.e., implicit vs explicit treatment is a matterof inserting or removing an underscore

Variational form (k and vk are trial and test functions)

Fk = −∫

Ωu− ·∇k vk dx −

∫Ωνk−∇k ·∇vk dx +

∫Ω

(Pk−− ε) vk dx

Corresponding code

F_k = - inner(dot(u_ , grad(k)), v_k)*dx \

- nu_k_*inner(grad(k), grad(v_k))*dx \

+ (P_k_ - e)*v_k*dx

Page 46: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example of various explicit/implicit treatments of a term

Implicit treatment of ε in coupled k-ε system:

Fk = ...+∫

Ω εvk dx → e*v k*dx

Explicit treatment of ε for decoupled k-ε system:

Fk = ...+∫

Ω ε−vk dx → e *v k*dx

Explicit treatment of ε, but implicit term in k eq.:

Fk = ...+∫

Ω ε−kk−

vk dx → e *k/k *v k*dx

Weighted combination in coupled k-ε system:

Fk = ...+∫

Ω((1− w)ε−k + wεk−) 1k−

vk dx →(1/k )*((1-w)*e *k + w*e*k )*v k*dx

Page 47: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example of various explicit/implicit treatments of a term

Implicit treatment of ε in coupled k-ε system:

Fk = ...+∫

Ω εvk dx → e*v k*dx

Explicit treatment of ε for decoupled k-ε system:

Fk = ...+∫

Ω ε−vk dx → e *v k*dx

Explicit treatment of ε, but implicit term in k eq.:

Fk = ...+∫

Ω ε−kk−

vk dx → e *k/k *v k*dx

Weighted combination in coupled k-ε system:

Fk = ...+∫

Ω((1− w)ε−k + wεk−) 1k−

vk dx →(1/k )*((1-w)*e *k + w*e*k )*v k*dx

Page 48: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example of various explicit/implicit treatments of a term

Implicit treatment of ε in coupled k-ε system:

Fk = ...+∫

Ω εvk dx → e*v k*dx

Explicit treatment of ε for decoupled k-ε system:

Fk = ...+∫

Ω ε−vk dx → e *v k*dx

Explicit treatment of ε, but implicit term in k eq.:

Fk = ...+∫

Ω ε−kk−

vk dx → e *k/k *v k*dx

Weighted combination in coupled k-ε system:

Fk = ...+∫

Ω((1− w)ε−k + wεk−) 1k−

vk dx →(1/k )*((1-w)*e *k + w*e*k )*v k*dx

Page 49: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example of various explicit/implicit treatments of a term

Implicit treatment of ε in coupled k-ε system:

Fk = ...+∫

Ω εvk dx → e*v k*dx

Explicit treatment of ε for decoupled k-ε system:

Fk = ...+∫

Ω ε−vk dx → e *v k*dx

Explicit treatment of ε, but implicit term in k eq.:

Fk = ...+∫

Ω ε−kk−

vk dx → e *k/k *v k*dx

Weighted combination in coupled k-ε system:

Fk = ...+∫

Ω((1− w)ε−k + wεk−) 1k−

vk dx →(1/k )*((1-w)*e *k + w*e*k )*v k*dx

Page 50: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Example of various explicit/implicit treatments of a term

Implicit treatment of ε in coupled k-ε system:

Fk = ...+∫

Ω εvk dx → e*v k*dx

Explicit treatment of ε for decoupled k-ε system:

Fk = ...+∫

Ω ε−vk dx → e *v k*dx

Explicit treatment of ε, but implicit term in k eq.:

Fk = ...+∫

Ω ε−kk−

vk dx → e *k/k *v k*dx

Weighted combination in coupled k-ε system:

Fk = ...+∫

Ω((1− w)ε−k + wεk−) 1k−

vk dx →(1/k )*((1-w)*e *k + w*e*k )*v k*dx

Page 51: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Impact of w on convergence of nonlinear iterationsChannel flow, Reτ = 395

102

10-2

10-6

10-10Norm

aliz

ed re

sidu

al(a) LaunderSharma

0.00.250.50.751.0

102

10-2

10-6

10-10Norm

aliz

ed re

sidu

al

(b) JonesLaunder

0.00.250.50.751.0

0 10 20 30 40 50Numer of iterations

102

10-2

10-6

10-10Norm

aliz

ed re

sidu

al

(c) Chien

0.00.250.50.751.0

Page 52: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Proof of concept: 18 highly coupled nonlinear PDEs

The elliptic relaxation model:

∂Rij

∂t+ uk

∂Rij

∂xk+∂Tkij

∂xk= Gij + Pij − εij

L2∇2fij − fij = −Ghij

k−

2Aij

T+ standard eqs. for u, p, k , ε

Coupled implementation of variational forms:

class RF_1(TurbModel):

def form(self , R, R_ , v_R , k_, e_, P_, nu , u_ , f, f_, v_f ,

A_, Gh , Cmu , T_, L_, **kwargs):

Fr = inner(dot(grad(R), u_), v_R)*dx + nu*inner(grad(R),

grad(v_R))*dx \

+ inner(Cmu*T_*dot(grad(R), R_), grad(v_R) )*dx

- inner(k_*f, v_R)*dx - inner(P_, v_R )*dx +

inner(R*e_*(1./k_), v_R)*dx \

Ff = inner(grad(f), grad(L_**2*v_f))*dx + inner(f , v_f)*dx \

- (1./k_)*inner(Gh , v_f)*dx - (2./T_)*inner(A_ , v_f)*dx

return Fr + Ff

Page 53: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

What is the efficiency loss of so much flexibility?

Validation: ”DNS” of turbulent flow in a channel

Codes: FEniCS-based (Oasis), OpenFOAM, CDP

CPU-time with 32 processors:

FEniCS, OpenFOAM: 1.0CDP: 1.5

FEniCS needs twice as much memory as CDP

Conclusions:

80% time in Krylov solversthe splitting algorithm for N-S (# linear systems) is keypreconditioning is keyHPC of discretization details not so important

Linear systems: PETSc w/Hypre AMG

Page 54: Code Generation for High-Level Problem Speci cation and HPC€¦ · Code Generation for High-Level Problem Speci cation and HPC ... fv dx in Python ... Andreas Klockner has many HPC

Summary

Links

fenicsproject.org, FEniCS book

simula.mint.no

launchpad.net/cbcpdesys

Acknowledgments

A. Logg (Chalmers/Simula), G. Wells (Cambridge), M. Alnaes(Simula), M. Mortensen (Univ. of Oslo), Didem Unat(UCSD/Simula), S. Baden (UCSD), X. Cai (Simula), J. Hake(Simula), M. Rognes (Simula)