[Dune] Implementierung von getRealEntity

Oliver Sander sander at math.fu-berlin.de
Mon Feb 14 15:30:03 CET 2005


Hallo Leute!
Diese Mail betrifft hauptsächlich die Leute, die mit der Anpassung
der Gitterimplementierungen an die neue Schnittstelle beschäftigt
sind.  Es geht um folgenden technischen Punkt:

[ich erkläre das jetzt am Beispiel von UGGrid, aber es betrifft
auch andere Implementierungen, wahrscheinlich noch viel mehr]

In der Methode mark (und noch an ein paar anderen Stellen in UGGrid)
muß man auf die Implementierung der Entity zugreifen können, also
auf die Klasse UGGridEntity<...>.  Dort wird nämlich eingetragen,
daß ein Element zum Verfeinern markiert ist.  Dummerweise bekommt
mark aber als Argument nur ein

typename Traits::template codim<0>::EntityPointer & e

Das ist die generische Klasse für Entities, und deren Schnittstelle
enthält natürlich keine UG-Spezifika.  Was man braucht ist die
eigentliche Implementierung, die erhielte man durch e->realEntity,
wenn realEntity nicht protected wäre.

Das Problem wäre gelöst, wenn UGGrid ein Friend von Entity sein
könnte.  Leider sind Konstruktionen der Art

template <class GridImp>
class Entity
{
    friend class GridImp;
...
}

explizit verboten.  Was man aber machen kann ist, einzelne Methode
von GridImp als Friend zu deklarieren.  [Falls jemand rausfindet wieso
_das_ nun wieder geht möge er es mir bitte mitteilen...]
Deswegen steht in Entity nun

     typedef typename RemoveConst<GridImp>::Type mutableGridImp;

     template <int cd>
     friend EntityImp<cd,dim,GridImp>& 
mutableGridImp::getRealEntity(typename GridImp::Traits::template 
codim<cd>::Entity& e );


Eine in der Gitterimplementierung vorhandene Methode getRealEntity
darf also auf entity.realEntity zugreifen.  In UGGrid sieht diese
Methode so aus:

     template <int cd>
     UGGridEntity<cd,dim,const UGGrid>& getRealEntity(typename 
Traits::template codim<cd>::Entity& entity) {
         return entity.realEntity;
     }


Ein Problem bleibt noch: getRealEntity sollte natürlich private sein.
Deswegen muß Entity auch als Friend von UGGrid deklariert werden.
Dazu schreibt man

     template<int codim_, int dim_, class GridImp_, template<int,int,class> 
class EntityImp_>
     friend class Entity;

in UGGrid, und dann funktioniert alles wie gewünscht.

Möglicherweile braucht man das dann auch noch für Geometries.  Sollte
dann kein Problem mehr sein.

Frohes Hacken,
Oliver


************************************************************************
* Oliver Sander                **                                      *
* Freie Universität Berlin     ** email: sander at math.fu-berlin.de      *
* Institut für Mathematik II   ** phone: + 49 (30) 838 75217           *
* Arnimallee 2-6               ** fax  : + 49 (30) 838 54977           *
* 14195 Berlin, Germany        ** URL  : www.math.fu-berlin.de/~sander *
************************************************************************


More information about the Dune mailing list