\ In the even phase of a step, we're updating a 4x4 region layed out like: \ \ ul0 ur0 ul1 ur1 \ ll0 lr0 ll1 lr1 \ ul2 ur2 ul3 ur3 \ ll2 lr2 ll3 lr3 \ \ In the odd phase, the 4x4 region looks like this: \ lr0 ll1 lr1 ll0 \ ur2 ul3 ur3 ul2 \ lr2 ll3 lr3 ll2 \ ur0 ul1 ur1 ul0 ( actually, since I've split the propagate, phases have become more symmetric ) 0 0 == ul0 1 1 == ur0 2 2 == ul1 3 3 == ur1 4 4 == ll0 5 5 == lr0 6 6 == ll1 7 7 == lr1 8 8 == ul2 9 9 == ur2 10 10 == ul3 11 11 == ur3 12 12 == ll2 13 13 == lr2 14 14 == ll3 15 15 == lr3 : propagate- ul0 -> lr3 ur0 -> ll2 ll0 -> ur1 lr0 -> ul0 ul1 -> lr2 ur1 -> ll3 ll1 -> ur0 lr1 -> ul1 ul2 -> lr1 ur2 -> ll0 ll2 -> ur3 lr2 -> ul2 ul3 -> lr0 ur3 -> ll1 ll3 -> ur2 lr3 -> ul3 ; : propagate+ ul0 -> lr0 ur0 -> ll1 ll0 -> ur2 lr0 -> ul3 ul1 -> lr1 ur1 -> ll0 ll1 -> ur3 lr1 -> ul2 ul2 -> lr2 ur2 -> ll3 ll2 -> ur0 lr2 -> ul1 ul3 -> lr3 ur3 -> ll2 ll3 -> ur1 lr3 -> ul0 ; create-lut pos-table create-lut neg-table define-step init-step full-space display 0 map! lut-data pos-table switch-luts lut-data neg-table end-step this is when-starting 3 constant A \ attractive at radius 3*2 -3 constant -A 12 constant R \ repulsive at radius 12*2 -12 constant -R \* I haven't done the neighborhoods yet. The way I'm doing things, I have to alternate updates on the -ive diagonal with ones on the +ive diagonal, since I've coupled diagonal and block-phase in order to only use two update tables (for maximum demo speed). Half of each of the two kinds of updates are attractive, and half are repulsive. We should pick a few random orderings for all 8 updates, being sure to alternate +ive diagonal and -ive diagonal updates. (4!x4! possible choices, but we'll just re-use a few, and randomly choose which one to use next). Note that, for each run, I have to figure out which updates are attractive and which are repulsive, in order to get the kicks right. Also, all bit-fields are kicked each time, and only the amount varies. The fields that were part of the edge-overlap for the 4x4 blocks move +/- 1 extra. *\ : neg/pos-step (s needs.some.arguments -- ) site-src lut lut-src site kick ul0 field -1 x -1 y \ right for 0 impact parameter ur0 field -1 y ul1 field -1 y ur1 field -1 y ll0 field -1 x ul2 field -1 x ll2 field -1 x run free new-table kick ul0 field 1 x 1 y ur0 field 1 y ul1 field 1 y ur1 field 1 y ll0 field 1 x ul2 field 1 x ll2 field 1 x run free new-table ; 0 1 == cnt0 2 3 == cnt1 4 5 == cnt2 6 7 == cnt3 : display-rule ul0 ur0 ll0 lr0 + + + 3 min -> cnt0 ul1 ur1 ll1 lr1 + + + 3 min -> cnt1 ul2 ur2 ll2 lr2 + + + 3 min -> cnt2 ul3 ur3 ll3 lr3 + + + 3 min -> cnt3 ; ?rule>table display-rule display-table 1 is show-function-mode \ for full-scale view, use display fn ' mono-smap is smap cboard-flag off \ initially suppress cboard when spread 10 run-length ! \ initially show every 10th double-step