
Simulation von Wellen durch lösen der 3D-Wellengleichung mittels finiter Differenzenmethode.
Eine in C++ geschriebene Beispielimplementierung des Magnetischen Pendels kann auf GitHub herunter geladen werden.
Die Benutzeroberfläche zu erklären ist einfach, denn es gibt (fast) keine. Alle Simulationsparameter werden aus einem Konfigurationsfile eingelesen, das als Parameter beim Start übergeben werden muß. Das Programm besteht aus einem einzigen Fenster, die Berechnung startet sofort. Da das Warten auf ein Ergebnis recht langweilig sein kann habe ich ein wenig Interaktivität eingebaut. Wannimmer die Maus bewegt wird berechnet das Programm die zur Mausposition gehörende Pendelspur. Das ist zwar nur spielerei, kann aber auch ganz hilfreich sein, um manuell bestimmte Gebiete der Simulation abzutesten. Hier kommen wir auch gleich wieder auf den Schmetterlingseffekt zurück, denn es ist schon interessant zu sehen, wie stark sich die Spuren von benachbarten Startpositionen unterscheiden können.
Durch drücken der rechten Maustaste kann angezeigt werden, welche Pendelspur gerade berechnet wird. Nochmaliges drücken deaktiviert diese Anzeige wieder.
Die Anwendung nutzt die Vorteile von Mehrkernsystemen durch verteilen der Rechenaufgaben auf die einzelnen Kerne der CPU.
Das Format der Konfigurationsdatei entspricht dem einer einer Windows INI-Datei. Es können folgende Parameter verwendet werden:
Sektion | Schlüssel | Beschreibung |
---|---|---|
[FIELD] | COLS |
Anzahl der Spalten des Simulationsgebietes. Dieser Parameter definiert die räumliche Diskretisierung in X-Richtung. |
HEIGHT |
Anzahl der Reihen des Simulationsgebietes. Dieser Parameter definiert die räumliche Diskretisierung Y-Richtung. | |
SIM_WIDTH (optional) |
Breite der Simulationsdomain in metern. Wird auf COLS gesetzt, wenn unspezifiziert.
|
|
SIM_HEIGHT |
Länge der Simulationsdomain in Metern. Wird auf ROWS gesetzt, wenn unspezifiziert.
|
|
WIN_WIDTH (optional) |
Breite des Ausgabefensters in Pixel. Benutze diesen Parameter um das Ausgabefenster zu verkleinern, wenn
die Simulationsgröße über die Bildschirmgröße heraus geht. Ist der
Wert ungesetzt, so wird er mit dem Wert von COLS belegt.
|
|
WIN_HEIGHT (optional) |
Die Höhe des Ausgabefensters in Pixeln. Dieser Parameter kann verwendet werden, um die
Höhe des Ausgabefensters anzupassen, wenn Bilder berechnet werden, die Größer
als der Bildschirm sind. Wird der Parameter weggelassen, do wird er mit dem Wert von
ROWS belegt.
|
|
[SIMULATION] | THREADS (optional) |
Legt die Anzahl der Threads fest, die von der Simulation erzeugt werden fest. Wenn der Parameter ausgelassen wird, dann wird automatisch die Anzahl der Kerne verwendet. Jeder Thread läuft auf einem eigenen Kern. Dadurch kann die Geschwindigkeit auf Mehrkernsystemem deutlich erhöht werden. (ca. 40% mit einem Dual-Core Rechner). |
FRICTION |
Der Reibungskoeffizient. Die Reibungskraft ist direkt proportional zur Geschwindigkeit des Pendels wobei dieser Wert als Proportionalitäskonstante dient. | |
PEND_HEIGHT |
Die Höhe des Pendels über der Ebene in der die Magnete angeordnet sind. | |
DELTA_T |
Die Integrationsschrittweite. Eine kleinere Schrittweite bedeutet eine genauere Simulation. Dieser Parameter entspricht dem Parameter h in der Beeman-Integrationsformel. | |
MIN_STEPS |
Minimale Anzahl an Schritten, die eine Pendelspur haben muß bevor die Abbruchbedingungen überprüft werden. | |
MAX_STEPS |
Maximale Anzahl an Schritten, die eine Pendelspur haben darf. Wird diese Anzahl erreicht bricht die Berechnung ab, auch wenn das Pendel noch nicht über einem Magneten zur Ruhe gekommen ist. | |
ABORT_VEL |
Wenn die Pendelgeschwindigkeit unter diesen Wert fällt wird die Verfolgung der Spur beendet und die Berechnung des nächsten Pixels wird gestartet. | |
COLOR_SCHEME |
Eine Gleichung die verwendet werden soll um die Farbe eines Pixels in Abhängigkeit der
Gesamtspurlänlge zu berechnen. Die Farbe eines Pixels wird durch die Länge der
gerade berechneten Spur und die Länge der Längsten Spur bestimmt. Es muß
sich bei diesem Parameter um eine Funktion handeln, der die Variablen len
und max_len (siehe Bild 2) enthält.
zum Beispiel: 1/(exp(0.000001*(len*len)))
|
|
BATCH_MODE (optional) |
Dieses Flag aktiviert den Batch-Modus. Im Batch-Modus beendet sich die Simulation selbstständig nach einer Berechnung. Dieses Flag kann benutzt werden um mittels Shell-Skripten Animationen zu erstellen. | |
[SOURCE ...] ... steht für einen Index |
TYPE |
Gibt die Art der Quelle an. Erlaubt sind folgende Schlüsselwörter: INV_SQR oder
LINEAR . Die von der Quelle ausgehende Kraft ist entweder proportional zur Entfernung des
Pendels oder proportional zum inversen Quadrat der Pendelentfernung. Der erste Fall beschreibt ein
Verhalten ähnlich dem
Hookesches Gesetz,
der zweite Fall beschreibt eine Quelle ähnlich dem
Coulombschen Gesetz
(Rein physikalisch gesehen haben wir es hier allerdings mit Magneten zu tun, nicht mit elektrischen
Ladungen also ist das Coulombsche Gesetz hier nur Beispielhaft zu verstehen).
|
COLOR |
Die Farbe der Quelle. Kommt das Pendel über der Quelle zu stehen, dann wird seine Startposition mit dieser Farbe eingefärbt. | |
RAD |
Die Positionen der Quellen werden in Polarkoordinaten angegeben. Dies ist der Abstand der Quelle vom Simulationszentrum aus gesehen. | |
THETA |
Die Positionen der Quellen werden in Polarkoordinaten angegeben. Dies ist der Winkel, den die Quelle vom Simulationszentrum aus gesehen einnimmt. | |
MULT |
Multiplikator für die Stärke der Kraft. Je größer dieser Wert ist, umso stärker wirkt die Kraft auf das Pendel. | |
SIZE |
Größe der Quelle. Die Abbruchbedingungen werden nur überprüft, wenn das Pendel sich näher als so viele Pixel an der Quelle befindet. |
Beispielekonfigurationsdateien befinden sich im data Unterverzeichnis. Wenn du eine eigene Konfiguration erstellen möchtest, dann fange am besten mit einer bestehenden Datei an und modifiziere diese.