tMerge branch 'master' of github.com:anders-dc/sphere - 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 de5a49343d0628cabc393a22841501d2666073af
(DIR) parent 03437c82b542d8cf41ae59bad59dc5e405ceee52
(HTM) Author: Anders Damsgaard Christensen <adc@geo.au.dk>
Date: Tue, 20 Sep 2016 09:57:20 -0700
Merge branch 'master' of github.com:anders-dc/sphere
Diffstat:
M src/darcy.cuh | 36 ++++++++++++++++++++++++++++++-
M src/device.cu | 11 +++++++++++
2 files changed, 46 insertions(+), 1 deletion(-)
---
(DIR) diff --git a/src/darcy.cuh b/src/darcy.cuh
t@@ -761,7 +761,7 @@ __global__ void copyDarcyPorositiesToEdges(
// Copy the porosity, porosity change, div_v_p and vp_avg values to the grid
-// edges from the grid interior at the frictionless Y boundaries (grid.periodic
+// bottom from the grid interior at the frictionless Y boundaries (grid.periodic
// == 2).
__global__ void copyDarcyPorositiesToBottom(
Float* __restrict__ dev_darcy_phi, // in + out
t@@ -794,6 +794,40 @@ __global__ void copyDarcyPorositiesToBottom(
}
+// Copy the porosity, porosity change, div_v_p and vp_avg values to the grid top
+// from the grid interior if the grid is adaptive (grid.adaptive == 1).
+__global__ void copyDarcyPorositiesToTop(
+ Float* __restrict__ dev_darcy_phi, // in + out
+ Float* __restrict__ dev_darcy_dphi, // in + out
+ Float* __restrict__ dev_darcy_div_v_p, // in + out
+ Float3* __restrict__ dev_darcy_vp_avg) // in + out
+{
+ // 3D thread index
+ const unsigned int x = blockDim.x * blockIdx.x + threadIdx.x;
+ 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];
+
+ // check that we are not outside the fluid grid
+ if (devC_grid.adaptive == 1 &&
+ x < nx && y < ny && z == nz - 1) {
+
+ const unsigned int readidx = d_idx(x, y, nz - 2);
+ const unsigned int writeidx = d_idx(x, y, z);
+
+ __syncthreads();
+ dev_darcy_phi[writeidx] = dev_darcy_phi[readidx];
+ dev_darcy_dphi[writeidx] = dev_darcy_dphi[readidx];
+ dev_darcy_div_v_p[writeidx] = dev_darcy_div_v_p[readidx];
+ dev_darcy_vp_avg[writeidx] = dev_darcy_vp_avg[readidx];
+ }
+}
+
+
// Find the porosity in each cell on the base of a sphere, centered at the cell
// center.
__global__ void findDarcyPorosities(
(DIR) diff --git a/src/device.cu b/src/device.cu
t@@ -2037,6 +2037,17 @@ __host__ void DEM::startTime()
cudaThreadSynchronize();
}
+ // copy porosities to the frictionless lower Z boundary
+ if (grid.adaptive == 1) {
+ copyDarcyPorositiesToTop<<<dimGridFluid,
+ dimBlockFluid>>>(
+ dev_darcy_phi,
+ dev_darcy_dphi,
+ dev_darcy_div_v_p,
+ dev_darcy_vp_avg);
+ cudaThreadSynchronize();
+ }
+
// Modulate the pressures at the upper boundary cells
if ((darcy.p_mod_A > 1.0e-5 || darcy.p_mod_A < -1.0e-5) &&
darcy.p_mod_f > 1.0e-7) {