tChanged error return method and added precision reporting - sphere - GPU-based 3D discrete element method algorithm with optional fluid coupling
HTML git clone git://src.adamsgaard.dk/sphere
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
DIR commit 46fe3e5726678846b72692a15f0c2abea5ff1bf9
DIR parent d9c25987416182f283d170f16d97a4afa5685f41
HTML Author: Anders Damsgaard <adc@geo.au.dk>
Date: Thu, 23 Aug 2012 10:17:48 +0200
Changed error return method and added precision reporting
Diffstat:
M src/main.cpp | 147 +++++++++++++++++--------------
1 file changed, 80 insertions(+), 67 deletions(-)
---
DIR diff --git a/src/main.cpp b/src/main.cpp
t@@ -31,6 +31,7 @@ int main(int argc, char *argv[])
{
// Namespace declarations
using std::cout;
+ using std::cerr;
// LOCAL VARIABLE DECLARATIONS
if(!argv[1] || argc != 2) {
t@@ -88,14 +89,14 @@ int main(int argc, char *argv[])
if ((fp = fopen(file,"rb")) == NULL) {
cout << "Could not read input binary file " << cwd << "/input/"
<< inputbin << ".bin. Bye.\n";
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
}
// Read the number of dimensions and particles
if (fread(&grid.nd, sizeof(grid.nd), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
if (fread(&p.np, sizeof(p.np), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
cout << " - Number of dimensions: grid.nd = " << grid.nd << "\n"
<< " - Number of particles: p.np = " << p.np << "\n";
t@@ -104,20 +105,32 @@ int main(int argc, char *argv[])
<< "The dataset is " << grid.nd
<< "D, this SPHERE binary is " << ND << "D.\n"
<< "This execution is terminating.\n";
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
}
+ // Report precision choice
+ cout << " - Compiled for ";
+ if (sizeof(Float) == sizeof(float))
+ cout << "single";
+ else if (sizeof(Float) == sizeof(double))
+ cout << "double";
+ else {
+ cerr << "Error! Chosen precision not available. Check datatypes.h\n";
+ exit(1);
+ }
+ cout << " precision\n";
+
// Read time parameters
if (fread(&time.dt, sizeof(time.dt), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
if (fread(&time.current, sizeof(time.current), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&time.total, sizeof(time.total), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&time.file_dt, sizeof(time.file_dt), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&time.step_count, sizeof(time.step_count), 1, fp) != 1)
- return 1;
+ exit(1);
// Copy timestep length to constant memory structure
//time.dt *= 10; // For debugging: Increase timestep one magnitude
t@@ -182,108 +195,108 @@ int main(int argc, char *argv[])
// Read remaining data from input binary
for (i=0; i<ND; ++i) {
if (fread(&grid.origo[i], sizeof(grid.origo[i]), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
}
for (i=0; i<ND; ++i) {
if (fread(&grid.L[i], sizeof(grid.L[i]), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
}
for (i=0; i<ND; ++i) {
if (fread(&grid.num[i], sizeof(grid.num[i]), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
}
for (j=0; j<p.np; ++j) {
if (fread(&host_x[j].x, sizeof(Float), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
if (fread(&host_vel[j].x, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_angvel[j].x, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_force[j].x, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_torque[j].x, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_x[j].y, sizeof(Float), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
if (fread(&host_vel[j].y, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_angvel[j].y, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_force[j].y, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_torque[j].y, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_x[j].z, sizeof(Float), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
if (fread(&host_vel[j].z, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_angvel[j].z, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_force[j].z, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_torque[j].z, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
}
for (j=0; j<p.np; ++j) {
if (fread(&host_vel[j].w, sizeof(Float), 1, fp) != 1) // Fixvel
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
if (fread(&host_x[j].w, sizeof(Float), 1, fp) != 1) // xsum
- return 1;
+ exit(1);
if (fread(&p.radius[j], sizeof(p.radius[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.rho[j], sizeof(p.rho[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.k_n[j], sizeof(p.k_n[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.k_s[j], sizeof(p.k_s[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.k_r[j], sizeof(p.k_r[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.gamma_n[j], sizeof(p.gamma_n[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.gamma_s[j], sizeof(p.gamma_s[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.gamma_r[j], sizeof(p.gamma_r[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.mu_s[j], sizeof(p.mu_s[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.mu_d[j], sizeof(p.mu_d[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.mu_r[j], sizeof(p.mu_r[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.es_dot[j], sizeof(p.es_dot[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.es[j], sizeof(p.es[j]), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&p.p[j], sizeof(p.p[j]), 1, fp) != 1)
- return 1;
+ exit(1);
}
if (fread(¶ms.global, sizeof(params.global), 1, fp) != 1)
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
for (i=0; i<ND; ++i) {
if (fread(¶ms.g[i], sizeof(params.g[i]), 1, fp) != 1)
- return 1;
+ exit(1);
}
if (fread(¶ms.kappa, sizeof(params.kappa), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(¶ms.db, sizeof(params.db), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(¶ms.V_b, sizeof(params.V_b), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(¶ms.shearmodel, sizeof(params.shearmodel), 1, fp) != 1)
- return 1;
+ exit(1);
// Number of dynamic walls
if (fread(¶ms.nw, sizeof(params.nw), 1, fp) != 1)
- return 1;
+ exit(1);
// Allocate host memory for walls
// Wall normal (x,y,z), w: wall position on axis parallel to wall normal
t@@ -295,33 +308,33 @@ int main(int argc, char *argv[])
for (j=0; j<params.nw; ++j) {
// Wall normal, x-dimension
if (fread(&host_w_nx[j].x, sizeof(Float), 1, fp) != 1) // Read in single precision
- return 1;
+ exit(1);
// Wall normal, y-dimension
if (fread(&host_w_nx[j].y, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
// Wall normal, z-dimension
if (fread(&host_w_nx[j].z, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
// Wall position along axis parallel to wall normal
if (fread(&host_w_nx[j].w, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
// Wall mass
if (fread(&host_w_mvfd[j].x, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
// Wall velocity along axis parallel to wall normal
if (fread(&host_w_mvfd[j].y, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
// Wall force along axis parallel to wall normal
if (fread(&host_w_mvfd[j].z, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
// Wall deviatoric stress
if (fread(&host_w_mvfd[j].w, sizeof(Float), 1, fp) != 1)
- return 1;
+ exit(1);
}
// x- and y boundary behavior.
// 0: walls, 1: periodic boundaries, 2: x boundary periodic, y frictional walls
t@@ -332,22 +345,22 @@ int main(int argc, char *argv[])
// Wall viscosities
if (fread(¶ms.gamma_wn, sizeof(params.gamma_wn), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(¶ms.gamma_ws, sizeof(params.gamma_ws), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(¶ms.gamma_wr, sizeof(params.gamma_wr), 1, fp) != 1)
- return 1;
+ exit(1);
for (i=0; i<p.np; ++i) {
if (fread(&host_bonds[i].x, sizeof(unsigned int), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_bonds[i].y, sizeof(unsigned int), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_bonds[i].z, sizeof(unsigned int), 1, fp) != 1)
- return 1;
+ exit(1);
if (fread(&host_bonds[i].w, sizeof(unsigned int), 1, fp) != 1)
- return 1;
+ exit(1);
}
fclose(fp);
t@@ -384,10 +397,10 @@ int main(int argc, char *argv[])
<< grid.num[2] << " (z) = "
<< grid.num[0]*grid.num[1]*grid.num[2] << " cells\n";
} else {
- cout << "\nError; the number of dimensions must be 1, 2 or 3, and was\n"
+ cerr << "\nError; the number of dimensions must be 1, 2 or 3, and was\n"
<< "defined as " << grid.nd << ". This SPHERE binary was compiled for "
<< ND << "D. Bye!\n";
- return 1; // Return unsuccessful exit status
+ exit(1); // Return unsuccessful exit status
}
// For debugging purposes: Print data to terminal