[Dune] Einführung Funktionenräume und diskrete Funktionen.

Robert Kloefkorn robertk at mathematik.uni-freiburg.de
Tue Jun 22 11:14:41 CEST 2004


Servus zamme,

da es jetzt einige Anfragen zu den Funktionsräumen, Basen usw. gibt 
schreibe ich mal ein kurze Zusammenfassung.

Vielleicht als erstes, die Discrete Functions sind eigentlich nichts 
weiter als dof Vektoren, in denen die Lösung abgespeichert wird. Bisher 
hat man dafür einfach Arrays verwendet, das kann man auch weiterhin 
machen, oder man nimmt halt eine Discrete Function, wo dann noch solche 
Sachen wie += usw. implementiert sind.
Weiterhin bieten sie einen DofIterator an, mit dem man über alle dofs 
laufen kann, also eine for Schleife über alle dof oder so.
Ausserdem kann man auf einer Entity( während dem Gitterdurchlauf) eine 
LocalFunction erhalten, die dann die localen dofs auf dieser Entity 
enthält.
Mehr gibt es zu den Discrete Functions eigentlich nicht zu sagen.

Weiter mit den LocalFunctions. Sie enthalten immer die lokalen dofs 
einer Entity. Weiterhin eine Reference auf das BaseFunctionSet 
(Erklärung folgt). Mit den lokalen dofs und dem BasisSet kann lokal 
sowas wie Summe u_i*phi_i ausgerechnet werden. Die lokale Function dient 
also dazu, bei einem Gitterduchlauf auf jedem Element an die 
dazugehörigen dofs ran zukommen.

Das BaseFunctionSet ist die Menge der Basisfunktionen die zu jeweilig 
gewählten Funktionenraum gehören, definiert sind sie auf dem 
Referenzelement. Das BaseFunctionSet liefert zwei Sachen, 
numberofBaseFunctions und evaluate.

template <int diffOrd>
void evaluate ( int baseFunct, const Vec<diffOrd, deriType> 
&diffVariable, const Domain & x,  Range & phi ) const;

evaluate funktioniert so:
baseFunct = welche Basisfunktion soll ausgewertet werden,

const Vec<diffOrd, deriType> = diffOrd {0,1,2} gibt die Ableitung an, 
0=auswerten, 1=erste Ablt. .. und der Vec hat die jeweilige Länge,
übergibt man also einen Vec<1> (deriType=int) so sollte man mit Vec(0) 
die Information erhalten nach welcher Ortsvariablen differenziert werden 
soll, also 0=x und y=1 usw.

Domain ist der Punkt an dem ausgewertet werden soll und ret der Return 
Wert. Alternativ kann man auch eine Quadrature und Nummer des 
Quadraturpunktes übergeben, dann werden die Auswertungen der 
Basisfunktionen gespeichert und nur beim ersten Auswerten müssen die 
virtuellen Methoden der Basisfunktionen bemüht werden.
Das BaseFunctionSet hat also eine Liste mit Pointern auf alle 
dazugehörigen Basisfunktionen.
Diese können in der oben beschriebenen Art und Weise durch die nicht 
virtuelle Methode evaluate des BaseFunctionSet ausgewertet werden.
Es gibt in für die Auswertung, erste Ableitung usw. default 
Implementierungen, damit man nicht immer diesen diffVariable Vec 
übergeben muss, die heissen eval,jacobian und hessian.

Warum virtuelle Methoden in den Basisfunktionen?
Jeder FunctionSpace sollte ein FastBaseFunctionSet(oder eine ander Impl) 
enthalten(für jeden Elementtyp eins), also gleicher Klassentype für 
unterschiedliche Elementtypen. Das FastBaseFunctionSet enthält dann 
pointer auf die BaseFunctions die wiederum vom jeweiligen FunctionSpace
abhängen. Da das FastBaseFunctionSet die Auswertungen der 
Basisfunktionen speichert(für eine gegebene Quadratur) fallen die 
virtuellen Methoden nicht weiter ins Gewicht. Genaueres (fastbase.hh usw.)

Jetzt der Funktionenraum: Er göhrt zu genau einem Gitter und enthält für 
alle Elementtypen des Gitters ein BaseFunctionSet.
Ausserdem weiss er über die Abbildung (Entity + locale dof Nummer) --> 
(globale Dof Nummer) bescheid (mapToGlobal) und kennt natürlich seine 
Dimension (size). Diese mapToGlobal des FunctionSpace ist die 
Schnittstelle, ich habe dahinter noch einen extra DofMapper gepackt, den 
man aber nicht notwendigerweise braucht. Ausserdem weiss der 
FunctionSpace, wie er die local dofs mit den Basisfunktionen 
multiplizieren muss (bei Lagrange trivial).

mapToGlobal Bsp:
Wenn man auf einer Entity die Methode localFunction einer 
DiscreteFunction aufruft, dann pickt sich diese aus dem DofVector der 
DiscreteFunction mittels mapToGlobal die entsprechenden dofs die zu 
dieser Entity gehören, raus.

Anwendungsbespiele finden sich in duneapps/examples/heatequation

Habe ich noch was vergessen?
Noch Fragen?

Grüssle

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




More information about the Dune mailing list