Current order of BCA operations is as follows:
Ion start at x0, y0, z0 with direction u0, v0, w0
Determine mfp, impact parameter, azimuthal angle
Choose collision partner at position x_recoil, y_recoil, z_recoil
If x_recoil, y_recoil inside 2D geometry {
Calculate distance of closest approach
Calculate lab-frame scattering angle for ion and recoil
Calculate asymptotic deflection
Rotate ion by lab-frame scattering angle to u1, v1, w1
Rotate recoil by lab-frame recoil angle
Advance ion to x0 + mfp*u1, y0 + mfp*v1, y0 + mfp*v1
If recoil energy greater than cutoff {
Add recoil to particle list
}
}
However, the ion's next position should be:
(x0 + mfp*u0, y0 + mfp*v0, z0 + mfp*w0)
So the order of operations is incorrect. Most succinct solution which preserves the structure of the weak collision loop would be to simply store the particle's previous direction and use that to update the particle location, much as it stores its previous position to determine when it crosses boundaries.