¿Cómo inicializar/arrancar el algoritmo de Boris?

El algoritmo de Boris requiere posiciones y velocidades intercaladas, es decir, posición medida en t i y velocidad en t i 1 / 2 Por ejemplo. Quiero emplear el empujador de Boris en mi aplicación, sin embargo, me dan la posición y la velocidad en algún momento. t 0 (como una entrada; no desplazada por la mitad de un paso de tiempo). Si introduzco esto en el algoritmo, obviamente arroja resultados incorrectos (como se puede ver en un caso para el que se conoce la solución analítica).

Pregunta: ¿Cómo puedo inicializar el algoritmo para obtener la posición y la velocidad desplazadas por Δ t / 2 ?

Aparte (1): el algoritmo de Boris primero realiza una actualización de velocidad y luego usa la nueva velocidad para calcular la actualización de posición. Sin embargo, la actualización de velocidad usa tanto la posición (para calcular los campos) como la velocidad, por lo que no puedo simplemente usar una actualización de velocidad para Δ t Δ t / 2 .

Aparte (2): el algoritmo Leapfrog también (originalmente) usa posiciones y velocidades intercaladas; sin embargo, se puede reformular para que se calculen "en el mismo paso" (es decir, ambos definidos en t i ). Que yo sepa, tal reformulación no existe para el algoritmo de Boris.

Respuestas (2)

Esto generalmente se conoce como un problema de "inicio" y ocurre con una serie de esquemas. Los esquemas implícitos de orden superior, por ejemplo, necesitan los valores en múltiples niveles de tiempo anteriores.

El truco consiste en comenzar la simulación usando uno o más esquemas más simples para ponerla en marcha. Por ejemplo, podría usar un método Runge-Kutta de segundo orden para un paso para tener valores en t 0 y t 1 , y luego interpolar a t 0.5 y comience su algoritmo con ese conjunto de datos. Cualquier método funcionaría, pero un esquema explícito simple será su mejor opción para que las cosas se muevan.

Si desea garantizar la coherencia al reiniciar desde los puntos de control frente a correr hasta el final sin puntos de control, querrá guardar sus valores de paso de medio tiempo anteriores cuando guarde sus puntos de control. De esa manera, cuando reinicie las cosas, no necesita dar otro paso inicial.

Solo asegúrese de obedecer las restricciones de estabilidad y/o precisión que pueda tener al comienzo de la simulación. Para muchos sistemas, este es un momento altamente no lineal y la robustez puede ser un problema si los esquemas se eligen mal.

Uno le preguntó a un colega cómo lidió con la velocidad de desplazamiento de su partícula en el código de la celda, y su respuesta fue diferente de lo que dijo tpg2114 en su respuesta.

En lugar de calcular el siguiente paso de tiempo usando un método de orden inferior, el código PIC de mi colega en realidad resolvería la siguiente velocidad hacia atrás en el tiempo (es decir, en t = Δ t / 2 ) y la fuerza en t = Δ t utilizando sus típicos algoritmos de segundo orden antes de avanzar en el tiempo. 1 Me parece que todavía existe el problema de que sus datos contienen v ( t = 0 ) y X ( t = 0 ) , que puede requerir la solución de tpg2114 .

No sé si lo hicieron, pero parecería razonable que después de dar un paso adelante para t = 0 uno verificaría las posiciones de las partículas para asegurarse de que las posiciones coincidan en algún nivel (con suerte, la precisión de la máquina , pero podría entender usando una tolerancia mayor).


1. Podría darse el caso de que v ( t = 3 Δ t / 2 ) también se necesita, pero no estoy 100% seguro, ya que esto fue hace unos 5 años que había preguntado y no hice/no hice simulaciones PIC.

Vale la pena señalar (muy tarde) que este enfoque está bien siempre que las ecuaciones discretas sean estables con la inversión del tiempo. Los términos difusivos se convierten en términos de nitidez cuando se invierten y pueden conducir a inestabilidades numéricas realmente desagradables.