-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserial.cpp
More file actions
129 lines (110 loc) · 3.9 KB
/
serial.cpp
File metadata and controls
129 lines (110 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <math.h>
#include <iostream>
#include <stack>
#include <set>
#include "common.h"
using namespace std;
//
// benchmarking program
//
int main( int argc, char **argv )
{
int navg,nabsavg=0;
double davg,dmin, absmin=1.0, absavg=0.0;
if( find_option( argc, argv, "-h" ) >= 0 )
{
printf( "Options:\n" );
printf( "-h to see this help\n" );
printf( "-n <int> to set the number of particles\n" );
printf( "-o <filename> to specify the output file name\n" );
printf( "-s <filename> to specify a summary file name\n" );
printf( "-no turns off all correctness checks and particle output\n");
return 0;
}
int n = read_int( argc, argv, "-n", 1000 );
char *savename = read_string( argc, argv, "-o", NULL );
char *sumname = read_string( argc, argv, "-s", NULL );
FILE *fsave = savename ? fopen( savename, "w" ) : NULL;
FILE *fsum = sumname ? fopen ( sumname, "a" ) : NULL;
particle_t *particles = (particle_t*) malloc( n * sizeof(particle_t) );
set_size( n ); // Calculate the size
init_particles( n, particles );
//
// simulate a number of time steps
//
double simulation_time = read_timer( );
// Here is a test for the "bin" struct
bin_t *bins = new bin_t[NUM_BINS];
init_bins(bins); // O(bins)
for(int i = 0; i < n; i ++) assign_particles_to_bin(particles[i], bins); // O(n)
for (int step = 0; step < NSTEPS; ++step)
{
navg = 0;
davg = 0.0;
dmin = 1.0;
/*
Compute forces, but notice only compute forces from neighboring bins
*/
for (int row = 0; row < BINS_PER_SIDE; ++row)
for (int col = 0; col < BINS_PER_SIDE; ++col)
compute_forces_for_bin(bins, row, col, &dmin, &davg, &navg);
for(int i = 0; i < n; i ++)
move(particles[i]);
// Determine the new bins of the particles
// Try just simply rebinning all the particles
init_bins(bins);
for (int i = 0; i < n; ++i)
assign_particles_to_bin(particles[i], bins);
if( find_option( argc, argv, "-no" ) == -1 )
{
//
// Computing statistical data
//
if (navg)
{
absavg += davg/navg;
nabsavg++;
}
if (dmin < absmin) absmin = dmin;
// `
// save if necessary
//
if( fsave && (step%SAVEFREQ) == 0 )
save( fsave, n, particles );
}
}
simulation_time = read_timer( ) - simulation_time;
printf( "n = %d, simulation time = %g seconds", n, simulation_time);
if( find_option( argc, argv, "-no" ) == -1 )
{
if (nabsavg) absavg /= nabsavg;
//
// -the minimum distance absmin between 2 particles during the run of the simulation
// -A Correct simulation will have particles stay at greater than 0.4 (of cutoff) with typical values between .7-.8
// -A simulation were particles don't interact correctly will be less than 0.4 (of cutoff) with typical values between .01-.05
//
// -The average distance absavg is ~.95 when most particles are interacting correctly and ~.66 when no particles are interacting
//
printf( ", absmin = %lf, absavg = %lf", absmin, absavg);
if (absmin < 0.4) printf ("\nThe minimum distance is below 0.4 meaning that some particle is not interacting");
if (absavg < 0.8) printf ("\nThe average distance is below 0.8 meaning that most particles are not interacting");
}
printf("\n");
//
// Printing summary data
//
if( fsum)
fprintf(fsum,"%d %g\n",n,simulation_time);
//
// Clearing space
//
if( fsum )
fclose( fsum );
free( particles );
if( fsave )
fclose( fsave );
return 0;
}