tnoflow BC at dynamic top wall if bc_top == 1 - 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 e5b95050497b410896ead7a91e9288ec8a91a236
(DIR) parent 2acbed5f2f251f9407971a685c64bbc5500a4678
(HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
Date: Mon, 12 Jan 2015 13:36:10 +0100
noflow BC at dynamic top wall if bc_top == 1
Diffstat:
M src/darcy.cuh | 22 ++++++++++++++++++++++
M src/device.cu | 15 +++++++++++++++
2 files changed, 37 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/src/darcy.cuh b/src/darcy.cuh
t@@ -698,6 +698,28 @@ __global__ void setDarcyTopWallPressure(
}
}
+// Enforce fixed-flow BC at top wall
+__global__ void setDarcyTopWallFixedFlow(
+ const unsigned int wall0_iz,
+ Float* __restrict__ dev_darcy_p)
+{
+ // 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;
+
+ // check that the thread is located at the top boundary
+ if (x < devC_grid.num[0] &&
+ y < devC_grid.num[1] &&
+ z == wall0_iz+1) {
+
+ // Write the new pressure the top boundary cells
+ __syncthreads();
+ const Float new_pressure = dev_darcy_p[idx(x,y,z-2)];
+ dev_darcy_p[idx(x,y,z)] = new_pressure;
+ }
+}
+
// Find the cell permeabilities from the Kozeny-Carman equation
__global__ void findDarcyPermeabilities(
(DIR) diff --git a/src/device.cu b/src/device.cu
t@@ -2021,6 +2021,21 @@ __host__ void DEM::startTime()
checkForCudaErrorsIter("Post updateDarcySolution",
iter);
+ if (darcy.bc_top == 1) {
+ if (PROFILING == 1)
+ startTimer(&kernel_tic);
+ setDarcyTopWallFixedFlow
+ <<<dimGridFluid, dimBlockFluid>>>
+ (wall0_iz, dev_darcy_p);
+ cudaThreadSynchronize();
+ if (PROFILING == 1)
+ stopTimer(&kernel_tic, &kernel_toc,
+ &kernel_elapsed,
+ &t_updateDarcySolution);
+ checkForCudaErrorsIter(
+ "Post setDarcyTopWallFixedFlow", iter);
+ }
+
// Copy new values to current values
if (PROFILING == 1)
startTimer(&kernel_tic);