[Dune] Beispiel Gitterschnittstelle.
Robert Kloefkorn
robertk at mathematik.uni-freiburg.de
Fri Feb 21 15:04:47 CET 2003
Hallöchen,
an bei sende ich meine Entwicklungen zur Gitterschnittstelle ausgehend
vom Stand des letzten Treffens in Heidelberg.
Ich wollte gerade den ganzen tar ball schicken, aber der ist zu gross
für die Liste. Also hier nur die source files.
In main.cc wird ein Albertgitter angelegt,
welches dann an die template Funktion testalgo übergeben wird.
Ab hier wird es dann allgemein.
die Funktion bekommt ein Grid<BASE> übergeben.
Ich habe es jetzt so angelegt, das ein Gitter Zugriff auf verschiedene
Arten von Zugriffen liefern kann, d.h.
jedes Gitter liefert z.B. einen ElementAccess usw.
Zusätzlich sind im Gitter die DAten, welches das Gitter beschreiben,
gespeichert. Ein Gitter hat zwei template Parameter, nämlich
DIMOFWORLD und DIM.
Desweiteren gibt es die Access Klassen.
Die regeln den Gitterdruchlauf und auch den Zugriff auf die Elemente
bzw. RefElemente.
Als template Parameter bekommen die Klassen BASE, das Gitter,
und die CoDIM, welche betrachtet werden soll. Deshalb sind auch die
Elemente in der Access Klasse definiert, weil sie eben von der CoDIM
abhängen.
Ausserdem weiss meine Access Klasse, auf welchen Elementen sie operiert,
d.h. wenn ich einen FaceAccess vom einem Gitter bekommen habe, dann ist
man auch auf den richtigen Elementen, da ja ein Gitter logischerweise
nur seine eigenen Accessklassen zurückliefert.
Die Hierarchie ist also wie folgt:
ich habe ein Problem und brauche ein Gitter
......
- Ich habe ein Gitter
- Das Gitter liefert den GitterAccess
- der Access weiss wie die Iteratoren aussehen und über welche Art von
- Elementen iteriert wird.
- Über den Iterator kommt an die einzelnen Elemente heran.
Ein Alogrithmus oder ähnliches braucht also als Parameter nur
das Gitter und damit ist schon alles bestimmt.
template <class BASE>
void testAlgo( Grid<BASE> &grid )
{
typedef typename Grid<BASE>::GetAccess::FACEACCESS ACCESS;
typedef typename ACCESS::Iterator LEVit;
ACCESS access = grid.getAccess().getFaceAccess();
LEVit endit = access.end(-1);
for(LEVit it = access.begin(-1); it != endit; ++it)
{
cout << (*it).getElNum() <<endl << endl;
}
}
Dies Funktion aus main.cc macht einen Gitterdurchlauf und liefert die
Elementnummer zurück.
Dabei werden nur die Schnittstellen von Grid, Access, Iterator und
Element verwendet.
Das man in obigem Beispiel mit FACEACCESS direkt festlegt, über welche
Art von Elementen man läuft, ist ok, da man sonst eben CoDIM 1 schreiben
würde, d.h ich gehe davon aus, dass mein Algorithmus weiss, über welche
Art von Elementen er iterieren möchte. Die Implementierung der Elemente
behält allerdings die CoDIM um so dimensionslos programmieren zu können.
Die einzige Einschränkung ist die Tatsache, das man bei der Methode z.B.
in 2d bei Dreieckskanten eben von FACES spricht.
Falls noch Fragen bestehen, bitte fragen.
R
--
Robert Klöfkorn <robertk at mathematik.uni-freiburg.de>
Mathematisches Institut Tel: +49 (0) 761 203 5642
Abt. für Angewandte Mathematik Fax: +49 (0) 761 203 5632
Universität Freiburg
Hermann-Herder-Str. 10
79104 Freiburg
http://www.mathematik.uni-freiburg.de/IAM/homepages/robertk
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: grid.hh
URL: <https://lists.dune-project.org/pipermail/dune/attachments/20030221/f979a74b/attachment.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: main.cc
URL: <https://lists.dune-project.org/pipermail/dune/attachments/20030221/f979a74b/attachment-0001.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: AlbertGrid.hh
URL: <https://lists.dune-project.org/pipermail/dune/attachments/20030221/f979a74b/attachment-0002.ksh>
More information about the Dune
mailing list