CellGPU
0.8.0
GPU-accelerated simulations of cells
|
CUDA kernels and callers for 2D vertex models. More...
Functions | |
bool | gpu_vm_geometry (Dscalar2 *d_vertexPositions, int *d_cellVertexNum, int *d_cellVertices, int *d_vertexCellNeighbors, Dscalar2 *d_voroCur, Dscalar4 *d_voroLastNext, Dscalar2 *d_AreaPerimeter, int N, Index2D &n_idx, gpubox &Box) |
Call the kernel to calculate the area and perimeter of each cell. | |
bool | gpu_vm_get_cell_positions (Dscalar2 *d_cellPositions, Dscalar2 *d_vertexPositions, int *d_cellVertexNum, int *d_cellVertices, int N, Index2D &n_idx, gpubox &Box) |
Call the kernel to calculate the position of each cell from the position of its vertices. | |
bool | gpu_vm_test_edges_for_T1 (Dscalar2 *d_vertexPositions, int *d_vertexNeighbors, int *d_vertexEdgeFlips, int *d_vertexCellNeighbors, int *d_cellVertexNum, int *d_cellVertices, gpubox &Box, Dscalar T1THRESHOLD, int Nvertices, int vertexMax, int *d_grow, Index2D &n_idx) |
Call the kernel to test every edge for a T1 event, see if vertexMax needs to increase. | |
bool | gpu_vm_parse_multiple_flips (int *d_vertexEdgeFlips, int *d_vertexEdgeFlipsCurrent, int *d_vertexNeighbors, int *d_vertexCellNeighbors, int *d_cellVertexNum, int *d_cellVertices, int *d_finishedFlippingEdges, int *d_cellEdgeFlips, int4 *d_cellSets, Index2D &n_idx, int Ncells) |
determine whether any edges need to be flipped, and if we need to loop through the flipping routine, writing to d_finishedFlippingEdges the current state | |
bool | gpu_vm_flip_edges (int *d_vertexEdgeFlipsCurrent, Dscalar2 *d_vertexPositions, int *d_vertexNeighbors, int *d_vertexCellNeighbors, int *d_cellVertexNum, int *d_cellVertices, int *d_cellEdgeFlips, int4 *d_cellSets, gpubox &Box, Index2D &n_idx, int Nvertices, int Ncells) |
Call the kernel to flip at most one edge per cell, write to d_finishedFlippingEdges the current state. | |
bool | gpu_avm_force_sets (int *d_vertexCellNeighbors, Dscalar2 *d_voroCur, Dscalar4 *d_voroLastNext, Dscalar2 *d_AreaPerimeter, Dscalar2 *d_AreaPerimeterPreferences, Dscalar2 *d_vertexForceSets, int nForceSets, Dscalar KA, Dscalar KP) |
Call the kernel to calculate force sets. | |
bool | gpu_avm_sum_force_sets (Dscalar2 *d_vertexForceSets, Dscalar2 *d_vertexForces, int Nvertices) |
Call the kernel to sum up the force sets to get net force on each vertex. | |
__global__ void | vm_geometry_kernel (const Dscalar2 *__restrict__ d_vertexPositions, const int *__restrict__ d_cellVertexNum, const int *__restrict__ d_cellVertices, const int *__restrict__ d_vertexCellNeighbors, Dscalar2 *__restrict__ d_voroCur, Dscalar4 *__restrict__ d_voroLastNext, Dscalar2 *__restrict__ d_AreaPerimeter, int N, Index2D n_idx, gpubox Box) |
__global__ void | vm_get_cell_positions_kernel (Dscalar2 *d_cellPositions, Dscalar2 *d_vertexPositions, int *d_nn, int *d_n, int N, Index2D n_idx, gpubox Box) |
__global__ void | vm_simple_T1_test_kernel (Dscalar2 *d_vertexPositions, int *d_vertexNeighbors, int *d_vertexEdgeFlips, int *d_vertexCellNeighbors, int *d_cellVertexNum, gpubox Box, Dscalar T1THRESHOLD, int NvTimes3, int vertexMax, int *d_grow) |
__global__ void | vm_one_T1_per_cell_per_vertex_kernel (int *__restrict__ d_vertexEdgeFlips, int *__restrict__ d_vertexEdgeFlipsCurrent, const int *__restrict__ d_vertexNeighbors, const int *__restrict__ d_vertexCellNeighbors, const int *__restrict__ d_cellVertexNum, const int *__restrict__ d_cellVertices, int *d_finishedFlippingEdges, int *d_cellEdgeFlips, int4 *d_cellSets, Index2D n_idx, int Ncells) |
__global__ void | vm_flip_edges_kernel (int *d_vertexEdgeFlipsCurrent, Dscalar2 *d_vertexPositions, int *d_vertexNeighbors, int *d_vertexCellNeighbors, int *d_cellVertexNum, int *d_cellVertices, int *d_cellEdgeFlips, int4 *d_cellSets, gpubox Box, Index2D n_idx, int NvTimes3) |
__global__ void | avm_force_sets_kernel (int *d_vertexCellNeighbors, Dscalar2 *d_voroCur, Dscalar4 *d_voroLastNext, Dscalar2 *d_AreaPerimeter, Dscalar2 *d_AreaPerimeterPreferences, Dscalar2 *d_vertexForceSets, int nForceSets, Dscalar KA, Dscalar KP) |
__global__ void | avm_sum_force_sets_kernel (Dscalar2 *d_vertexForceSets, Dscalar2 *d_vertexForces, int N) |
CUDA kernels and callers for 2D vertex models.
__global__ void vm_geometry_kernel | ( | const Dscalar2 *__restrict__ | d_vertexPositions, |
const int *__restrict__ | d_cellVertexNum, | ||
const int *__restrict__ | d_cellVertices, | ||
const int *__restrict__ | d_vertexCellNeighbors, | ||
Dscalar2 *__restrict__ | d_voroCur, | ||
Dscalar4 *__restrict__ | d_voroLastNext, | ||
Dscalar2 *__restrict__ | d_AreaPerimeter, | ||
int | N, | ||
Index2D | n_idx, | ||
gpubox | Box | ||
) |
Since the cells are NOT guaranteed to be convex, the area of the cell must take into account any self-intersections. The strategy is the same as in the CPU branch.
__global__ void vm_get_cell_positions_kernel | ( | Dscalar2 * | d_cellPositions, |
Dscalar2 * | d_vertexPositions, | ||
int * | d_nn, | ||
int * | d_n, | ||
int | N, | ||
Index2D | n_idx, | ||
gpubox | Box | ||
) |
This function is being deprecated, but is still useful for calculating, e.g. the mean-squared displacement of the cells without transferring data back to the host
__global__ void vm_simple_T1_test_kernel | ( | Dscalar2 * | d_vertexPositions, |
int * | d_vertexNeighbors, | ||
int * | d_vertexEdgeFlips, | ||
int * | d_vertexCellNeighbors, | ||
int * | d_cellVertexNum, | ||
gpubox | Box, | ||
Dscalar | T1THRESHOLD, | ||
int | NvTimes3, | ||
int | vertexMax, | ||
int * | d_grow | ||
) |
Run through every pair of vertices (once), see if any T1 transitions should be done, and see if the cell-vertex list needs to grow
__global__ void vm_one_T1_per_cell_per_vertex_kernel | ( | int *__restrict__ | d_vertexEdgeFlips, |
int *__restrict__ | d_vertexEdgeFlipsCurrent, | ||
const int *__restrict__ | d_vertexNeighbors, | ||
const int *__restrict__ | d_vertexCellNeighbors, | ||
const int *__restrict__ | d_cellVertexNum, | ||
const int *__restrict__ | d_cellVertices, | ||
int * | d_finishedFlippingEdges, | ||
int * | d_cellEdgeFlips, | ||
int4 * | d_cellSets, | ||
Index2D | n_idx, | ||
int | Ncells | ||
) |
There will be severe topology mismatches if a cell is involved in more than one T1 transition simultaneously (due to incoherent updates of the cellVertices structure). So, go through the current list of edges that are marked to take part in a T1 transition and select one edge per cell to be flipped on this trip through the functions.
__global__ void vm_flip_edges_kernel | ( | int * | d_vertexEdgeFlipsCurrent, |
Dscalar2 * | d_vertexPositions, | ||
int * | d_vertexNeighbors, | ||
int * | d_vertexCellNeighbors, | ||
int * | d_cellVertexNum, | ||
int * | d_cellVertices, | ||
int * | d_cellEdgeFlips, | ||
int4 * | d_cellSets, | ||
gpubox | Box, | ||
Index2D | n_idx, | ||
int | NvTimes3 | ||
) |
Flip any edge labeled for re-wiring in the vertexEdgeFlipsCurrent list
__global__ void avm_force_sets_kernel | ( | int * | d_vertexCellNeighbors, |
Dscalar2 * | d_voroCur, | ||
Dscalar4 * | d_voroLastNext, | ||
Dscalar2 * | d_AreaPerimeter, | ||
Dscalar2 * | d_AreaPerimeterPreferences, | ||
Dscalar2 * | d_vertexForceSets, | ||
int | nForceSets, | ||
Dscalar | KA, | ||
Dscalar | KP | ||
) |
The force on a vertex has a contribution from how moving that vertex affects each of the neighboring cells...compute those force sets
__global__ void avm_sum_force_sets_kernel | ( | Dscalar2 * | d_vertexForceSets, |
Dscalar2 * | d_vertexForces, | ||
int | N | ||
) |
the force on a vertex is decomposable into the force contribution from each of its voronoi vertices... add 'em up!