[Dune] Beispiel Gitterschnittstelle.

Robert Kloefkorn robertk at mathematik.uni-freiburg.de
Fri Feb 21 14:34:06 CET 2003


Hallöchen,

an bei sende ich meine Entwicklungen zur Gitterschnittstelle ausgehend 
vom Stand des letzten Treffens in Heidelberg.

wichtig sind folgende Datein ausgehend Hauptverzeichnis dune:

include/grid.hh
grid/AlbertGrid/include/AlbertGrid.hh
grid/AlbertGrid/main.cc

Zu denn einzelnen Implementierungen gibt es im Verzeichnis
doc/html die doxygen html docu oder man schaut in den Code.

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 --------------
A non-text attachment was scrubbed...
Name: dune.tar.gz
Type: application/octet-stream
Size: 605006 bytes
Desc: not available
URL: <https://lists.dune-project.org/pipermail/dune/attachments/20030221/08145f57/attachment.obj>


More information about the Dune mailing list