tRemoved NC error reporting, an error exception system is needed - sphere - GPU-based 3D discrete element method algorithm with optional fluid coupling
(HTM) git clone git://src.adamsgaard.dk/sphere
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit 72e8a2458f7da3e8d00b2476c966715afa57fef7
(DIR) parent 377088874c49108d71af8048d568abb87baebd83
(HTM) Author: Anders Damsgaard <adc@geo.au.dk>
Date: Wed, 10 Oct 2012 11:02:59 +0200
Removed NC error reporting, an error exception system is needed
Diffstat:
M src/contactsearch.cuh | 25 +++++++++----------------
M src/datatypes.h | 4 ++--
M src/device.cu | 17 ++++++++---------
3 files changed, 19 insertions(+), 27 deletions(-)
---
(DIR) diff --git a/src/contactsearch.cuh b/src/contactsearch.cuh
t@@ -179,7 +179,7 @@ __device__ void findAndProcessContactsInCell(int3 targetCell,
// Used for shearmodel=2, where bookkeeping of contact history is necessary.
// Kernel executed on device, and callable from device only.
// Function is called from topology().
-__device__ int findContactsInCell(int3 targetCell,
+__device__ void findContactsInCell(int3 targetCell,
unsigned int idx_a,
Float4 x_a, Float radius_a,
Float4* dev_x_sorted,
t@@ -223,6 +223,7 @@ __device__ int findContactsInCell(int3 targetCell,
for (unsigned int idx_b = startIdx; idx_b<endIdx; ++idx_b) {
if (idx_b != idx_a) { // Do not collide particle with itself
+
// Fetch position and radius of particle B.
Float4 x_b = dev_x_sorted[idx_b];
Float radius_b = dev_radius_sorted[idx_b];
t@@ -275,11 +276,12 @@ __device__ int findContactsInCell(int3 targetCell,
// Increment contact counter
++*nc;
-
+
// Check if the number of contacts of particle A
// exceeds the max. number of contacts per particle
- if (*nc >= NC)
- return 1;
+ if (*nc > devC_nc)
+ return; // I would like to throw an error, but it doesn't seem possible...
+
}
// Write the inter-particle position vector correction and radius of particle B
t@@ -300,9 +302,6 @@ __device__ int findContactsInCell(int3 targetCell,
} // Do not collide particle with itself end
} // Iterate over cell particles end
} // Check wether cell is empty end
-
- // Return without errors
- return 0;
} // End of findContactsInCell(...)
t@@ -310,7 +309,7 @@ __device__ int findContactsInCell(int3 targetCell,
// Search for neighbors to particle 'idx' inside the 27 closest cells,
// and save the contact pairs in global memory.
// Function is called from mainGPU loop.
-__global__ int topology(unsigned int* dev_cellStart,
+__global__ void topology(unsigned int* dev_cellStart,
unsigned int* dev_cellEnd, // Input: Particles in cell
unsigned int* dev_gridParticleIndex, // Input: Unsorted-sorted key
Float4* dev_x_sorted, Float* dev_radius_sorted,
t@@ -326,7 +325,6 @@ __global__ int topology(unsigned int* dev_cellStart,
// Count the number of contacts in this time step
int nc = 0;
- int status = 0;
// Grid position of host and neighbor cells in uniform, cubic grid
int3 gridPos;
t@@ -343,20 +341,15 @@ __global__ int topology(unsigned int* dev_cellStart,
for (int y_dim=-1; y_dim<2; ++y_dim) { // y-axis
for (int x_dim=-1; x_dim<2; ++x_dim) { // x-axis
targetPos = gridPos + make_int3(x_dim, y_dim, z_dim);
- if (findContactsInCell(targetPos, idx_a, x_a, radius_a,
+ findContactsInCell(targetPos, idx_a, x_a, radius_a,
dev_x_sorted, dev_radius_sorted,
dev_cellStart, dev_cellEnd,
dev_gridParticleIndex,
- &nc, dev_contacts, dev_distmod) == 1)
- status = 1;
+ &nc, dev_contacts, dev_distmod);
}
}
}
}
-
- // Returns 0 if no particles have more contacts than allowed,
- // and 1 otherwise
- return status;
} // End of topology(...)
(DIR) diff --git a/src/datatypes.h b/src/datatypes.h
t@@ -60,8 +60,8 @@ const unsigned int ND = 3;
const Float VERS = 0.25;
// Max. number of contacts per particle
-//#define NC 16
-#define NC 32
+//const char NC = 16;
+const char NC = 32;
///////////////////////////
(DIR) diff --git a/src/device.cu b/src/device.cu
t@@ -484,16 +484,15 @@ __host__ void gpuMain(Float4* host_x,
// For each particle: Search contacts in neighbor cells
if (PROFILING == 1)
startTimer(&kernel_tic);
- if(topology<<<dimGrid, dimBlock>>>(dev_cellStart,
- dev_cellEnd,
- dev_gridParticleIndex,
- dev_x_sorted,
- dev_radius_sorted,
- dev_contacts,
- dev_distmod) == 1) {
+ topology<<<dimGrid, dimBlock>>>(dev_cellStart,
+ dev_cellEnd,
+ dev_gridParticleIndex,
+ dev_x_sorted,
+ dev_radius_sorted,
+ dev_contacts,
+ dev_distmod);
std::cerr << "Warning! One or more particles have more contacts than allowed.\n"
- << "Raise NC in datatypes.h to accomodate.\n"
- }
+ << "Raise NC in datatypes.h to accomodate.\n";
// Empty cuPrintf() buffer to console
//cudaThreadSynchronize();