ttesting pressure gradient force - 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 ea7d8aa29788bcbca20557265e50c4247dfc4a26
 (DIR) parent 48692b733e6e121ddf0f6bd984db99ee677ba2cb
 (HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
       Date:   Fri,  2 May 2014 13:14:46 +0200
       
       ttesting pressure gradient force
       
       Diffstat:
         M src/device.cu                       |       1 +
         M src/navierstokes.cuh                |      23 ++++++++++++++++++-----
         M tests/stokes_law.py                 |       2 +-
       
       3 files changed, 20 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/src/device.cu b/src/device.cu
       t@@ -884,6 +884,7 @@ __host__ void DEM::startTime()
                        applyParticleInteractionForce<<<dimGridFluid, dimBlockFluid>>>(
                                dev_ns_fi,
                                dev_ns_phi,
       +                        dev_ns_p,
                                dev_gridParticleIndex,
                                dev_cellStart,
                                dev_cellEnd,
 (DIR) diff --git a/src/navierstokes.cuh b/src/navierstokes.cuh
       t@@ -2632,6 +2632,7 @@ __global__ void findInteractionForce(
        __global__ void applyParticleInteractionForce(
                Float3* dev_ns_fi,                      // in
                Float*  dev_ns_phi,                     // in
       +        Float*  dev_ns_p,                     // in
                unsigned int* dev_gridParticleIndex,    // in
                unsigned int* dev_cellStart,            // in
                unsigned int* dev_cellEnd,              // in
       t@@ -2643,13 +2644,24 @@ __global__ void applyParticleInteractionForce(
            const unsigned int y = blockDim.y * blockIdx.y + threadIdx.y;
            const unsigned int z = blockDim.z * blockIdx.z + threadIdx.z;
        
       +    // Grid dimensions
       +    const unsigned int nx = devC_grid.num[0];
       +    const unsigned int ny = devC_grid.num[1];
       +    const unsigned int nz = devC_grid.num[2];
       +
       +    // Cell sizes
       +    const Float dx = devC_grid.L[0]/nx;
       +    const Float dy = devC_grid.L[1]/ny;
       +    const Float dz = devC_grid.L[2]/nz;
       +
            // Check that we are not outside the fluid grid
       -    if (x < devC_grid.num[0] && y < devC_grid.num[1] && z < devC_grid.num[2]) {
       +    if (x < nx && y < ny && z < nz) {
        
                const unsigned int cellidx = idx(x,y,z);
        
                __syncthreads();
                const Float3 fi = dev_ns_fi[cellidx];
       +        const Float3 grad_p = gradient(dev_ns_p, x, y, z, dx, dy, dz);
        
                // apply to all particle in the cell
                // Calculate linear cell ID
       t@@ -2675,10 +2687,11 @@ __global__ void applyParticleInteractionForce(
                        r = dev_x_sorted[i].w; // radius
                        //phi = dev_ns_phi[idx(x,y,z)];
        
       -                // this term could include the pressure gradient
       -                //fd = (-grad_p + fi/(1.0 - phi))*(4.0/3.0*M_PI*r*r*r);
       -                //fd = (fi/(1.0 - phi))*(4.0/3.0*M_PI*r*r*r);
       -                fd = fi*(4.0/3.0*M_PI*r*r*r);
       +                // stokes drag force
       +                //fd = fi*(4.0/3.0*M_PI*r*r*r);
       +
       +                    // pressure gradient force + stokes drag force
       +                    fd = (-1.0*grad_p + fi)*(4.0/3.0*M_PI*r*r*r);
        
                        __syncthreads();
                        dev_force[origidx] += MAKE_FLOAT4(fd.x, fd.y, fd.z, 0.0);
 (DIR) diff --git a/tests/stokes_law.py b/tests/stokes_law.py
       t@@ -31,7 +31,7 @@ orig.vel[0,2] = -0.1
        #orig.vel[0,2] = -0.001
        #orig.setBeta(0.5)
        orig.setTolerance(1.0e-4)
       -#orig.setDEMstepsPerCFDstep(100)
       +orig.setDEMstepsPerCFDstep(100)
        orig.run(dry=True)
        orig.run(verbose=True)
        py = sphere.sim(sid = orig.sid, fluid = True)