timplement first attempt at adaptive meshing - 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 5adc4fde4fddd30f5591249a497353c17665df1b
(DIR) parent de8f4eb1433514d7729abe95e9e1367161bb1ef6
(HTM) Author: Anders Damsgaard Christensen <adc@geo.au.dk>
Date: Fri, 2 Sep 2016 15:39:29 -0700
implement first attempt at adaptive meshing
Diffstat:
M src/datatypes.h | 1 +
M src/device.cu | 25 +++++++++++++++++++++++++
M src/sphere.h | 3 +++
3 files changed, 29 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/src/datatypes.h b/src/datatypes.h
t@@ -47,6 +47,7 @@ struct Grid {
Float L[ND]; // World dimensions
unsigned int num[ND]; // Neighbor-search cells along each axis
int periodic; // Behavior of boundaries at 1st and 2nd world edge
+ int adaptive; // Continuously rescale grid size to wall positions
};
struct Sorting {
(DIR) diff --git a/src/device.cu b/src/device.cu
t@@ -348,6 +348,25 @@ __host__ void DEM::transferToConstantDeviceMemory()
checkConstantMemory();
}
+__host__ void DEM::updateGridSize()
+{
+ Float Lz;
+
+ // Get top wall position from dev_walls_nx[0].z
+ cudaMemcpy(&Lz, &dev_walls_nx[0].z, sizeof(Float), cudaMemcpyDeviceToHost);
+
+ // Write value to grid.L[2]
+ grid.L[2] = Lz;
+
+ // Write value to devC_grid.L[2]
+ cudaMemcpyToSymbol(devC_grid.L[2], &Lz, sizeof(Float));
+
+ checkForCudaErrors("After updating grid size");
+
+ // check value only during debugging
+ checkConstantMemory();
+}
+
// Allocate device memory for particle variables,
// tied to previously declared pointers in structures
t@@ -999,6 +1018,12 @@ __host__ void DEM::startTime()
checkForCudaErrorsIter("Post checkParticlePositions", iter);
#endif
+ // If the grid is adaptive, readjust the grid height to equal the
+ // positions of the dynamic walls
+ if (grid.adaptive == 1) {
+ updateGridSize();
+ }
+
// For each particle:
// Compute hash key (cell index) from position
// in the fine, uniform and homogenous grid.
(DIR) diff --git a/src/sphere.h b/src/sphere.h
t@@ -138,6 +138,9 @@ class DEM {
const float imgw,
const float focalLength);
+ // Adjust grid size according to wall placement
+ void updateGridSize();
+
// Allocate global device memory to hold data
void allocateGlobalDeviceMemory();
void rt_allocateGlobalDeviceMemory();