38 dccrg::Dccrg<spatial_cell::SpatialCell,dccrg::Cartesian_Geometry>& mpiGrid,
39 const vector<CellID>& cells,
42 const uint nCells = cells.size();
47 std::cerr<<
"ERROR: too many cells ("<<nCells<<
") passed to GPU batch operations! Please use more GPUs / MPI tasks."<<std::endl;
56 phiprof::Timer mallocTimer {
"allocate buffers for content list analysis"};
67 phiprof::Timer sparsityTimer {
"update Sparsity values, apply memory reservations"};
68 size_t largestSizePower = 0;
69 size_t largestVelMesh = 0;
72 size_t threadLargestVelMesh = 0;
73 size_t threadLargestSizePower = 0;
75 #pragma omp for schedule(dynamic)
76 for (uint
i=0;
i<nCells; ++
i) {
77 SC = mpiGrid[cells[
i]];
83 const size_t mySize =
vmesh->size();
97 threadLargestVelMesh = std::max(threadLargestVelMesh, mySize);
98 threadLargestSizePower = std::max(threadLargestSizePower, (
size_t)SC->
vbwcl_sizePower);
99 threadLargestSizePower = std::max(threadLargestSizePower, (
size_t)SC->
vbwncl_sizePower);
103 largestVelMesh = std::max(threadLargestVelMesh, largestVelMesh);
104 largestSizePower = std::max(threadLargestSizePower, largestSizePower);
107 sparsityTimer.stop();
109 phiprof::Timer copyTimer {
"copy values to device"};
111 CHK_ERR(
gpuMemcpyAsync(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*), dev_allMaps),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*), host_allMaps), 2*nCells*
sizeof(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*),
gpuMemcpyHostToDevice, baseStream) );
123 phiprof::Timer clearTimer {
"clear all content maps"};
129 phiprof::Timer blockKernelTimer {
"update content lists kernel"};
130 const dim3 grid2(largestVelMesh,nCells,1);
131 batch_update_velocity_block_content_lists_kernel<<<grid2, WID3, 0, baseStream>>> (
141 blockKernelTimer.stop();
144 phiprof::Timer extractKeysTimer {
"extract content keys"};
146 __device__(
const Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID> *map,
147 const Hashinator::hash_pair<vmesh::GlobalID, vmesh::LocalID>& kval,
154 return ( (kval.first != emptybucket) &&( kval.first != tombstone) );
169 extractKeysTimer.stop();
172 phiprof::Timer blocklistTimer {
"update content lists extract"};
175 #pragma omp parallel for schedule(static)
176 for (uint
i=0;
i<nCells; ++
i) {
180 blocklistTimer.stop();
185 dccrg::Dccrg<spatial_cell::SpatialCell,dccrg::Cartesian_Geometry>& mpiGrid,
186 const vector<CellID>& cellsToAdjust,
190 int adjustPreId {phiprof::initializeTimer(
"Adjusting blocks Pre")};
191 int adjustId {phiprof::initializeTimer(
"Adjusting blocks")};
192 int cleanupId {phiprof::initializeTimer(
"Hashmap cleanup")};
193 int adjustPostId {phiprof::initializeTimer(
"Adjusting blocks Post")};
196 const uint nCells = cellsToAdjust.size();
198 if (nCells > 65535) {
199 std::cerr<<
"ERROR: too many cells ("<<nCells<<
") passed to GPU batch operations! Please use more GPUs / MPI tasks."<<std::endl;
209 phiprof::Timer mallocTimer {
"allocate buffers for content list analysis"};
212 size_t maxNeighbors = 0;
213 size_t largestContentList = 0;
214 size_t largestContentListNeighbors = 0;
218 size_t threadMaxNeighbors = 0;
219 size_t threadLargestContentList = 0;
220 size_t threadLargestContentListNeighbors = 0;
221 #pragma omp for schedule(dynamic)
222 for (
size_t i=0;
i<nCells; ++
i) {
223 CellID cell_id = cellsToAdjust[
i];
229 size_t cellLargestContentListNeighbors = 0;
230 std::unordered_set<CellID> uniqueNeighbors;
233 for (
const auto& [neighbor_id, dir] : *neighbors) {
234 cellLargestContentListNeighbors = std::max(cellLargestContentListNeighbors, (
size_t)(mpiGrid[neighbor_id]->velocity_block_with_content_list_size));
235 if (neighbor_id != cell_id) {
236 uniqueNeighbors.insert(neighbor_id);
240 reservationSize = std::max(cellLargestContentListNeighbors, reservationSize);
243 size_t nNeighbors = uniqueNeighbors.size();
244 threadMaxNeighbors = std::max(threadMaxNeighbors, nNeighbors);
245 threadLargestContentListNeighbors = std::max(threadLargestContentListNeighbors, cellLargestContentListNeighbors);
249 maxNeighbors = std::max(maxNeighbors, threadMaxNeighbors);
250 largestContentList = std::max(threadLargestContentList, largestContentList);
251 largestContentListNeighbors = std::max(threadLargestContentListNeighbors, largestContentListNeighbors);
264 SESSION_ALLOCATE(
gpuMemoryManager, split::SplitVector<vmesh::GlobalID>*, dev_vbwcl_neigh, maxNeighbors * nCells *
sizeof(split::SplitVector<vmesh::GlobalID>*));
268 size_t largestVelMesh = 0;
271 phiprof::Timer timer {adjustPreId};
272 size_t threadLargestVelMesh = 0;
273 #pragma omp for schedule(dynamic)
274 for (
size_t i=0;
i<nCells; ++
i) {
275 CellID cell_id=cellsToAdjust[
i];
288 threadLargestVelMesh = std::max(threadLargestVelMesh,
vmesh->
size());
297 std::unordered_set<CellID> uniqueNeighbors;
298 for (
const auto& [neighbor_id, dir] : *neighbors) {
299 if (neighbor_id != cell_id) {
300 uniqueNeighbors.insert(neighbor_id);
303 std::vector<CellID> reducedNeighbors;
304 reducedNeighbors.insert(reducedNeighbors.end(), uniqueNeighbors.begin(), uniqueNeighbors.end());
305 const uint nNeighbors = reducedNeighbors.size();
306 for (uint iN = 0; iN < maxNeighbors; ++iN) {
307 if (iN >= nNeighbors) {
311 CellID neighbor_id = reducedNeighbors.at(iN);
335 largestVelMesh = std::max(threadLargestVelMesh, largestVelMesh);
342 phiprof::Timer copyTimer {
"copy values to device"};
344 CHK_ERR(
gpuMemcpyAsync(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*), dev_allMaps),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*), host_allMaps), 2*nCells*
sizeof(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*),
gpuMemcpyHostToDevice, baseStream) );
347 if (maxNeighbors>0) {
356 CHK_ERR(
gpuMemcpyAsync(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), dev_lists_delete),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), host_lists_delete), nCells*
sizeof(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*),
gpuMemcpyHostToDevice, baseStream) );
357 CHK_ERR(
gpuMemcpyAsync(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), dev_lists_to_replace),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), host_lists_to_replace), nCells*
sizeof(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*),
gpuMemcpyHostToDevice, baseStream) );
358 CHK_ERR(
gpuMemcpyAsync(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), dev_lists_with_replace_old),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), host_lists_with_replace_old), nCells*
sizeof(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*),
gpuMemcpyHostToDevice, baseStream) );
367 phiprof::Timer blockHaloTimer {
"Block halo batch kernels"};
370 std::cerr<<
"Error! "<<__FILE__<<
":"<<__LINE__<<
" Halo extent is not 1, unsupported size."<<std::endl;
375 if (largestContentList > 0) {
376 #ifdef USE_BATCH_WARPACCESSORS
381 dim3 grid_vel_halo(largestContentList,nCells,1);
390 dim3 grid_vel_halo((largestContentList + warpsPerBlockBatchHalo - 1)/warpsPerBlockBatchHalo,nCells,1);
391 dim3 block_vel_halo(
GPUTHREADS, warpsPerBlockBatchHalo, 1);
397 warpsPerBlockBatchHalo
404 if (maxNeighbors>0 && largestContentListNeighbors>0) {
406 #ifdef USE_BATCH_WARPACCESSORS
408 const size_t blocksNeeded_neigh = 1 + ((largestContentListNeighbors - 1) / (
WARPSPERBLOCK));
409 dim3 grid_neigh_halo(blocksNeeded_neigh,nCells,maxNeighbors);
413 batch_update_neighbour_halo_kernel<<<grid_neigh_halo, WARPSPERBLOCK*GPUTHREADS, 0, baseStream>>> (
422 dim3 grid_neigh_halo(blocksNeeded_neigh,nCells,maxNeighbors);
424 batch_update_neighbour_halo_kernel<<<grid_neigh_halo, WARPSPERBLOCK*GPUTHREADS, 0, baseStream>>> (
436 blockHaloTimer.stop();
446 check_vector_capacities<<<nCells,1,0,baseStream>>>(
454 bool reUpload =
false;
455 for (
size_t i=0;
i<nCells; ++
i) {
458 CellID cell_id = cellsToAdjust[
i];
485 phiprof::Timer extractKeysTimer {
"extract content keys"};
536 extractKeysTimer.stop();
541 uint largestBlocksToChange = 0;
542 uint largestBlocksBeforeOrAfter = 0;
546 largestBlocksToChange,
547 largestBlocksBeforeOrAfter,
557 phiprof::Timer tombstoneTimer {
"GPU batch clean tombstones"};
558 auto rule_overflown = []
559 __device__(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID> *map,
560 Hashinator::hash_pair<vmesh::GlobalID, vmesh::LocalID>& kval) ->
bool {
563 if (kval.first == emptybucket) {
566 if (kval.first == tombstone) {
570 kval.first = emptybucket;
573 const size_t currentSizePower = map->getSizePower();
574 Hashinator::hash_pair<vmesh::GlobalID, vmesh::LocalID> *bck_ptr = map->expose_bucketdata<
false>();
576 const size_t hashIndex = map->hash(kval.first);
577 const int bitMask = (1 << (currentSizePower)) - 1;
578 const bool isOverflown = (bck_ptr[hashIndex & bitMask].first != kval.first);
593 uint largestOverflow = 0;
596 uint thread_largestOverflow = 0;
597 #pragma omp for schedule(static)
598 for (
size_t i=0;
i<nCells; ++
i) {
603 largestOverflow = std::max(thread_largestOverflow, largestOverflow);
606 if (largestOverflow > 0) {
607 dim3 grid_reinsert(largestOverflow,nCells,1);
608 batch_insert_kernel<<<grid_reinsert, GPUTHREADS, 0, baseStream>>>(
615 tombstoneTimer.stop();
619 #pragma omp for schedule(dynamic)
620 for (
size_t i=0;
i<nCells; ++
i) {
628 phiprof::Timer cleanupTimer {cleanupId};
633 phiprof::Timer postTimer {adjustPostId};
634 #ifdef DEBUG_SPATIAL_CELL
638 #ifdef DEBUG_VLASIATOR
662 && (largestBlocksToChange > 0) ) {
663 phiprof::Timer massConservationTimer {
"GPU batch conserve mass"};
672 dim3 grid_mass_conservation(largestBlocksBeforeOrAfter,nCells,1);
673 batch_population_scale_kernel<<<grid_mass_conservation, WID3, 0, baseStream>>> (
683 const size_t largestSizePower,
687 const size_t largestMapSize = std::pow(2,largestSizePower);
690 size_t blocksNeeded = 1 +
floor(
sqrt(largestMapSize / Hashinator::defaults::MAX_BLOCKSIZE)-1);
691 blocksNeeded = std::max((
size_t)1, blocksNeeded);
692 dim3 grid1(blocksNeeded,nCells,2);
693 batch_reset_all_to_empty<<<grid1, Hashinator::defaults::MAX_BLOCKSIZE, 0, stream>>>(
702 dccrg::Dccrg<spatial_cell::SpatialCell,dccrg::Cartesian_Geometry>& mpiGrid,
703 const vector<CellID>& cellsToAdjust,
705 uint &out_largestBlocksToChange,
706 uint &out_largestBlocksBeforeOrAfter,
710 const uint nCells = cellsToAdjust.size();
717 phiprof::Timer deviceResizeTimer {
"GPU resize mesh on-device"};
737 deviceResizeTimer.stop();
739 phiprof::Timer hostResizeTimer {
"GPU resize mesh from host "};
740 uint largestBlocksToChange = 0;
741 uint largestBlocksBeforeOrAfter = 0;
743 for (
size_t i=0;
i<nCells; ++
i) {
753 largestBlocksToChange = std::max(largestBlocksToChange, nBlocksToChange);
756 const vmesh::LocalID lowBlocks = std::min(nBlocksBeforeAdjust, nBlocksAfterAdjust);
757 largestBlocksBeforeOrAfter = std::max(largestBlocksBeforeOrAfter, lowBlocks);
758 if ( (nBlocksAfterAdjust > nBlocksBeforeAdjust) && (resizeDevSuccess == 0)) {
771 hostResizeTimer.stop();
773 out_largestBlocksToChange = largestBlocksToChange;
774 out_largestBlocksBeforeOrAfter = largestBlocksBeforeOrAfter;
777 if (largestBlocksToChange > 0) {
778 phiprof::Timer addRemoveKernelTimer {
"GPU batch add and remove blocks kernel"};
781 dim3 grid_addremove(largestBlocksToChange,nCells,1);
784 batch_update_velocity_blocks_kernel<<<grid_addremove, WID3, 0, baseStream>>> (
801 for (
size_t i=0;
i<nCells; ++
i) {
808 addRemoveKernelTimer.stop();
811 phiprof::Timer deviceResizePostTimer {
"GPU resize mesh on-device post"};
820 deviceResizePostTimer.stop();
825 Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>** input_maps,
826 split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>> **output_vecs,
829 Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>** rule_maps,
830 split::SplitVector<vmesh::GlobalID>** rule_vectors,
834 auto rule_to_replace = [] __device__(
const Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID> *map,
835 const Hashinator::hash_pair<vmesh::GlobalID, vmesh::LocalID>& kval,
841 return kval.first != emptybucket &&
842 kval.first != tombstone &&
843 kval.first != invalidGID &&
845 kval.second != invalidLID;
863 Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>** input_maps,
864 split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>> **output_vecs,
867 Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>** rule_maps,
868 split::SplitVector<vmesh::GlobalID>** rule_vectors,
872 auto rule_delete_move = [] __device__(
const Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID> *map,
873 const Hashinator::hash_pair<vmesh::GlobalID, vmesh::LocalID>& kval,
879 return kval.first != emptybucket &&
880 kval.first != tombstone &&
881 kval.first != invalidGID &&
883 kval.second != invalidLID;
899 Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>** input_maps,
900 split::SplitVector<vmesh::GlobalID> **output_vecs,
903 Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>** rule_maps,
904 split::SplitVector<vmesh::GlobalID>** rule_vectors,
908 auto rule_add = [] __device__(
const Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID> *map,
909 const Hashinator::hash_pair<vmesh::GlobalID, vmesh::LocalID>& kval,
916 return kval.first != emptybucket &&
917 kval.first != tombstone &&
918 kval.first != invalidGID &&
921 kval.second == invalidLID;
sqrt(1.0+vA *vA/(c *c))) % Ion-acoustic wave cS
#define gpuPeekAtLastError
#define gpuStreamSynchronize
#define gpuMemcpyHostToDevice
#define gpuMemcpyDeviceToHost
#define gpuDeviceSynchronize
__global__ void batch_update_velocity_halo_kernel(const vmesh::VelocityMesh *__restrict__ const *vmeshes, const split::SplitVector< vmesh::GlobalID > *__restrict__ const *velocity_block_with_content_lists, Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **allMaps, const uint warpsPerBlockBatchHalo)
__global__ void batch_resize_vbc_kernel_pre(vmesh::VelocityMesh **vmeshes, vmesh::VelocityBlockContainer **blockContainers, split::SplitVector< vmesh::GlobalID > **dev_list_with_replace_new, split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > **dev_list_delete, split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > **dev_list_to_replace, split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > **dev_list_with_replace_old, vmesh::LocalID *dev_nBefore, vmesh::LocalID *dev_nAfter, vmesh::LocalID *dev_nBlocksToChange, vmesh::LocalID *dev_resizeSuccess, Real *dev_rhoLossAdjust)
__global__ void batch_resize_vbc_kernel_post(vmesh::VelocityMesh **vmeshes, vmesh::VelocityBlockContainer **blockContainers, vmesh::LocalID *dev_nAfter)
void extract_GIDs_kernel_launcher(Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **input_maps, split::SplitVector< ELEMENT > **output_vecs, vmesh::LocalID *output_sizes, Rule rule, vmesh::VelocityMesh **rule_meshes, Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **rule_maps, split::SplitVector< vmesh::GlobalID > **rule_vectors, const uint nCells, gpuStream_t stream)
void clean_tombstones_launcher(vmesh::VelocityMesh **vmeshes, split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > **overflown_elements, vmesh::LocalID *output_sizes, Rule rule, const uint nCells, gpuStream_t stream)
bool checkMesh(const uint popID)
split::SplitVector< vmesh::GlobalID > * dev_velocity_block_with_content_list
void updateSparseMinValue(const uint popID)
vmesh::VelocityMesh * get_velocity_mesh(const size_t &popID)
vmesh::VelocityBlockContainer * get_velocity_blocks(const size_t &popID)
bool checkSizes(const uint popID)
vmesh::LocalID vbwncl_sizePower
Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > * dev_velocity_block_with_no_content_map
void dev_upload_population(const uint popID)
vmesh::LocalID getReservation(const uint popID) const
Real getVelocityBlockMinValue(const uint popID) const
Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > * dev_velocity_block_with_content_map
void increment_mass_loss(cuint popID, Real increment)
split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > * dev_list_to_replace
split::SplitVector< vmesh::GlobalID > * dev_list_with_replace_new
vmesh::LocalID vbwcl_sizePower
void applyReservation(const uint popID)
split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > * dev_list_delete
split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > * dev_list_with_replace_old
vmesh::LocalID velocity_block_with_content_list_size
void setReservation(const uint popID, const vmesh::LocalID reservationsize, bool force=false)
vmesh::VelocityBlockContainer * dev_get_velocity_blocks(const size_t &popID)
vmesh::VelocityMesh * dev_get_velocity_mesh(const size_t &popID)
bool setNewCapacity(const vmesh::LocalID capacity)
ARCH_HOSTDEV bool setNewSize(const vmesh::LocalID newSize)
void setNewCapacity(const vmesh::LocalID &newCapacity)
void setNewCachedSize(const vmesh::LocalID newSize)
void setNewSize(const vmesh::LocalID &newSize)
size_t size(bool dummy=0) const
const vmesh::VelocityMesh *__restrict__ vmesh
__global__ void vmesh::VelocityMesh **__restrict__ ColumnOffsets split::SplitVector< vmesh::GlobalID > Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > const uint *__restrict__ const Realf const int const int const Realf const Realf vmesh::LocalID vmesh::LocalID * dev_overflownElements
__global__ void vmesh::VelocityMesh **__restrict__ ColumnOffsets split::SplitVector< vmesh::GlobalID > Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > const uint *__restrict__ const Realf const int const int const Realf const Realf vmesh::LocalID * dev_resizeSuccess
GPUMemoryManager gpuMemoryManager
__host__ gpuStream_t gpu_getPriorityStream()
__host__ gpuStream_t gpu_getStream()
__host__ void gpu_batch_allocate(uint nCells, uint maxNeighbours)
#define SESSION_HOST_ALLOCATE(object, type, member, bytes)
#define SESSION_ALLOCATE(object, type, member, bytes)
#define GET_SESSION_POINTER(object, type, member)
static const double BLOCK_ALLOCATION_PADDING
#define GET_SESSION_HOST_POINTER(object, type, member)
#define GET_POINTER(object, type, member)
__global__ void const Realf const uint *__restrict__ const uint *__restrict__ const vmesh::GlobalID *__restrict__ const uint const uint const uint const Realf threshold
ObjectWrapper & getObjectWrapper()
void extract_to_delete_or_move_caller(Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **input_maps, split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > **output_vecs, vmesh::LocalID *output_sizes, vmesh::VelocityMesh **rule_meshes, Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **rule_maps, split::SplitVector< vmesh::GlobalID > **rule_vectors, const uint nCells, gpuStream_t stream)
void adjust_velocity_blocks_in_cells(dccrg::Dccrg< spatial_cell::SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, const vector< CellID > &cellsToAdjust, const uint popID)
void update_velocity_block_content_lists(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, const vector< CellID > &cells, const uint popID)
void batch_adjust_blocks_caller(dccrg::Dccrg< spatial_cell::SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, const vector< CellID > &cellsToAdjust, const uint cellOffset, uint &out_largestBlocksToChange, uint &out_largestBlocksBeforeOrAfter, const uint popID)
void extract_to_add_caller(Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **input_maps, split::SplitVector< vmesh::GlobalID > **output_vecs, vmesh::LocalID *output_sizes, vmesh::VelocityMesh **rule_meshes, Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **rule_maps, split::SplitVector< vmesh::GlobalID > **rule_vectors, const uint nCells, gpuStream_t stream)
void clear_maps_caller(const uint nCells, const size_t largestSizePower, gpuStream_t stream, const size_t offset)
void extract_to_replace_caller(Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **input_maps, split::SplitVector< Hashinator::hash_pair< vmesh::GlobalID, vmesh::LocalID > > **output_vecs, vmesh::LocalID *output_sizes, vmesh::VelocityMesh **rule_meshes, Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > **rule_maps, split::SplitVector< vmesh::GlobalID > **rule_vectors, const uint nCells, gpuStream_t stream)
bool startSession(size_t dev_bytes, size_t host_bytes)
std::vector< species::Species > particleSpecies
static ARCH_HOSTDEV VecSimple< T > floor(VecSimple< T > const &a)