19.06.2015 Views

A new mesh library for DOLFIN - FEniCS Project

A new mesh library for DOLFIN - FEniCS Project

A new mesh library for DOLFIN - FEniCS Project

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong><br />

Anders Logg<br />

logg@simula.no<br />

Simula Research Laboratory<br />

<strong>FEniCS</strong>’06 in Delft, November 8-9 2006


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Outline<br />

Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

<strong>DOLFIN</strong> needs a <strong>new</strong> <strong>mesh</strong> <strong>library</strong><br />

◮ Old <strong>DOLFIN</strong> <strong>mesh</strong> implemented in 2002–2003<br />

◮ Local data stored in classes Vertex, Cell, etc.<br />

◮ Dimension dependent interface:<br />

<strong>for</strong> (EdgeIterator e(<strong>mesh</strong>); !e.end(); ++e)<br />

...<br />

<strong>for</strong> (FaceIterator f(<strong>mesh</strong>); !f.end(); ++f)<br />

...<br />

◮ Specialized to simplicial <strong>mesh</strong>es: triangles or tetrahedra<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Design goals <strong>for</strong> the <strong>new</strong> <strong>mesh</strong> <strong>library</strong><br />

◮ Simple<br />

◮ No fancy data structures<br />

◮ Only unsigned int* and double*<br />

◮ Intuitive<br />

◮ Choose suitable abstractions<br />

◮ Simple transition from old <strong>DOLFIN</strong> <strong>mesh</strong><br />

◮ Generic<br />

◮ Fast<br />

◮ Not specialized to simplicial <strong>mesh</strong>es<br />

◮ Dimension-independent interface<br />

◮ Minimize object-oriented overhead<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Mesh abstractions<br />

◮ Mesh = (Topology, Geometry)<br />

◮ Topology = ({Mesh entities}, Connectivity)<br />

◮ Mesh entity = (d, i)<br />

◮ Connectivity = {Incidence relations d − d ′ }<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Mesh entities<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Named <strong>mesh</strong> entities<br />

Entity Dimension Codimension<br />

Vertex 0 D<br />

Edge 1 D − 1<br />

Face 2 D − 2<br />

Facet D − 1 1<br />

Cell D 0<br />

◮ Mesh entity defined by (d, i)<br />

◮ Named <strong>mesh</strong> entities: Vertex, Edge, Face, Facet, Cell<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Implementation<br />

◮ Implemented in C++, about 4000 lines (including comments)<br />

◮ Ships with <strong>DOLFIN</strong> 0.6.3<br />

◮ Mesh<br />

◮ MeshTopology, MeshGeometry<br />

◮ MeshEntity, MeshEntityIterator<br />

◮ Vertex, Edge, Face, Facet, Cell<br />

◮ MeshFunction<br />

◮ MeshEditor<br />

◮ UnitSquare, UnitCube<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Input/output<br />

Mesh <strong>mesh</strong>(’’<strong>mesh</strong>.xml’’);<br />

File file(’’<strong>mesh</strong>.xml’’);<br />

Mesh <strong>mesh</strong>;<br />

file >> <strong>mesh</strong>;<br />

File file(’’<strong>mesh</strong>.xml’’);<br />

Mesh <strong>mesh</strong>;<br />

file


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Conversion to the <strong>new</strong> <strong>DOLFIN</strong> XML <strong>for</strong>mat<br />

◮ Use dolfin-convert to convert to the <strong>DOLFIN</strong> XML <strong>for</strong>mat<br />

◮ Conversion from Medit (tetgen) and Gmsh<br />

◮ Conversion from old <strong>DOLFIN</strong> XML:<br />

dolfin-convert --input old-xml old.xml <strong>new</strong>.xml<br />

◮ Convert all <strong>mesh</strong>es in current directory:<br />

convertall<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Built-in <strong>mesh</strong>es<br />

◮ Simple built-in <strong>mesh</strong>es: UnitSquare, UnitCube<br />

◮ Contributions are welcome: UnitDisc?, UnitSphere?<br />

UnitSquare <strong>mesh</strong>(16, 16);<br />

UnitCube <strong>mesh</strong>(256, 256, 256);<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Building <strong>mesh</strong>es<br />

◮ Use class MeshEditor<br />

◮ Specialized to simplicial <strong>mesh</strong>es in 1D, 2D, 3D<br />

Mesh <strong>mesh</strong>;<br />

MeshEditor editor(<strong>mesh</strong>, CellType::triangle, 2, 2);<br />

editor.initVertices(4);<br />

editor.initCells(2);<br />

editor.addVertex(0, 0.0, 0.0);<br />

editor.addVertex(1, 1.0, 0.0);<br />

editor.addVertex(2, 1.0, 1.0);<br />

editor.addVertex(3, 0.0, 1.0);<br />

editor.addCell(0, 0, 1, 2);<br />

editor.addCell(1, 0, 2, 3);<br />

editor.close();<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Mesh iterators<br />

Basic iteration:<br />

unsigned int D = <strong>mesh</strong>.topology().dim();<br />

<strong>for</strong> (MeshEntityIterator c(<strong>mesh</strong>, D); !c.end(); ++c)<br />

<strong>for</strong> (MeshEntityIterator v(c, 0); !v.end(); ++v)<br />

v->foo();<br />

Iteration with named iterators:<br />

<strong>for</strong> (CellIterator c(<strong>mesh</strong>); !c.end(); ++c)<br />

<strong>for</strong> (VertexIterator v(c); !v.end(); ++v)<br />

v->foo();<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Mesh functions<br />

◮ A discrete function on a <strong>mesh</strong><br />

