Exkurs:

Da der Zellindex modulo der über die Größe des Simulationsgebiets gewählten Zellanzahl in der jeweiligen Richtung ermittelt wird, werden Partikeln, die sich außerhalb des eigentlichen Simulationsgebiets bewegen, ebenfalls ,,sinnvolle`` Zellindizes zugeordnet. Viele Aspekte der Simulation sind damit tatsächlich unabhängig von der Größe des Simulationsgebiets. Insbesondere funktionieren weiterhin alle Partikelinteraktionen, solange der euklidische Abstand gemessen wird. Es entsteht lediglich der Mehraufwand der Abstandsmessung zu Partikeln, die sich eine Kantenlänge des Simulationsgebiets $ \pm r$ entfernt befinden, also ohne räumliche Nähe den selben Zellindex erhalten.

Auf diese Weise liegen zwar Partikel aus in $ x$-Richtung benachbarten Zellen in der sortierten Liste nahe beieinander, nicht aber Partikel, die in $ y$- oder $ z$-Richtung in benachbarten Zellen liegen. In diesem Fall können tausende oder auch nur wenige Partikel zwischen dem betrachteten und dem benachbarten Partikel liegen. Um also alle Kollisionen auflösen zu können, werden Zellen benötigt, die genau diese Grenzen abdecken.

Abbildung 3.2: Dem Partikel zugeordnete Zellen in den vier Gittern mit Zuordnung des relevanten Gitters aus verfeinertem Gitterindex.
\includegraphics{pix/movingparticleingrid.eps}
Abb. 3.2 zeigt die eindeutige Zuordnung jeder Position im Raum zu dem Gitter, in dem die zugehörige Zelle den Interaktionsbereich eines Partikels komplett umschreibt. Der Gitterindex ist die Summe der am Rand notierten Zahlen. Diese Zahlen werden beim Ermitteln der vier Zellindizes mittels einer zwei Bit feineren Zellindexbestimmung mit ermittelt und direkt als Gitterindex beim Partikel gespeichert.

Um nun alle Kollisionen auszuwerten, werden alle Flüssigkeitspartikel durchlaufen, jeweils die relevante Sortierung ausgelesen und in der gewählten sortierten Liste so viele nachfolgende und vorhergehende Partikel betrachtet, wie diese einen noch relevanten Zellindex besitzen. Da in $ x$-Richtung zwei Bit mehr gespeichert werden, ist der Bereich, über den gesucht wird, nicht $ 4r$, sondern nur $ 3r$ (siehe Abb. 3.3). Nämlich die aktuelle $ x$-Zelle, der Nachfolger und der Vorgänger.

Abbildung 3.3: In $ x$-Richtung wird eine feinere Zellunterteilung verwendet.
\includegraphics{pix/x2bitplus.eps}

Hier ließe sich durch das Verwenden weiterer Bits eine noch feinere Unterteilung realisieren.

Bit Größe Verwendung bei  
$\displaystyle 1$ $\displaystyle 4r$ $\displaystyle y,z$  
$\displaystyle 2$ $\displaystyle 3r$ $\displaystyle x$  
$\displaystyle 3$   $\displaystyle 2\frac{1}{2}r$  
$\displaystyle 4$   $\displaystyle 2\frac{1}{4}r$  
$\displaystyle 5$   $\displaystyle 2\frac{1}{8}r$  
  $\displaystyle \dots$    

In meiner Anwendung ist eine Verwendung nicht benötigter Bits zu diesem Zweck nicht vorgesehen.

Da alle Kräfte symmetrisch sind, genügt es, bei beiden Kollisionspartnern die inversen Kräfte zu addieren. Um also nicht a mit b und b mit a kollidieren zu lassen, wird jetzt geprüft, ob der Index des Kollisionspartners größer ist als der des aktuellen Partikels. Ist dies der Fall, so wird die eigentliche Interaktion der Partikel berechnet. Um Kontrolle über das Verhalten der Flüssigkeit zu erlangen, verwende ich neben den SPH-Partikeln auch spezielle Partikel, die direkte Veränderungen an den SPH-Partikeleigenschaften bewirken. Diese haben immer einen höheren Index als SPH-Partikel. Näheres dazu in Kapitel 3.2.2 und 5.4.2.

Der Kollisionspartner kann also entweder selbst ein Flüssigkeitspartikel oder ein Kontrollpartikel sein.

Leo Wandersleb 2005-01-17