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();