Wie initialisiere ich den Boris-Algorithmus?

Der Boris-Algorithmus erfordert verschachtelte Positionen und Geschwindigkeiten, dh Position gemessen an T ich und Geschwindigkeit bei T ich 1 / 2 Zum Beispiel. Ich möchte den Boris-Drücker in meiner Anwendung verwenden, aber ich bekomme irgendwann sowohl Position als auch Geschwindigkeit T 0 (als Eingang; nicht um einen halben Zeitschritt verschoben). Wenn ich das in den Algorithmus eingebe, liefert das natürlich falsche Ergebnisse (wie man an einem Fall sieht, für den die analytische Lösung bekannt ist).

Frage: Wie kann ich den Algorithmus initialisieren, um die verschobene Position und Geschwindigkeit zu erhalten? Δ T / 2 ?

Abgesehen von (1): Der Boris-Algorithmus führt zuerst eine Geschwindigkeitsaktualisierung durch und verwendet dann die neue Geschwindigkeit, um die Positionsaktualisierung zu berechnen. Die Geschwindigkeitsaktualisierung verwendet jedoch sowohl die Position (um die Felder zu berechnen) als auch die Geschwindigkeit, sodass ich nicht einfach eine Geschwindigkeitsaktualisierung verwenden kann Δ T Δ T / 2 .

Abgesehen von (2): Der Leapfrog-Algorithmus verwendet (ursprünglich) auch verschachtelte Positionen und Geschwindigkeiten, kann jedoch so umformuliert werden, dass sie "im Gleichschritt" berechnet werden (dh beide definiert bei T ich ). Eine solche Umformulierung existiert meines Wissens nach für den Boris-Algorithmus nicht.

Antworten (2)

Dies ist allgemein als "Start"-Problem bekannt und tritt bei einer Reihe von Schemata auf. Implizite Schemata höherer Ordnung benötigen beispielsweise die Werte auf mehreren vorherigen Zeitebenen.

Der Trick besteht darin, die Simulation mit einem oder mehreren einfacheren Schemata zu beginnen, um sie zum Laufen zu bringen. Sie könnten beispielsweise eine Runge-Kutta-Methode 2. Ordnung für einen Schritt verwenden, damit Sie Werte bei haben T 0 Und T 1 , und dann zu interpolieren T 0,5 und starten Sie Ihren Algorithmus mit diesem Datensatz. Jede Methode würde funktionieren, aber ein einfaches explizites Schema wird Ihre beste Wahl sein, um die Dinge in Bewegung zu bringen.

Wenn Sie Konsistenz beim Neustart von Kontrollpunkten im Vergleich zum Laufen bis zum Ziel ohne Kontrollpunkte sicherstellen möchten, sollten Sie Ihre vorherigen Halbzeit-Schrittwerte speichern, wenn Sie Ihre Kontrollpunkte speichern. Auf diese Weise müssen Sie beim Neustart keinen weiteren Startschritt machen.

Stellen Sie einfach sicher, dass Sie alle Stabilitäts- und/oder Genauigkeitsbeschränkungen befolgen, die Sie möglicherweise zu Beginn der Simulation haben. Für viele Systeme ist dies ein stark nichtlineares Moment, und die Robustheit kann ein Problem darstellen, wenn die Schemata schlecht gewählt werden.

Ich hatte einen Kollegen gefragt, wie er mit der Offset-Geschwindigkeit für sein Partikel im Zellcode umgeht, und seine Antwort unterschied sich von dem, was tpg2114 in seiner Antwort sagte.

Anstatt den nächsten Zeitschritt mit einer Methode niedrigerer Ordnung zu berechnen, würde der PIC-Code meines Kollegen tatsächlich die nächste Geschwindigkeit rückwärts in der Zeit lösen (dh at T = Δ T / 2 ) und die Kraft bei T = Δ T mit ihren typischen Algorithmen 2. Ordnung, bevor sie sich in der Zeit vorwärts bewegen . 1 Es scheint mir, dass es immer noch das Problem Ihrer Daten enthält v ( T = 0 ) Und X ( T = 0 ) , für die möglicherweise die Lösung von tpg2114 erforderlich ist .

Ich weiß nicht, ob sie es getan haben, aber es scheint vernünftig, dass sie nach vorne treten T = 0 Man würde die Positionen der Partikel überprüfen, um sicherzustellen, dass die Positionen auf einem gewissen Niveau übereinstimmen (hoffentlich Maschinenpräzision , aber ich könnte verstehen, dass eine größere Toleranz verwendet wird).


1. Es könnte der Fall sein, dass v ( T = 3 Δ T / 2 ) wird ebenfalls benötigt, aber ich bin mir nicht 100% sicher, da dies vor ungefähr 5 Jahren war, dass ich gefragt hatte und ich keine PIC-Simulationen mache / nicht mache.

Es sei darauf hingewiesen (sehr spät), dass dieser Ansatz in Ordnung ist, solange die diskreten Gleichungen bei Zeitumkehr stabil sind. Diffusive Terme werden zu schärfenden Termen, wenn sie umgekehrt werden, und können zu wirklich bösen numerischen Instabilitäten führen.