[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