X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=course%2Fsemester2%2Fpprog%2Fassignment1%2Fsingle-thread%2Fnbody.h;h=4d53f9d07c62f7c8c44546a061814f1faba411f5;hb=47b0dba32b8e0e0deedfbfc6db49b65b930e2889;hp=e288c6d3a1971c202a425de42b6f015092c69ef5;hpb=7a341db1fbf5db94b711135b2a79e852c6fb1bc4;p=matches%2Fhonours.git diff --git a/course/semester2/pprog/assignment1/single-thread/nbody.h b/course/semester2/pprog/assignment1/single-thread/nbody.h index e288c6d3..4d53f9d0 100644 --- a/course/semester2/pprog/assignment1/single-thread/nbody.h +++ b/course/semester2/pprog/assignment1/single-thread/nbody.h @@ -7,12 +7,48 @@ * @purpose N-Body simulator: declarations of simulation related parameters */ +#include +#include +#include +#include +#include //POSIX time + + + #define SINGLE_THREADED +// --- The below macros will be undefined by the multithreaded versions, and replaced with functions --- // + +//Sets up the simulation; in multithreaded versions, will spawn threads +#define Simulation_Run(argc, argv) \ +if (options.draw_graphics) \ + Graphics_Run(argc, argv); \ +else \ +{ \ + while (ExitCondition() == false) \ + { BeforeDraw(); AfterDraw(); } \ +} + +#define QuitProgram(error) (runstate = (error == true) ? QUIT : QUIT_ERROR) //Prepares to exit program, is thread safe in multithreaded versions + +//Macro to be overwritten in multithreaded versions, called before the graphics is allowed to draw anything +#define BeforeDraw() \ +if (options.verbosity != 0 && universe.steps % options.verbosity == 0) \ + DisplayStatistics(); \ +System_Compute(&universe); + + + +//Macro to be overwritten in multithreaded versions, called after the graphics has finished drawing. +#define AfterDraw() + +// --- Constants and other Macros --- // + #define M_PI 3.14159265358979323846264338327950288 /* pi */ #define G 6.67428E-11 #define DELTA_T 0.05 #define DIMENSIONS 3 +#define LINE_SIZE 1000 #define square(x) ((x)*(x)) @@ -35,29 +71,67 @@ typedef struct /** * Structure to store an array of bodies, along with the size of the array. - * The universe is represented in a single System. + * The universe is represented by a single System. + * In the multithreaded program, the universe is subdivided into one system for each working thread to use. * @param N - Size of the array * @param body - The array of bodies */ typedef struct { - unsigned N; - Body * body; + unsigned N; // Number of bodies in the System + Body * body; // Array of bodies + + unsigned steps; //Number of steps simulated } System; -void Body_Print(Body * a); //Print body a +/** + * Structure to represent options passed to the program. + */ +typedef struct +{ + const char * input; // initial body field + const char * output; // file to write final positions / velocities of bodies to + const char * program; // program name + unsigned num_threads; // number of worker threads to spawn (must be greater than 1 for any to be spawned) + unsigned nested_threads; // number of threads to nest computations with (must be greater than 1 for any to be spawned) + unsigned num_steps; // number of steps to run before stopping (run indefinately if equal to zero) + unsigned timeout; // number of seconds to run before stopping (run indefinately if equal to zero) + bool draw_graphics; // whether or not to actually draw graphics + bool pedantic_graphics; // whether the graphics thread will synchronise with the computation thread (true) or just draw as fast as possible (false) + bool print_positions; // print positions of bodies to stdout on every step + unsigned verbosity; // print statistics every number of steps indicated by this variable + clock_t start_clock; // clock cycles done when simulation starts + struct timeval start_time; // time at which simulation starts +} Options; + +void Body_Print(Body * a, FILE * out); //Print body a void Body_Force(Body * a, System * s); //Compute force on body a due to system of bodies s void Body_Velocity(Body * a); //Compute velocity of body a void Body_Position(Body * a); //Compute position of body a -void System_Init(System * s, char * fileName); //Initialise System (array of bodies) from a text file +void System_Init(System * s, const char * fileName); //Initialise System (array of bodies) from a text file +void System_Compute(System * s); +void System_Forces(System * s1, System * s2); //Compute forces for bodies in s1 due to bodies in s2 (also updates velocities) +void System_Positions(System * s); //Update positions for bodies in s1 + + +void Universe_Cleanup(); //Cleanup universe and write bodies to file -void System_Compute(System * system); //Perform a single computation step for a System of bodies +void DisplayStatistics(); // Print information about steps computed, total (real) runtime, and CPU cycles -void Universe_Cleanup(); + +bool ExitCondition(void); //Checks whether the program is supposed to exit automatically yet (ie: other than the user pressing "quit") + + +typedef enum {RUN, QUIT, QUIT_ERROR} RUNSTATE; +extern RUNSTATE runstate; // Set runstate to QUIT or QUIT_ERROR and the simulation will stop on the next step. +// This is fairly redundant in the single threaded version, but useful for making sure *all* threads know to exit in the multi-threaded version extern System universe; // The main array of bodies; global variable. +extern Options options; // Parameters passed to program + + #endif //_NBODY_H