[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