Only drift the particles that need drifting
Here is an algorithmic speed-up. The plan is to drift only the cells that contain an active particles and the cells that have at least one neighbour with an active particle.
-
If this condition is not met then
runner_do_drift()
just returns without performing any operation. -
If the condition is met,
runner_do_drift()
moves all particles (as before) from the last point in time where a drift was performed.
We record for each cell the last time a drift was done such that we now by how much to drift things when needed.
Two exceptions to this rule: before reconstructing and before duping a snapshot, we drift all particles as we need correct position information at these two stages.
Note that I have made this an engine policy to ease the testing. Drifting all particles can be restored by setting the right flag.
@nnrw56 could you check that the function cell_is_drift_needed()
makes sense and fully does what it says it does ? Also could you let me know whether you also agree with the whole logic and implementation.