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.