Finite Elemente Toolboxen
Simon Praetorius
Institut fur Wissenschaftliches RechnenTU Dresden
24. Januar 2013
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 1 / 35
Outline
1 Ubersicht uber FEM Software
2 deal.II
3 FEniCS
4 AMDiS
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 2 / 35
Ubersicht uber FEM Software
Eine große Menge an Software zu FE-Kalkulationen ist auf dem Markt,z.B.
Abaqus∗
Albert[a] (C)
Algor∗
AMDiS (C++)
Ansys∗
CalculiX (Fortran, C)
Comsol Multiphysics∗
deal.II (C++)
DUNE (C++)
Elmer
feel++ (C++)
Felicity (Matlab)
FEniCS (Python, C++)
FreeFem++ (C++, ...-cs)
GetFem++ (C++, Matlab)
Hermes Project (C, C++)
hpGEM (C++)
KASKADE (C, C++)
LS-Dyna∗
Nastran∗
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 3 / 35
deal.II: A Finite ElementDifferential Equations Analysis Library
deal.II ist eine C++ Programmierbibliothek mit dem Fokus auf derrechnergestutzten Losung von partiellen Differentialgleichungen, mittelsadaptiver Finite Elemente Methode. Aktuellste Programmiertechnikenwerden genutzt, um eine moderne Schnittstelle bereitzustellen zu denkomplexen Datenstrukturen und Algorithmen, die in diesem Bereichbenotigt werden.
Geschichte
erste veroffentlichte Version: deal.II 3.0 im Jahr 2000 (etwa 124.000Zeilen Quelltext)
heute: mehr als 500.000 Zeilen Code, ca. 500 Downloads pro Monatund 40 aktive Entwickler
siehe auch www.dealii.org
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 4 / 35
deal.II Basics
Die Bibliothek ist nicht dazu entwicklet, um eine Reihe vonAnwendungsfallen abzudecken. Vielmehr ist sie als Tollbox gedacht, diealles enthalt, was man benotigt, um eine Finite-Elemente Anwendung zuentwickeln. Die wichtigsten Schritte fur ein Finite-Elemente Programm(auch fur komplexe nichtlineare Probleme), sind typischerweise:
1 Beschreibung des Rechengebietes (Gitters) und Definition desFinite-Elemente Raumes
2 Assemblierung eines diskreten linearen, oder linearisiertenGleichungssystems
3 Losung des Gleichungssystems
4 Postprocessing, also numerische Auswertung der Losung, oderVisualisierung
Alle diese Aufgaben werden von deal.II unterstutzt, entweder direkt, oder(z.B. bei der Visualisierung), durch Schnittstellen zu externer Software.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 5 / 35
Features von deal.II
Einige Beispiele, was deal.II fur Moglichkeiten bietet:
Die Diskretisierung des Rechengebiets basiert auf der Zerlegung inHyper-Cubes, also Linien (1D), Vierecke (2D), oder Hexaeder (3D).
Man kann den Code dimensionsunabhangig entwickeln (1D, 2D, bzw.3D)
Lokale Verfeinerung der Gitter (h, p, und hp Adaptivitat)
Eine große Menge an Finiten Elementen stehen zur Auswahl (z.B.Lagrange bel. Ordnung (Kontinuierlich/Diskontinuierlich), Nedelec,Raviart-Thomas (bel. Ordnung), Zusammengesetzte Elemente,Hierarschische Elemente, ....)
Parallelisierung (mit mehr als 16k Prozessoren moglich)
Wichtige Frage: Wie sieht die Schnittstelle fur den Nutzer aus?
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 6 / 35
Beispiel Programmieraufgabe (1)
void run() {
make_grid();
setup_system();
assemble_system();
solve();
output_results();
}
void make_grid() {
Point<2> p0(-5.0, -1.0);
Point<2> p1( 5.0, 4.0);
std::vector<unsigned> rep(2);
rep[0] = 10; rep[1] = 5;
GridGenerator::subdivided_hyper_rectangle(
triangulation, rep, p0, p1, true);
}
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 7 / 35
Beispiel Programmieraufgabe (2)
void setup_system() {
dof_handler.distribute_dofs(fe); // DOFs verteilen
(...)
}
void solve() {
SolverControl solver_control(1000, 1e-12);
SolverCG<> solver(solver_control);
solver.solve(K, solution, f, PreconditionIdentity());
}
void output_results() const {
DataOut<2> data_out; (...) // Losung zuweisen
std::ofstream output("solution.vtu");
data_out.write_vtu(output);
}
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 8 / 35
Beispiel Programmieraufgabe (3)
void assemble_system()
{
QGauss<2> quadrature_formula(4);
FEValues<2> data(fe, quadrature_formula,
update_values | update_gradients | update_JxW_values);
const unsigned dofs_per_cell = fe.dofs_per_cell;
const unsigned n_q_points = quadrature_formula.size();
FullMatrix<double> E(dofs_per_cell, dofs_per_cell);
Vector<double> e(dofs_per_cell);
std::vector<unsigned> k(dofs_per_cell);
std::map<unsigned, double> boundary_values;
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 9 / 35
Beispiel Programmieraufgabe (4)
...
// Parameters
double F = 1.0, mu = 10.0, lambda = 10.0;
Tensor<2,2,double> A;
A[0][0] = lambda + 2.0*mu; A[1][1] = mu;
DoFHandler<2>::active_cell_iterator
cell = dof_handler.begin_active(),
endc = dof_handler.end();
for (; cell!=endc; ++cell) {
// assemble matrix and vector ...
}
VectorTools::interpolate_boundary_values(
dof_handler, 0, ZeroFunction<2>(), boundary_values);
MatrixTools::apply_boundary_values(
boundary_values, K, solution, f);
}
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 10 / 35
Beispiel Programmieraufgabe (5)
// assemble matrix and vector ...
data.reinit (cell);
E = 0; E = 0;
for (unsigned a = 0; a < dofs_per_cell; ++a)
for (unsigned b = 0; b < dofs_per_cell; ++b)
for (unsigned iq = 0; iq < n_q_points; ++iq)
E(a,b) += data.shape_grad(a, iq) *
(A * data.shape_grad(b, iq)) *
data.JxW(iq);
for (unsigned a = 0; a < dofs_per_cell; ++a)
for (unsigned iq = 0; iq < n_q_points; ++iq)
e(a) += data.shape_value(a, iq) * F * data.JxW(iq);
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 11 / 35
Beispiel Programmieraufgabe (6)
...
// local to global mapping k(.,.)
cell->get_dof_indices(k);
for (unsigned a = 0; a < dofs_per_cell; ++a)
for (unsigned b = 0; b < dofs_per_cell; ++b)
K.add(k[a], k[b], E(a,b));
for (unsigned a = 0; a < dofs_per_cell; ++a)
f(k[a]) += e(a);
−→That’s it!
Etwa 90 Zeilen Quelltext fur dieses Beispiel notig.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 12 / 35
deal.II Fazit
deal.II ist eine sehr machtige Bibliothek.
Trotzdem gibt es eine sehr umfangreiche Dokumentation in Form von48 Tutorial Einheiten.
Man bekommt direkten Zugriff auf die Assemblierung, dieBasisfunktionen, Quadratur etc.. Damit sind auch sehr spezielle Ideenumsetzbar.
Aber: Kompletter Assemblierungsprozess muss noch selbstgeschrieben werden, und jegliche Optimierungen mussen auch manuelleingebaut werden. → sehr viel Wissen wird vorausgesetzt.
Implementierung eines einfachen Beispiels trotzdem rechtzeitaufwendig.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 13 / 35
Gallery
Figure: Quasistatic deformation: It shows the gradual deformation of a cylinderunder pressure from above, until it essentially fails. The color coding indicatesstress levels in the material.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 14 / 35
FEniCS
Das FEniCS Projekt ist eine Zusammenfassung von mehreren Projektenzur Entwicklung von innovativen Konzepten und Werkzeugen zumautomatischen wissenschaftlichen Rechnen, mit Fokus auf demautomatischen Losen von Differentialgleichungen mit der Finite-ElementMethode.Das FEniCS Projekt wurde entwickelt von Forschern aus einer großen Zahlvon Forschungseinrichtungen auf der ganzen Welt, u.A.
Simula Research Laboratory
University of Cambridge
University of Chicago
Texas Tech University
KTH Royal Institute of Technology
Die Entwicklung begann etwa 2003. Siehe dazu www.fenicsproject.org
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 15 / 35
FEniCS Komponenten
FEniCS ist organisiert, als eine Kollektion von miteinandernverknupften/interagierenden Komponenten, die zusammen das FEniCSProjekt bilden.
Komponenten
die Problemlosungs-Umgebung DOLFIN,
den Formcompiler FFC,
ein Tool zur Tabellierung von Finiten Elementen: FIAT,
den just-in-time Compiler Instant,
eine Code-Generator-Schnittstelle UFC,
die Formbeschreibungssprache UFL
und eine Liste weiterer Pakete.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 16 / 35
FEniCS Komponenten
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 17 / 35
Features
Automatische Losung von Variationsproblemen (in nahezumathematischer Notation), linear und nicht-linear
Automatische Fehlerkontrolle durch adaptive Verfeinerung undZielorientierte Fehlerschatzer
Eine große Bibliothek an Finiten Elementen, z.B. Lagrange,(kontinuierlich/diskontinuierlich), Vektorelemente (BDM, RT,Nedelec), Crouzeix-Raviart, ...
Verschiedene Lineare Algebra Backends (PETSc, Trilinos/Epetra,uBlas, MTL4), auch fur parallele Rechnungen geeignet
Simplex-Gitter in 1D (Interval), 2D (Dreieck) und 3D (Tetraeder),mit lokaler Verfeinerung und Gebietszerlegung
Live-Plotting und Ausgabe in verschiedendste Dateiformate
Schnittstellen fur Python und C++
Dokumentation, Tutorial, Buch und online Demos
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 18 / 35
Beispiel Programmieraufgabe (1)
from dolfin import *
# Generate a mesh
mesh = RectangleMesh(-5.0, -1.0, 5.0, 4.0, 10, 5)
V = FunctionSpace(mesh, "Lagrange", 2)
# Define Dirichlet boundary (x = -5)
def boundary(x):
return x[0] < -5.0 + DOLFIN_EPS
# Define boundary condition
u0 = Constant(0.0)
bc = DirichletBC(V, u0, boundary)
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 19 / 35
Beispiel Programmieraufgabe (2)
...
# Parameters
mu = Constant(10.0)
lmbda = Constant(10.0)
A = as_matrix(((lmbda+2*mu, 0), (0, mu)))
F = Constant(1.0)
# Define variational problem
u = TrialFunction(V)
v = TestFunction(V)
a = inner(A*grad(u), grad(v))*dx
L = F*v*dx
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 20 / 35
Beispiel Programmieraufgabe (3)
...
# Compute solution
u = Function(V)
solve(a == L, u, bc)
# Save solution in VTK format
file = File("elasticity.pvd")
file << u
# Plot solution
plot(u, interactive=True)
−→That’s it!
Etwa 19 Zeilen Quelltext fur dieses Beispiel notig.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 21 / 35
Gallery
Figure: oben: Verteilte und komplizierte Gitter, unten: Stromung durch eingekrummtes Rohr
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 22 / 35
AMDiS Adaptive Multi-Dimensional Simulations
AMDiS ist eine Entwicklung aus eigenem Hause, entstanden etwa 2005,als eine Neu-/Weiterentwicklung der C-Bibliothek ALBERTA. Es wurdeals modulares objektorientiertes Framework konzipiert und wird heute invielen Bereichen genutzt und weiterentwickelt.Grundkonzept, die in AMDiS umgesetzt wurden:
Hohes Abstraktionslevel: (Physikalische) Probleme werden soformuliert, dass der Nutzer sich moglichst wenig, um die numerischenDetails kummern muss.
Allgemeingultigkeit: Mit AMDiS kann eine sehr große Klasse anProblemen umgesetzt werden. Lineare und nichtlineare Probleme,stationare, wie auch zeitabhangige Probleme konnen behandeltwerden. Verschiedene Probleme der selben Dimension, oderunterschiedlicher Dimension konnen gekoppelt werden in einemProgramm und auch Systeme von Gleichungen konnen umgesetztwerden.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 23 / 35
AMDiS Adaptive Multi-Dimensional Simulations
Erweiterbarkeit und Wiederverwendbarkeit: Eine Schnittstelle zurErweiterung der Funktionalitat von AMDiS an verschiedendstenStellen wird bereitgestellt, so konnen z.B. eigene Fehlerschatzer,Gleichungssystemloser, Vorkonditionierer, Zeitschritt Verfahren...bereitgestellt werden.
Effizienz: Zur schnellen Losung von Problemen sind eine Reihe anWerkzeugen implementiert, wie adaptive Gitter, Parallelisierung,...
siehe auch www.amdis-fem.org
Entwickler
Simon Vey
Christina Stocker
Thomas Wittkowski
Andreas Naumann
(Simon Praetorius)
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 24 / 35
AMDiS - Simulationsaufbau
AMDiS Programme bestehen in der Regel aus drei Teilen:
1 Einem (Macro-)Gitter (Grundgitter)
2 Einer Parameterdatei zur Steuerung der Loser, der Dimensionen, derFinitelementeraume, der Ergebnisausgabe,....
3 Das eigentliche (C++)-Programm, in dem Operatoren undRandbedingungen und die Ablaufsteuerung etc. definiert werden
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 25 / 35
Beispiel Programmieraufgabe (1)
AMDiS::init(argc, argv);
// ===== create and init the scalar problem =====
ProblemStat elasticity("elasticity");
elasticity.initialize(INIT_ALL);
// === create adapt and adapt info ===
AdaptInfo adaptInfo("elasticity->adapt",
elasticity.getNumComponents());
AdaptStationary adapt("elasticity->adapt",
elasticity, adaptInfo);
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 26 / 35
Beispiel Programmieraufgabe (2)
...
// ===== parameters =====
double F = 1.0, mu = 10.0, lambda = 10.0;
WorldMatrix<double> A;
A[0][0] = lambda + 2.0*mu; A[1][1] = mu;
// ===== create matrix operator =====
Operator matrixOperator(elasticity.getFeSpace());
matrixOperator.addTerm(new Matrix_SOT(A));
elasticity.addMatrixOperator(matrixOperator, 0, 0);
// ===== create rhs operator =====
Operator rhsOperator(elasticity.getFeSpace());
rhsOperator.addTerm(new Simple_ZOT(F));
elasticity.addVectorOperator(rhsOperator, 0);
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 27 / 35
Beispiel Programmieraufgabe (3)
...
// ===== add boundary conditions =====
elasticity.addDirichletBC(1, 0, 0,
new AMDiS::Const<double, WorldVector<double> >(0.0));
// ===== start adaption loop =====
adapt.adapt();
elasticity.writeFiles(adaptInfo, true);
AMDiS::finalize();
−→That’s it!
Etwa 19 Zeilen Quelltext fur dieses Beispiel notig.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 28 / 35
Parameterdatei
dimension of world: 2
mesh->macro file name: macro/macro.elasticity.2d
mesh->global refinements: 0
elasticity->mesh: mesh
elasticity->dim: 2
elasticity->components: 1
elasticity->polynomial degree[0]: 2
elasticity->solver: cg
elasticity->solver->max iteration: 1000
elasticity->solver->tolerance: 1.e-8
elasticity->solver->info: 10
elasticity->solver->left precon: diag
elasticity->solver->right precon: no
elasticity->output->filename: output/elasticity.2d
elasticity->output->ParaView format:1
elasticity->adapt->max iteration: 0
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 29 / 35
Gallery
Figure: top-left: PFC equation on a moving surface to simulate virus growth.top-middle: Smectic Order on the Sphere, top-right and bottom: Sliding dropletson nano structures.
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 30 / 35
Eigene Implementierung
Mit Ausgabe der Programmieraufgabe habe auch ich einen FEM Codegeschrieben. Zum Teil werden Ideen verschiedener Toolboxen kombiniert.Im Moment aber noch sehr wenig Funktionalitat.
Details
ca. 4000 Zeilen Quelltext, Entwicklungszeit: 30 Tage
Generische C++ Implementierung
Regulare 1D (Intervall) und 2D (Rechtecks) Gitter
Lagrange-Elemente Q1 und Q2
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 31 / 35
Beispiel Programmieraufgabe (1)
static const int DOW = 2;
/// generate a mesh
typename FixedVector<DOW>::type p0(DOW), p1(DOW);
p0 = -5.0, -1.0;
p1 = 5.0, 4.0;
typedef RectangularMesh MeshType;
MeshType mesh(p0, p1, 10, 5);
/// definition of finite element spaces
typedef FeSpaces::Lagrange::Q2<MeshType> FeSpace;
FeSpace feSpace(mesh);
/// definition of the problem
Problem<FeSpace> prob(feSpace);
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 32 / 35
Beispiel Programmieraufgabe (2)
...
/// parameters
double F = 1.0, mu = 10.0, lambda = 10.0;
typename FixedMatrix<DOW, DOW>::type A(DOW, DOW);
A = lambda + 2*mu, 0.0, 0.0, mu;
// operators
Matrix_SOT<DOW, true> mat_SOT(A);
Constant_RHS<DOW> b_ZOT(F);
/// assemble matrix
MatrixType K;
VectorType f;
prob.assemble<0,0>(K, f, mat_SOT, b_ZOT);
...
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 33 / 35
Beispiel Programmieraufgabe (3)
...
/// assemble boundary conditions
std::set<size_t> dbc_indices;
prob.getDbcIndices<0>(0, p0[0], dbc_indices);
std::set<size_t>::iterator dbc_iter;
for (dbc_iter = dbc_indices.begin();
dbc_iter!= dbc_indices.end(); dbc_iter++)
prob.setDirichletBC(*dbc_iter, 0.0, K, f, true);
/// solve system
VectorType u(num_cols(K)); u = 0.0;
mtl::matrix::umfpack_solve(K, u, f);
/// output solution
Output<MeshType> out(mesh, "./output");
out.writeVtu(prob.getDofVector<0>(), "solution");
−→That’s it!
Etwa 28 Zeilen Quelltext fur dieses Beispiel notig.Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 34 / 35
Operator Matrix SOTAls Beispiel fur einen Operator, wird hier die Implementierung vonMatrix SOT gezeigt:
template<int dow, bool symmetric = false>
struct Matrix_SOT : Bilinearform<dow>
{
typedef parameters<1, (...) | Flag::constant,
Flag::provide_gradients> Parameters;
Matrix_SOT(typename FixedMatrix<dow,dow>::type& A) : A(A) { }
(...)
typedef typename FixedVector<dow>::type WorldVector;
double eval(const double& psi, const double& u,
const WorldVector& gradPsi, const WorldVector& gradU,
const size_t iq) const
{
WorldVector temp(dow);
temp = A*gradU;
return dot(gradPsi, temp);
}
private:
typename FixedMatrix<dow,dow>::type A;
};
Simon Praetorius (TU Dresden IWR) FEM-Toolboxen 24. Januar 2013 35 / 35