Dune (Software)
# Dune (Software)

Dune (Distributed and Unified Numerics Environment) ist eine modulare C++-Bibliothek zum Lösen von partiellen Differentialgleichungen mit gitterbasierten Verfahren.

Dune besteht aus Modulen und umfasst in der Version 2.8 die Teile

* Allgemeine Klassen in dune-common,
* Geometrie-Klassen in dune-geometry,
* Gitterschnittstelle in dune-grid,
* Matrix-, Vektor-Bibliothek und Löser in dune-istl,
* Ansatzfunktionen in dune-localfunctions.

Darüber hinaus gibt es weitere Module, welche zum Teil von Dritten entwickelt werden.

## Geschichte

Die Entwicklung von Dune begann 2002 auf Initiative von Prof. Bastian (Universität Heidelberg) und Dr. Ohlberger (während seiner Habilitation an der Albert-Ludwigs-Universität Freiburg) sowie Prof. Rumpf (damals Universität Duisburg). Man strebte ein offenes, nicht an einzelne Universitäten gekoppeltes Entwicklungsmodell an, um das Projekt für eine möglichst breite Nutzergruppe attraktiv zu machen. Aus dem gleichen Grund wurde auch eine Lizenz gewählt, welche es erlaubt Dune in Verbindung mit proprietären Bibliotheken einzusetzen. Auch heute noch stammen die Hauptentwickler aus dem universitären Umfeld.

## Zielsetzung

Bei der Entwicklung von Dune wurde von Beginn an angestrebt, neuen Code und existierende Bibliotheken auf effiziente Art koppeln zu können. Dies ist auch gleichzeitig der Hauptunterschied zu anderen Finite-Element-Programmen.

Dune ist zunächst eine Sammlung von Softwareschnittstellen, die abstrakte Konzepte im Wissenschaftlichen Rechnen, wie das eines Gitters, umsetzen. Beim Design der Gitterschnittstelle standen die Finite-Elemente-Verfahren und Finite-Volumen-Verfahren im Vordergrund, die Verwendung von Finite-Differenzen-Verfahren ist aber ebenso möglich. Die Gitterschnittstelle ist auch gleichzeitig der am weitesten fortgeschrittene Teil. Sie erlaubt die Beschreibung von strukturierten und unstrukturierten Gittern beliebiger Dimension sowie von Gittern auf Mannigfaltigkeiten. Außerdem erlaubt sie die einfache Verwendung von parallelen Programmierkonzepten im Bereich des Hochleistungsrechnens. Es gibt Implementierungen der Gitterschnittstelle für sieben verschiedene Gitter; vier davon erlauben die Verwendung von existierenden Bibliotheken (Stand: 2007). Man kann somit die gleiche Diskretisierung auf unterschiedlichen Gitterimplementierungen verwenden und vergleichen.

## Technik

Um die gesetzten Ziele effizient umsetzen zu können, werden verschiedene C++-Techniken wie Template Programmierung, Generische Programmierung, C++-Metaprogrammierung und statischer Polymorphismus verwendet. In anderen Bereichen der Softwareentwicklung finden diese Techniken schon lange Anwendung, im Bereich des Wissenschaftlichen Rechnens ist ihre Verwendung aber noch selten. Sie ermöglichen es dem Compiler, den durch die Abstraktion erzeugten Overhead fast vollständig zu eliminieren und fortgeschrittene Optimierungstechniken zu verwenden. Diese Techniken stellen hohe Anforderungen an die Konformität des verwendeten Compilers, was die unterstützten Plattformen einschränkt.

