Changeset 4834 in /cluster/svnroot


Ignore:
Timestamp:
Jul 26, 2014 3:50:41 PM (6 years ago)
Author:
amweeden06
Message:

HPCU Bouncing Particles - finishing solution

File:
1 edited

Legend:

Unmodified
Added
Removed
  • bccd-ng/hpcu-weekly-challenge/bouncing-particles/bounce.c

    r4833 r4834  
     1/* HPCU Bi-Weekly Challenge: Bouncing Particles
     2 * Author: Aaron Weeden, Shodor, 2014
     3 */
     4
     5/* Libraries */
    16#include <stdio.h>
    27#include <stdlib.h>
    38#include <time.h>
    49
     10/* Constants */
    511#define EMPTY -1
    6 #define NORTHEAST 0
    7 #define SOUTHEAST 1
    8 #define NORTHWEST 2
    9 #define SOUTHWEST 3
    10 
    11 #define N_DIRS 4   // number of directions
    12 #define N_PARTS 20 // number of particles
    13 #define N_ROWS 12  // number of rows
    14 #define N_COLS 11  // number of columns
    15 #define N_TIME 5   // number of time steps
    16 
    17 int Grid[N_ROWS][N_COLS]; // environment
    18 int Rows[N_PARTS];        // particle row positions
    19 int Cols[N_PARTS];        // particle column positions
    20 int Dirs[N_PARTS];        // particle directions
    21 int NewRows[N_PARTS];     // particle row positions after move
    22 int NewCols[N_PARTS];     // particle column positions after move
    23 int NewDirs[N_PARTS];     // particle directions after move
    24 
     12
     13#define NORTH 0
     14#define SOUTH 1
     15#define N_Y_DIRS 2
     16
     17#define EAST 0
     18#define WEST 1
     19#define N_X_DIRS 2
     20
     21#define N_PARTS 20
     22#define N_ROWS 12
     23#define N_COLS 11
     24#define N_TIME 5
     25
     26/* Globals */
     27int Grid[N_ROWS][N_COLS];
     28int Rows[N_PARTS];
     29int Cols[N_PARTS];
     30int XDirs[N_PARTS];
     31int YDirs[N_PARTS];
     32
     33/* Functions */
    2534void empty();
    2635void randomize();
     
    2837void move();
    2938
     39/* Main */
    3040int main() {
    3141    int i;
     
    6575        Rows[i] = row;
    6676        Cols[i] = col;
    67         Dirs[i] = N_DIRS * random() / RAND_MAX;
     77        XDirs[i] = N_X_DIRS * random() / RAND_MAX;
     78        YDirs[i] = N_Y_DIRS * random() / RAND_MAX;
    6879
    6980        Grid[row][col] = i;
     
    99110
    100111void move() {
    101     int i, j;
    102     int row, col;
     112    int i;
    103113
    104114    for (i = 0; i < N_PARTS; i++) {
    105         row = Rows[i];
    106         col = Cols[i];
    107         switch (Dirs[i]) {
    108             case NORTHEAST:
    109                 if (row == 0) {
    110                     if (col == N_COLS-1) {
    111                         NewDirs[i] = SOUTHWEST;
    112                     } else {
    113                         NewDirs[i] = SOUTHEAST;
    114                     }
    115                 } else {
    116                     if (col == N_COLS-1) {
    117                     }
    118                 }
    119                 break;
    120             case SOUTHEAST:
    121                 break;
    122             case NORTHWEST:
    123                 break;
    124             case SOUTHWEST:
    125                 break;
    126         }
    127     }
    128 }
     115        /* particles hitting walls change direction */
     116        if (YDirs[i] == NORTH && Rows[i] == 0) {
     117            YDirs[i] = SOUTH;
     118        }
     119        if (XDirs[i] == EAST && Cols[i] == N_COLS-1) {
     120            XDirs[i] = WEST;
     121        }
     122        if (YDirs[i] == SOUTH && Rows[i] == N_ROWS-1) {
     123            YDirs[i] = NORTH;
     124        }
     125        if (XDirs[i] == WEST && Cols[i] == 0) {
     126            XDirs[i] = EAST;
     127        }
     128        /* particles colliding in opposite directions change direction */
     129        if (YDirs[i] == NORTH && Rows[i] > 0 &&
     130                Grid[Rows[i]-1][Cols[i]] != EMPTY &&
     131                YDirs[Grid[Rows[i]-1][Cols[i]]] == SOUTH) {
     132            YDirs[i] = SOUTH;
     133            YDirs[Grid[Rows[i]-1][Cols[i]]] = NORTH;
     134        }
     135        if (XDirs[i] == EAST && Cols[i] < N_COLS-1 &&
     136                Grid[Rows[i]][Cols[i]+1] != EMPTY &&
     137                XDirs[Grid[Rows[i]][Cols[i]+1]] == WEST) {
     138            XDirs[i] = WEST;
     139            XDirs[Grid[Rows[i]][Cols[i]+1]] = EAST;
     140        }
     141        if (YDirs[i] == SOUTH && Rows[i] < N_ROWS-1 &&
     142                Grid[Rows[i]+1][Cols[i]] != EMPTY &&
     143                YDirs[Grid[Rows[i]+1][Cols[i]]] == NORTH) {
     144            YDirs[i] = NORTH;
     145            YDirs[Grid[Rows[i]+1][Cols[i]]] = SOUTH;
     146        }
     147        if (XDirs[i] == WEST && Cols[i] > 0 &&
     148                Grid[Rows[i]][Cols[i]-1] != EMPTY &&
     149                XDirs[Grid[Rows[i]][Cols[i]-1]] == EAST) {
     150            XDirs[i] = EAST;
     151            XDirs[Grid[Rows[i]][Cols[i]-1]] = WEST;
     152        }
     153        /* particles move to empty squares or bounce away */
     154        if (YDirs[i] == NORTH && XDirs[i] == EAST && Rows[i] > 0 &&
     155                Cols[i] < N_COLS-1) {
     156            if (Grid[Rows[i]-1][Cols[i]+1] == EMPTY) {
     157                Grid[Rows[i]][Cols[i]] = EMPTY;
     158                Grid[Rows[i]-1][Cols[i]+1] = i;
     159                Rows[i]--;
     160                Cols[i]++;
     161            } else {
     162                YDirs[i] = SOUTH;
     163                XDirs[i] = WEST;
     164            }
     165        }
     166        if (YDirs[i] == NORTH && XDirs[i] == WEST && Rows[i] > 0 &&
     167                Cols[i] > 0) {
     168            if (Grid[Rows[i]-1][Cols[i]-1] == EMPTY) {
     169                Grid[Rows[i]][Cols[i]] = EMPTY;
     170                Grid[Rows[i]-1][Cols[i]-1] = i;
     171                Rows[i]--;
     172                Cols[i]--;
     173            } else {
     174                YDirs[i] = SOUTH;
     175                XDirs[i] = EAST;
     176            }
     177        }
     178        if (YDirs[i] == SOUTH && XDirs[i] == EAST && Rows[i] < N_ROWS-1 &&
     179                Cols[i] < N_COLS-1) {
     180            if (Grid[Rows[i]+1][Cols[i]+1] == EMPTY) {
     181                Grid[Rows[i]][Cols[i]] = EMPTY;
     182                Grid[Rows[i]+1][Cols[i]+1] = i;
     183                Rows[i]++;
     184                Cols[i]++;
     185            } else {
     186                YDirs[i] = NORTH;
     187                XDirs[i] = WEST;
     188            }
     189        }
     190        if (YDirs[i] == SOUTH && XDirs[i] == WEST && Rows[i] < N_ROWS-1 &&
     191                Cols[i] > 0) {
     192            if (Grid[Rows[i]+1][Cols[i]-1] == EMPTY) {
     193                Grid[Rows[i]][Cols[i]] = EMPTY;
     194                Grid[Rows[i]+1][Cols[i]-1] = i;
     195                Rows[i]++;
     196                Cols[i]--;
     197            } else {
     198                YDirs[i] = NORTH;
     199                XDirs[i] = EAST;
     200            }
     201        }
     202    }
     203}
Note: See TracChangeset for help on using the changeset viewer.