◮ Implemented by the class MeshFunction<br />

◮ Different from the class Function<br />

◮ Takes a value on each <strong>mesh</strong> entity of given fixed dimension<br />

◮ Templated over value type:<br />

◮ Material parameters (double)<br />

◮ Markers <strong>for</strong> <strong>mesh</strong> refinement (bool)<br />

◮ Inter-<strong>mesh</strong> connectivity (unsigned int)<br />

MeshFunction marked_<strong>for</strong>_refinement;<br />

<strong>for</strong> (CellIterator c(<strong>mesh</strong>); !c.end(); ++c)<br />

{<br />

if ( marked_<strong>for</strong>_refinement(*c) )<br />

...<br />

}<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Extracting boundaries<br />

◮ A BoundaryMesh is a Mesh<br />

◮ Simple boundary extraction:<br />

Mesh <strong>mesh</strong>;<br />

BoundaryMesh boundary(<strong>mesh</strong>);<br />

◮ Mappings from the boundary to the <strong>mesh</strong>:<br />

MeshFunction vertices,<br />

MeshFunction cells;<br />

BoundaryMesh boundary(<strong>mesh</strong>, vertices, cells);<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Mesh refinement<br />

◮ Uni<strong>for</strong>m <strong>mesh</strong> refinement implemented<br />

◮ Adaptive <strong>mesh</strong> refinement / coarsening will be added again<br />

Mesh <strong>mesh</strong>;<br />

<strong>for</strong> (int i = 0; i < 3; ++i)<br />

<strong>mesh</strong>.refine();<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Python interface<br />

◮ Generated automatically by SWIG<br />

◮ Python iterators implemented <strong>for</strong> <strong>mesh</strong> entities<br />

◮ C++ arrays mapped to Numeric arrays (will be NumPy)<br />

from dolfin import *<br />

<strong>mesh</strong> = UnitSquare(16, 16)<br />

<strong>mesh</strong>.refine()<br />

<strong>for</strong> c in cells(<strong>mesh</strong>):<br />

<strong>for</strong> v in vertices(c):<br />

...<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Mesh connectivity<br />

◮ Mesh of topological dimension D<br />

◮ Connectivity D − 0 given (cells − vertices)<br />

◮ Need to compute connectivity d − d ′ <strong>for</strong> 0 ≤ d, d ′ ≤ D<br />

◮ Compute only as needed<br />

0<br />

1<br />

2<br />

0 1 2 D<br />

D<br />

X<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Computing <strong>mesh</strong> connectivity<br />

◮ Build D − d and d − 0 from D − 0 and D − D <strong>for</strong> 0 < d < D<br />

◮ Compute d − d ′ from d ′ − d <strong>for</strong> d < d ′ (transpose)<br />

◮ Compute d − d ′ from d − d ′′ and d ′′ − d ′ (intersection)<br />

◮ All algorithms are O(n p )O(N) <strong>for</strong> small n and p<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Example: computing 2 − 2 (faces − faces)<br />

<strong>for</strong> (FaceIterator f0(<strong>mesh</strong>); !f0.end(); ++f0)<br />

<strong>for</strong> (FaceIterator f1(f0); !f1.end(); ++f1)<br />

// Iterators automatically initialize 2 - 2<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Simple benchmarks<br />

◮ Creating unit cube <strong>mesh</strong><br />

◮ Iteration over <strong>mesh</strong> entities<br />

◮ Uni<strong>for</strong>m <strong>mesh</strong> refinement<br />

◮ Memory usage<br />

◮ Speedup: a factor 10–100<br />

◮ Reduced memory usage: a factor 10<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


101 100<br />

103 102 101 CPUtime /s<br />

104<br />

New<strong>mesh</strong> Old<strong>mesh</strong><br />

Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Creatingunitcube<strong>mesh</strong><br />

Creating unit cube <strong>mesh</strong><br />

Anders Logg logg@simula.no<br />

101 102 103 104 105 106 Numberofcells 100<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


101<br />

102 CPUtime /s103<br />

104<br />

New<strong>mesh</strong> Old<strong>mesh</strong><br />

Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Iterationover<strong>mesh</strong>entities<br />

Iteration over <strong>mesh</strong> entities<br />

Anders Logg logg@simula.no<br />

101 102 103 104 105 106 Numberofcells 100<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


103 102<br />

101 100 101 CPUtime /s<br />

102<br />

New<strong>mesh</strong> Old<strong>mesh</strong><br />

Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Uni<strong>for</strong>m<strong>mesh</strong>refinement<br />

Uni<strong>for</strong>m <strong>mesh</strong> refinement<br />

Anders Logg logg@simula.no<br />

101 102 103 104 105 106 Numberofcells 100<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>


ize /MB<br />

Memorys<br />

140 120<br />

20 40 60 80 100<br />

0<br />

New<strong>mesh</strong> Old<strong>mesh</strong><br />

Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Memoryusage<br />

Memory usage<br />

Anders Logg logg@simula.no<br />

2.0 1.5 1.0 0.5 0.0<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong><br />

x1e+5 Numberofcells


Introduction<br />

Tutorial<br />

Algorithms<br />

Benchmarks<br />

Future plans<br />

◮ Adaptive <strong>mesh</strong> refinement / coarsening<br />

◮ Extend functionality <strong>for</strong> ALE methods<br />

◮ Extend functionality <strong>for</strong> parallel assembly<br />

◮ Graphical <strong>mesh</strong> editor (Simula/Kalkulo)<br />

Anders Logg logg@simula.no<br />

A <strong>new</strong> <strong>mesh</strong> <strong>library</strong> <strong>for</strong> <strong>DOLFIN</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!