Introduction
Introduction Statistics Contact Development Disclaimer Help
tBugfixes, however still segfaulting - sphere - GPU-based 3D discrete element m…
git clone git://src.adamsgaard.dk/sphere
Log
Files
Refs
LICENSE
---
commit c494a43f245cf27c2c498ce27636347fbbb1a909
parent 4dd89e58624d87a3e21691a162156b300334af33
Author: Anders Damsgaard <[email protected]>
Date: Wed, 31 Oct 2012 19:38:30 +0100
Bugfixes, however still segfaulting
Diffstat:
M src/device.cu | 66 +++++++++++++++++++++++++----…
M src/file_io.cpp | 32 ++---------------------------…
M src/main.cpp | 2 +-
M src/sphere.cpp | 129 ++++++++++++++++++++---------…
M src/sphere.h | 3 +++
5 files changed, 144 insertions(+), 88 deletions(-)
---
diff --git a/src/device.cu b/src/device.cu
t@@ -378,28 +378,70 @@ __host__ void DEM::transferToGlobalDeviceMemory()
__host__ void DEM::transferFromGlobalDeviceMemory()
{
- std::cout << " Transfering data to the device: ";
+ //std::cout << " Transfering data from the device: ";
- // Copy structure data from host to global device memory
- /*cudaMemcpy(&k, dev_k, sizeof(k), cudaMemcpyDeviceToHost);
- cudaMemcpy(&e, dev_e, sizeof(e), cudaMemcpyDeviceToHost);
- cudaMemcpy(&time, dev_time, sizeof(time), cudaMemcpyDeviceToHost);
- cudaMemcpy(&walls, dev_walls, sizeof(walls), cudaMemcpyDeviceToHost);*/
- cudaMemcpy(&k, dev_k, sizeof(Kinematics), cudaMemcpyDeviceToHost);
- cudaMemcpy(&e, dev_e, sizeof(Energies), cudaMemcpyDeviceToHost);
+ // Commonly-used memory sizes
+ unsigned int memSizeF = sizeof(Float) * np;
+ unsigned int memSizeF4 = sizeof(Float4) * np;
+
+ // Copy static-size structure data from host to global device memory
cudaMemcpy(&time, dev_time, sizeof(Time), cudaMemcpyDeviceToHost);
- cudaMemcpy(&walls, dev_walls, sizeof(Walls), cudaMemcpyDeviceToHost);
+
+ // Kinematic particle values
+ cudaMemcpy( k.x, dev_k->x,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.xysum, dev_k->xysum,
+ sizeof(Float2)*np, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.vel, dev_k->vel,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.acc, dev_k->acc,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.force, dev_k->force,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.angpos, dev_k->angpos,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.angvel, dev_k->angvel,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.angacc, dev_k->angacc,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.torque, dev_k->torque,
+ memSizeF4, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.contacts, dev_k->contacts,
+ sizeof(unsigned int)*np*NC, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.distmod, dev_k->distmod,
+ memSizeF4*NC, cudaMemcpyDeviceToHost);
+ cudaMemcpy( k.delta_t, dev_k->delta_t,
+ memSizeF4*NC, cudaMemcpyDeviceToHost);
+
+ // Individual particle energy values
+ cudaMemcpy( e.es_dot, dev_e->es_dot,
+ memSizeF, cudaMemcpyDeviceToHost);
+ cudaMemcpy( e.es, dev_e->es,
+ memSizeF, cudaMemcpyDeviceToHost);
+ cudaMemcpy( e.ev_dot, dev_e->ev_dot,
+ memSizeF, cudaMemcpyDeviceToHost);
+ cudaMemcpy( e.ev, dev_e->ev,
+ memSizeF, cudaMemcpyDeviceToHost);
+ cudaMemcpy( e.p, dev_e->p,
+ memSizeF, cudaMemcpyDeviceToHost);
+
+ // Wall parameters
+ cudaMemcpy( walls.wmode, dev_walls->wmode,
+ sizeof(int)*walls.nw, cudaMemcpyDeviceToHost);
+ cudaMemcpy( walls.nx, dev_walls->nx,
+ sizeof(Float4)*walls.nw, cudaMemcpyDeviceToHost);
+ cudaMemcpy( walls.mvfd, dev_walls->mvfd,
+ sizeof(Float4)*walls.nw, cudaMemcpyDeviceToHost);
+ cudaMemcpy( walls.force, dev_walls->force,
+ memSizeF*walls.nw, cudaMemcpyDeviceToHost);
checkForCudaErrors("End of transferFromGlobalDeviceMemory");
- if (verbose == 1)
- std::cout << "Done\n";
}
// Iterate through time by explicit time integration
__host__ void DEM::startTime()
{
-
using std::cout; // Namespace directive
std::string outfile;
char file[200];
diff --git a/src/file_io.cpp b/src/file_io.cpp
t@@ -44,10 +44,6 @@ void DEM::readbin(const char *target)
ifs.read(as_bytes(nd), sizeof(nd));
ifs.read(as_bytes(np), sizeof(np));
- if (verbose == 1) {
- cout << " - Number of dimensions: nd = " << nd << "\n"
- << " - Number of particles: np = " << np << "\n";
- }
if (nd != ND) {
cerr << "Dimensionality mismatch between dataset and this SPHERE program.\…
t@@ -58,20 +54,10 @@ void DEM::readbin(const char *target)
}
// Check precision choice
- if (verbose == 1)
- cout << " - Compiled for ";
- if (sizeof(Float) == sizeof(float)) {
- if (verbose == 1)
- cout << "single";
- } else if (sizeof(Float) == sizeof(double)) {
- if (verbose == 1)
- cout << "double";
- } else {
+ if (sizeof(Float) != sizeof(double) && sizeof(Float) != sizeof(float)) {
cerr << "Error! Chosen precision not available. Check datatypes.h\n";
exit(1);
}
- if (verbose == 1)
- cout << " precision\n";
// Read time parameters
ifs.read(as_bytes(time.dt), sizeof(time.dt));
t@@ -80,27 +66,13 @@ void DEM::readbin(const char *target)
ifs.read(as_bytes(time.file_dt), sizeof(time.file_dt));
ifs.read(as_bytes(time.step_count), sizeof(time.step_count));
- // Output display parameters to screen
- if (verbose == 1) {
- cout << " - Timestep length: time.dt = "
- << time.dt << " s\n"
- << " - Start at time: time.current = "
- << time.current << " s\n"
- << " - Total sim. time: time.total = "
- << time.total << " s\n"
- << " - File output interval: time.file_dt = "
- << time.file_dt << " s\n"
- << " - Start at step count: time.step_count = "
- << time.step_count << endl;
- }
-
// For spatial vectors an array of Float4 vectors is chosen for best fit wit…
// GPU memory handling. Vector variable structure: ( x, y, z, <empty>).
// Indexing starts from 0.
// Allocate host arrays
if (verbose == 1)
- cout << "\n Allocating host memory: ";
+ cout << " Allocating host memory: ";
// Allocate more host arrays
k.x = new Float4[np];
k.xysum = new Float2[np];
diff --git a/src/main.cpp b/src/main.cpp
t@@ -84,7 +84,7 @@ int main(const int argc, const char *argv[])
DEM dem(argvi, verbose, checkConstantVals, render);
// Start iterating through time, unless user chose to render image
- if (render != 0)
+ if (render == 0)
dem.startTime();
}
}
diff --git a/src/sphere.cpp b/src/sphere.cpp
t@@ -36,51 +36,10 @@ DEM::DEM(const std::string inputbin,
checkValues();
// Report data values
- if (verbose == 1) {
- if (params.contactmodel == 1)
- cout << " - Contact model: Linear-elastic-viscous (n), visco-frictional…
- else if (params.contactmodel == 2)
- cout << " - Contact model: Linear-elastic-visco-frictional\n";
- else if (params.contactmodel == 3)
- cout << " - Contact model: Nonlinear-elastic-visco-frictional\n";
- else {
- cerr << "Error: Contact model value not understood.\n";
- exit(1);
- }
-
- cout << " - Number of dynamic walls: " << walls.nw << '\n';
-
- if (grid.periodic == 1)
- cout << " - 1st and 2nd dim. boundaries: Periodic\n";
- else if (grid.periodic == 2)
- cout << " - 1st dim. boundaries: Visco-frictional walls\n";
- else
- cout << " - 1st and 2nd dim. boundaries: Visco-frictional walls\n";
-
- cout << " - Top BC: ";
- if (walls.wmode[0] == 0)
- cout << "Fixed\n";
- else if (walls.wmode[0] == 1)
- cout << "Deviatoric stress\n";
- else if (walls.wmode[0] == 2)
- cout << "Velocity\n";
- else {
- cerr << "Top BC not recognized!\n";
- exit(1);
- }
-
- cout << " - Grid: ";
- if (nd == 1)
- cout << grid.num[0];
- else if (nd == 2)
- cout << grid.num[0] << " * " << grid.num[1];
- else
- cout << grid.num[0] << " * "
- << grid.num[1] << " * "
- << grid.num[2];
- cout << " cells\n";
- }
-
+ if (verbose == 1)
+ reportValues();
+
+ // Write initial data to output/<sid>.output0.bin
writebin(("output/" + sid + ".output0.bin").c_str());
// Initialize CUDA
t@@ -192,3 +151,83 @@ void DEM::checkValues(void)
exit(1);
}
}
+
+// Report key parameter values to stdout
+void DEM::reportValues()
+{
+ using std::cout;
+ using std::cerr;
+ using std::endl;
+
+ cout << " - Number of dimensions: nd = " << nd << "\n"
+ << " - Number of particles: np = " << np << "\n";
+
+ // Check precision choice
+ cout << " - Compiled for ";
+ if (sizeof(Float) == sizeof(float)) {
+ if (verbose == 1)
+ cout << "single";
+ } else if (sizeof(Float) == sizeof(double)) {
+ if (verbose == 1)
+ cout << "double";
+ } else {
+ cerr << "Error! Chosen precision not available. Check datatypes.h\n";
+ exit(1);
+ }
+ cout << " precision\n";
+
+ cout << " - Timestep length: time.dt = "
+ << time.dt << " s\n"
+ << " - Start at time: time.current = "
+ << time.current << " s\n"
+ << " - Total sim. time: time.total = "
+ << time.total << " s\n"
+ << " - File output interval: time.file_dt = "
+ << time.file_dt << " s\n"
+ << " - Start at step count: time.step_count = "
+ << time.step_count << endl;
+
+ if (params.contactmodel == 1)
+ cout << " - Contact model: Linear-elastic-viscous (n), visco-frictional (…
+ else if (params.contactmodel == 2)
+ cout << " - Contact model: Linear-elastic-visco-frictional\n";
+ else if (params.contactmodel == 3)
+ cout << " - Contact model: Nonlinear-elastic-visco-frictional\n";
+ else {
+ cerr << "Error: Contact model value not understood.\n";
+ exit(1);
+ }
+
+ cout << " - Number of dynamic walls: " << walls.nw << '\n';
+
+ if (grid.periodic == 1)
+ cout << " - 1st and 2nd dim. boundaries: Periodic\n";
+ else if (grid.periodic == 2)
+ cout << " - 1st dim. boundaries: Visco-frictional walls\n";
+ else
+ cout << " - 1st and 2nd dim. boundaries: Visco-frictional walls\n";
+
+ cout << " - Top BC: ";
+ if (walls.wmode[0] == 0)
+ cout << "Fixed\n";
+ else if (walls.wmode[0] == 1)
+ cout << "Deviatoric stress\n";
+ else if (walls.wmode[0] == 2)
+ cout << "Velocity\n";
+ else {
+ cerr << "Top BC not recognized!\n";
+ exit(1);
+ }
+
+ cout << " - Grid: ";
+ if (nd == 1)
+ cout << grid.num[0];
+ else if (nd == 2)
+ cout << grid.num[0] << " * " << grid.num[1];
+ else
+ cout << grid.num[0] << " * "
+ << grid.num[1] << " * "
+ << grid.num[2];
+ cout << " cells\n";
+}
+
diff --git a/src/sphere.h b/src/sphere.h
t@@ -93,6 +93,9 @@ class DEM {
// Check numeric values of selected parameters
void checkValues(void);
+ // Report key parameter values to stdout
+ void reportValues(void);
+
// Iterate through time, using temporal limits
// described in "time" struct.
void startTime(void);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.