#include #include #include #include #include #include #include #define NX 200 #define NY 200 static const uint8_t lookup_a[64] = { // 0, 4, 8, 12, 1, 10, 9, 13, 2, 6, 5, 14, 3, 7, 11, 15 0, 8, 16, 24, 32, 40, 48, 56, 1, 18, 17, 25, 33, 41, 49, 57, 2, 10, 9, 26, 34, 21, 50, 58, 3, 11, 19, 27, 35, 43, 51, 59, 4, 12, 20, 28, 9, 44, 52, 60, 5, 13, 42, 29, 37, 45, 53, 61, 6, 14, 22, 30, 38, 46, 54, 62, 7, 15, 23, 31, 39, 47, 55, 63 }; static const uint8_t lookup_b[64] = { // 0, 4, 8, 12, 1, 10, 9, 13, 2, 6, 5, 14, 3, 7, 11, 15 0, 8, 16, 24, 32, 40, 48, 56, 1, 36, 17, 25, 33, 41, 49, 57, 2, 10, 36, 26, 34, 21, 50, 58, 3, 11, 19, 27, 35, 43, 51, 59, 4, 12, 20, 28, 18, 44, 52, 60, 5, 13, 42, 29, 37, 45, 53, 61, 6, 14, 22, 30, 38, 46, 54, 62, 7, 15, 23, 31, 39, 47, 55, 63 }; uint8_t collide(uint8_t val, uint8_t a, uint8_t b, uint8_t c) { if (val == 9 & a) { val = 18; a = !a; } else if (val == 9 & !a) { val = 36; a = !a; } else if (val == 18 & b) { val = 9; b = !b; } else if (val == 18 & !b) { val = 36; b = !b; } else if (val == 36 & c) { val = 18; c = !c; } else if (val == 36 & !c) { val = 9; c = !c; } else if (val == 42) { val = 42; } else if (val == 21) { val = 21; } else { val = (32&val)>>3 | (16&val)>>3 | (8&val)>>3 | (4&val)<<3 | (2&val)<<3 | (1&val)<<3; } // if (val == 9) { // a = !a; // if (a) { val = lookup_a[val]; } // else { val = lookup_b[val]; } // } else if (val == 18) { // b = !b; // if (b) { val = lookup_a[val]; } // else { val = lookup_b[val]; } // } else if (val == 36) { // c = !c; // if (c) { val = lookup_a[val]; } // else { val = lookup_b[val]; } // } else { // val = lookup_a[val]; // } return val; } uint8_t transport(uint8_t e, uint8_t ne, uint8_t nw, uint8_t w, uint8_t sw, uint8_t se) { uint8_t val = 1&e | 2&ne | 4&nw | 8&w | 16&w | 32&se; val = (32&val)>>3 | (16&val)>>3 | (8&val)>>3 | (4&val)<<3 | (2&val)<<3 | (1&val)<<3; return val; } main() { uint8_t newcell[NX][NY], cell[NX][NY]; int i, j, n, nsteps = 600; bool a = false, b = false, c = false; FILE *fp, *fopen(); fp = fopen("data.dat","w"); srand(time(NULL)); // INITIALIZE for (i=0; i < NX; i++) { for (j=0; j < NY; j++) { newcell[i][j] = 0; // cell[i][j] = 0; if (rand()%10 < 2) { cell[i][j] = rand()%64; } else { cell[i][j] = 0; } } } for (i=NX/2-NX/4; i < NX/2+NX/4; i++) { for (j=NY/2-NY/4; j < NY/2+NY/4; j++) { cell[i][j] = 63; } } for (n=0; n < nsteps; n++) { // collision handling for (i=0; i < NX; i++) { for (j=0; j < NY; j++) { newcell[i][j] = collide(cell[i][j],a,b,c); } } // transport for (i=1; i < NX-1; i++) { for (j=1; j < NY-1; j++) { cell[i][j] = transport(newcell[i+1][j],newcell[i+1][j+1],newcell[i-1][j+1],newcell[i-1][j],newcell[i-1][j-1],newcell[i+1][j-1]); } } // periodic boundary for (i=0; i < NX; i++) { cell[i][0] = cell[i][NX-2]; cell[i][NX-1] = cell[i][1]; } for (j=0; j < NY; j++) { cell[0][j] = cell[NX-2][j]; cell[NX-1][j] = cell[1][j]; } for ( j=0; j < NY; j++) { for ( i=0; i < NX; i++) { fprintf(fp,"%d \t",cell[i][j]); } fprintf(fp, " \n"); } fprintf(fp, "# T = %d \n", n); } fclose(fp); }